結果

問題 No.2935 Division Into 3 (Mex Edition)
ユーザー nouka28nouka28
提出日時 2024-09-27 03:11:00
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 733 ms / 5,000 ms
コード長 1,878 bytes
コンパイル時間 3,426 ms
コンパイル使用メモリ 253,912 KB
実行使用メモリ 58,372 KB
最終ジャッジ日時 2024-09-27 04:47:39
合計ジャッジ時間 17,257 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 106 ms
40,544 KB
testcase_01 AC 122 ms
40,540 KB
testcase_02 AC 108 ms
40,540 KB
testcase_03 AC 474 ms
51,012 KB
testcase_04 AC 701 ms
57,656 KB
testcase_05 AC 733 ms
58,272 KB
testcase_06 AC 718 ms
58,372 KB
testcase_07 AC 575 ms
53,800 KB
testcase_08 AC 536 ms
55,108 KB
testcase_09 AC 614 ms
58,020 KB
testcase_10 AC 606 ms
57,856 KB
testcase_11 AC 414 ms
57,948 KB
testcase_12 AC 520 ms
50,360 KB
testcase_13 AC 572 ms
46,960 KB
testcase_14 AC 614 ms
57,504 KB
testcase_15 AC 578 ms
50,760 KB
testcase_16 AC 494 ms
47,992 KB
testcase_17 AC 646 ms
56,088 KB
testcase_18 AC 674 ms
56,088 KB
testcase_19 AC 499 ms
47,872 KB
testcase_20 AC 567 ms
49,772 KB
testcase_21 AC 413 ms
48,716 KB
testcase_22 AC 581 ms
49,776 KB
testcase_23 AC 554 ms
49,900 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;

vector<pair<int,int>> dp[3][400009];

int main(){
	cin.tie(nullptr);
	ios_base::sync_with_stdio(false);

	int n;cin>>n;
	vector<int> a(n);for(auto&&e:a)cin>>e;

	vector<int> P;for(int i=0;i<n;i++)P.push_back(i);

	auto build=[&](auto build,int l,int r,int k,vector<int>&idx)->void {
		for(int C=1;C<=3;C++){
			int R=0,now=0;
			vector<int> cnt(r-l);

			for(int i=0;i<idx.size();i++){
				assert(i<=R);

				while(R<idx.size()&&now<r-l){
					cnt[a[idx[R]]-l]++;
					if(cnt[a[idx[R]]-l]==C){
						now++;
					}
					R++;
				}

				if(now==r-l){
					dp[C-1][k].push_back({idx[i],idx[R-1]});
				}

				if(cnt[a[idx[i]]-l]==C){
					now--;
				}

				cnt[a[idx[i]]-l]--;
			}

			dp[C-1][k].push_back({1e9,1e9});
		}

		if(r-l==1)return;

		vector<int> idxL,idxR;
		int mid=(l+r)/2;

		for(auto&&e:idx){
			if(a[e]<mid)idxL.push_back(e);
			else idxR.push_back(e);
		}

		build(build,l,mid,2*k+1,idxL);
		build(build,mid,r,2*k+2,idxR);
	};

	build(build,0,100001,0,P);

	int q;cin>>q;

	int res_prev=0;

	while(q--){
		int x,y;cin>>x>>y;

		int L=x^res_prev,R=y^res_prev;

		// cout<<"L R : "<<L<<" "<<R<<endl;

		L--;

		assert(0<=L&&R-L>=2&&R<=n);

		auto search=[&](auto search,int l,int r,int k,int C)->int {
			pair<int,int> p={L,0};

			auto it=lower_bound(dp[C-1][k].begin(),dp[C-1][k].end(),p);

			if(it->second<R){
				return r;
			}

			if(r-l==1){
				return l;
			}

			int mid=(l+r)/2;

			int res=search(search,l,mid,2*k+1,C);

			if(res<mid)return res;
			else return search(search,mid,r,2*k+2,C);
		};

		array<int,3> v;

		for(int C=1;C<=3;C++){
			v[C-1]=search(search,0,100001,0,C);
		}

		int res=0;

		if(v[2]){
			res=v[0]+v[1]+v[2];
		}else if(v[1]){
			res=v[0]+v[1]+min(0,R-L-v[0]-v[1]-1);
		}else if(v[0]){
			res=v[0]+min(0,R-L-v[0]-2);
		}else{
			res=0;
		}

		cout<<res<<endl;

		res_prev=res;
	}
}
0