Submission #65771

#TimeUsernameProblemLanguageResultExecution timeMemory
65771Hoget157Horses (IOI15_horses)C++14
100 / 100
509 ms52836 KiB
#include <bits/stdc++.h>
#define ll long long
#define MOD 1000000007
using namespace std;

ll n;

class RMQ{
	ll seg,ini;
	vector<ll> dat;
	function<ll(ll,ll)> f;
	public:
	RMQ() : seg(1){}
	void init(ll def,function<ll(ll,ll)> F){
		ini = def;
		f = F;
		while(seg < n) seg *= 2;
		dat.resize(seg * 2 - 1);
		for(ll i = 0;i < seg * 2 - 1;i++) dat[i] = ini;
	}
	void update(ll i,ll x){
		i += seg - 1;
		dat[i] = x;
		while(i){
			i = (i - 1) / 2;
			dat[i] = f(dat[i * 2 + 1],dat[i * 2 + 2]);
		}
	}
	ll get(ll a){
		return dat[a + seg - 1];
	}
	ll get(ll a,ll b){
		ll ans = ini,pos = seg;
		while(a != b){
			if(a % 2) ans = f(ans,dat[pos - 1 + a++]);
			if(b % 2) ans = f(ans,dat[pos - 1 + --b]);
			pos /= 2;
			a /= 2;
			b /= 2;
		}
		return ans;
	}
	ll find(ll a,ll b,bool isl){
		ll pos = seg,ans = 1000000000;
		if(b == -1) b = seg;
		while(a != b){
			if(a % 2 && dat[pos - 1 + a++] != 1) break;
			if(b % 2 && dat[pos - 1 + --b] != 1) break;
			pos /= 2;
			a /= 2;
			b /= 2;
		}
		if(isl){
			pos += a - 2;
			while(pos < seg - 1){
				if(dat[pos * 2 + 1] != 1) pos = pos * 2 + 1;
				else pos = pos * 2 + 2;
			}
		}else{
			pos += b - 1;
			while(pos < seg - 1){
				if(dat[pos * 2 + 2] != 1) pos = pos * 2 + 2;
				else pos = pos * 2 + 1;
			}
		}
		return pos - seg + 1;
	}
};

RMQ rmq1,rmq2,seki;

ll calc(){
	ll pos = n - 1,tmp = 1,ma = 0,ans;
	while(pos > 0){
		pos = rmq1.find(0,pos,false);
		ll t = rmq1.get(pos);
		if(tmp * t > 1000000000ll) break;
		tmp *= t;
	}
	ans = seki.get(0,pos + 1);
	tmp = 1;
	while(pos < n - 1){
		ll nxt = rmq1.find(pos + 1,-1,true);
		ma = max(ma,tmp * rmq2.get(pos,nxt));
		tmp *= rmq1.get(nxt);
		pos = nxt;
	}
	return ma % MOD * ans % MOD;
}

ll init(int N,int x[],int y[]){
	n = N + 2;
	rmq1.init(0,[](ll a,ll b){ return max(a,b); });
	rmq2.init(0,[](ll a,ll b){ return max(a,b); });
	seki.init(1,[](ll a,ll b){ return a * b % MOD; });
	rmq1.update(0,MOD);
	rmq1.update(n - 1,MOD);
	for(ll i = 0;i < n - 2;i++){
		rmq1.update(i + 1,x[i]);
		rmq2.update(i + 1,y[i]);
		seki.update(i + 1,x[i]);
	}
	return calc();
}

ll updateX(int pos,int val){
	rmq1.update(pos + 1,val);
	seki.update(pos + 1,val);
	return calc();
}

ll updateY(int pos,int val){
	rmq2.update(pos + 1,val);
	return calc();
}

/*signed main(){
	int N,m,x[500010],y[500010];
	cin >> N;
	for(int i = 0;i < N;i++) cin >> x[i];
	for(int i = 0;i < N;i++) cin >> y[i];
	cin >> m;
	cout << init(N,x,y) << endl;
	for(int i = 0;i < m;i++){
		int a,b,c;
		cin >> a >> b >> c;
		if(a == 1) cout << updateX(b,c) << endl;
		else cout << updateY(b,c) << endl;
	}
	return 0;
}*/

Compilation message (stderr)

horses.cpp: In member function 'long long int RMQ::find(long long int, long long int, bool)':
horses.cpp:44:16: warning: unused variable 'ans' [-Wunused-variable]
   ll pos = seg,ans = 1000000000;
                ^~~
#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...