제출 #247693

#제출 시각아이디문제언어결과실행 시간메모리
247693super_j6말 (IOI15_horses)C++14
17 / 100
1593 ms74776 KiB
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <functional>
#include <string.h>
#include <set>
using namespace std;
#define endl '\n'
#define ll long long
#define ld long double
#define pi pair<int, int>
#define f first
#define s second

//solution
const int mod = 1000000007;
const int k = 3;
const int rv[k] = {1, 0, 1};
function<int(int, int)> f[k] = {
	[](int x, int y){ return (ll)x * y % mod;},
	[](int x, int y){ return max(x, y);},
	[](int x, int y){ return min((ll)mod, (ll)x * y);}
};

struct segTree{
	int l, r;
	segTree *left, *right;
	int val[k];
	
	segTree(int a, int b){
		l = a, r = b;
		if(l != r){
			int mid = (l + r) / 2;
			left = new segTree(l, mid);
			right = new segTree(mid + 1, r);
		}
		memcpy(val, rv, sizeof(val));
	}
	
	void add(int x, int v, int t){
		if(x < l || r < x) return;
		if(l == r){
			val[t] = v;
			return;
		}
		left->add(x, v, t);
		right->add(x, v, t);
		for(int i = 0; i < k; i++) val[i] = f[i](left->val[i], right->val[i]);
	}
	
	int qry(int a, int b, int t){
		if(b < l || r < a) return rv[t];
		if(a <= l && r <= b) return val[t];
		return f[t](left->qry(a, b, t), right->qry(a, b, t));
	}
};

const int mxn = 500000;
int n;
int *x, *y;
set<int, greater<int>> s;
segTree tre(0, mxn);

void addx(int a, int b){
	if(a){
		if(~-x[a]) s.erase(a);
		if(~-(x[a] = b)) s.insert(a);
	}
	tre.add(a, b, 0), tre.add(a, b, 2);
}

void addy(int a, int b){
	y[a] = b;
	tre.add(a, b, 1);
}

int sol(){
	auto it = ++s.begin();
	for(; it != s.end() && tre.qry(*it, n, 2) != mod; it++);
	ll b = *(--it), ret = 0, cur = 1;
	for(; it != s.begin(); it--){
		ret = max(ret, (ll)tre.qry(b, *it, 0) * tre.qry(*it, *prev(it) - 1, 1));
	}
	return ret % mod * tre.qry(0, b - 1, 0) % mod;
}
//end solution

//interaction
int init(int n, int *X, int *Y){
	x = X, y = Y;
	s.insert(0), s.insert(n);
	for(int i = 0; i < n; i++){
		addx(i, x[i]);
		addy(i, y[i]);
	}
	return sol();
}

int updateX(int a, int b){
	addx(a, b);
	return sol();
}

int updateY(int a, int b){
	addy(a, b);
	return sol();
}
//end interaction
/*
//test
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n, q;
	
	cin >> n;
	int x[n], y[n];
	
	for(int i = 0; i < n; i++) cin >> x[i];
	for(int i = 0; i < n; i++) cin >> y[i];
	
	cout << init(n, x, y) << endl;
	
	cin >> q;
	while(q--){
		int t, a, b;
		cin >> t >> a >> b;
		cout << (!t ? updateX(a, b) : updateY(a, b)) << endl;
	}

	return 0;
}
//end test
*/

컴파일 시 표준 에러 (stderr) 메시지

horses.cpp: In function 'int sol()':
horses.cpp:82:39: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
   ret = max(ret, (ll)tre.qry(b, *it, 0) * tre.qry(*it, *prev(it) - 1, 1));
                                       ^
horses.cpp:84:34: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return ret % mod * tre.qry(0, b - 1, 0) % mod;
                                ~~^~~
horses.cpp:84:42: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return ret % mod * tre.qry(0, b - 1, 0) % mod;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:80:27: warning: unused variable 'cur' [-Wunused-variable]
  ll b = *(--it), ret = 0, cur = 1;
                           ^~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:89:31: warning: declaration of 'n' shadows a global declaration [-Wshadow]
 int init(int n, int *X, int *Y){
                               ^
horses.cpp:59:5: note: shadowed declaration is here
 int n;
     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...