Submission #1225744

#TimeUsernameProblemLanguageResultExecution timeMemory
1225744_rain_Long Mansion (JOI17_long_mansion)C++20
25 / 100
509 ms40036 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)5e5;
	int x[N+2],y[N+2],c[N+2],b[N+2];
	vector<int>arr[N+2];
	int n,q;
	
namespace subtask1{
	bool check(){
		return n<=5000;
	}
	
	const int LIMIT=5000;
	bool f[LIMIT+2][LIMIT+2];
	bool cnt[N+2]={};
	
	void main_code(){
		for(int i =1;i<=n;++i){
			for(int j=0;j<=n;++j) cnt[j]=false;
			int l=i,r=i;
			bool nxt=true;
			for(auto&x:arr[i]) cnt[x]=true;
			while (nxt){
				nxt=false;
				while (r<n && cnt[c[r]]){
					for(auto&x:arr[r+1]) cnt[x]=true;
					f[i][r+1]=true;
					nxt=true;
					++r;
				}
				while (l>1 && cnt[c[l-1]]){
					for(auto&x:arr[l-1]) cnt[x]=true;
					f[i][l-1]=true;
					nxt=true;
					--l;	
				}
			}
		}
		for(int i=1;i<=q;++i){
			cout<<(f[x[i]][y[i]]?"YES":"NO")<<'\n';
		}
	}
}

namespace subtask2{
	bool check(){
		return *max_element(c+1,c+n+1)<=20;
	}
	
	const int MAXLOG=20;
	
	int pre[N+2][MAXLOG+2]={};
	int cur[N+2][MAXLOG+2]={};
	int lef[N+2],rig[N+2];
	
	bool possible(int mask,int l,int r){
		for(int j=0;j<MAXLOG;++j){
			if (pre[r][j]-pre[l-1][j]>0){
				if ((mask>>j)&1) continue;
				return false;
			}
		}
		return true;
	}
	
	int lefmost(int mask,int id){
		int low=1,high=id-1,pos=id;
		while (low<=high){
			int mid=(low+high)/2;
			if (possible(mask,mid,id-1)) pos=mid,high=mid-1;
			else low=mid+1;
		}
		return pos;
	}
	int rigmost(int mask,int id){
		int low=id,high=n-1,pos=id-1;
		while (low<=high){
			int mid=(low+high)/2;
			if (possible(mask,id,mid)) pos=mid,low=mid+1; 
				else high=mid-1;
		}
		return pos+1;
	}
	
	void main_code(){
		for(int i=1;i<n;++i) {
			for(int j=0;j<MAXLOG;++j) pre[i][j]=pre[i-1][j];
			pre[i][c[i]-1]++;
		}
		for(int i=1;i<=n;++i){
			for(int j=0;j<MAXLOG;++j) cur[i][j]=cur[i-1][j];
			for(auto&x:arr[i]) cur[i][x-1]++;
		}
		for(int i=1;i<=n;++i){
			bool nxt=true;
			int curmask=0;
			for(auto&x:arr[i]) curmask|=(1<<(x-1));
			int l=i,r=i;
			while (nxt){
				nxt=false;
				int nxt_l=lefmost(curmask,l);
				if (l>1 && nxt_l!=l){
					nxt=true;
					for(int j=0;j<MAXLOG;++j){
						if (cur[l][j]-cur[nxt_l-1][j]>0) curmask|=(1<<j);
					}
					l=nxt_l;
				}
				int nxt_r=rigmost(curmask,r);
				if (r<n && nxt_r!=r){
					nxt=true;
					for(int j=0;j<MAXLOG;++j){
						if (cur[nxt_r][j]-cur[r-1][j]>0) curmask|=(1<<j);
					}
					r=nxt_r;
				}

			}
			lef[i]=l,rig[i]=r;
		}
		for(int i=1;i<=q;++i){
			bool ok=(lef[x[i]] <= y[i] && y[i]<=rig[x[i]]);
			cout<<(ok?"YES":"NO")<<'\n';
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	#define task "main"
	if (fopen(task".inp","r")){
		freopen(task".inp","r",stdin);
		freopen(task".out","w",stdout);
	}
	
	cin>>n;
	for(int i=1;i<n;++i) cin>>c[i];
	for(int i=1;i<=n;++i){
		cin>>b[i];
		arr[i].resize(b[i]);
		for(auto&x:arr[i]) cin>>x;
	}
	cin>>q;
	for(int i=1;i<=q;++i) cin>>x[i]>>y[i];
	if (subtask1::check()) {
		return subtask1::main_code(),0;
	}
	if (subtask2::check()){
		return subtask2::main_code(),0;
	}
	assert(false);
	return 0;
}

Compilation message (stderr)

long_mansion.cpp: In function 'int main()':
long_mansion.cpp:135:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
long_mansion.cpp:136:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...