社区讨论

CCF 直言到:CCF 这样造数据,怕是连脸都不要了。

P11230[CSP-J 2024] 接龙参与者 10已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@m3wh2xxz
此快照首次捕获于
2024/11/25 11:32
去年
此快照最后确认于
2025/11/04 13:57
4 个月前
查看原帖
不好评价。n2n^2100000100000
这是我一开始写的代码。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N =2e5+5000;
struct node{
	int c,id;
};
vector<node> Q[N];
vector<int> g[N];
bool vis[N];
int Ans[N],L[N],L1[N],R1[N],New[N],R[N],n,k,q,tot,Dus[N];
void Slove(int now){
	for(int i=1;i<=200000;i++)	L1[i]=0,R1[i]=n+1;
	for(int i=1;i<=n;i++){
			int idL=0,idR=1,predus=0;
			if((1<=i&&i<=L[g[i][0]])||(R[g[i][0]]<=i&&i<=n))	predus++;
			while(idR<g[i].size()){
				while((idR-idL+1)>k){
					if((1<=i&&i<=L[g[i][idL]])||(R[g[i][idL]]<=i&&i<=n))	predus--;
					idL++;
				}
				int num=g[i][idR];
				if(predus>0)
					L1[g[i][idR]]=max(L1[g[i][idR]],i-1),R1[g[i][idR]]=min(R1[g[i][idR]],i+1);
				if((1<=i&&i<=L[num])||(R[num]<=i&&i<=n))	predus++;
				idR++;
			}
	}
	
	
	for(int i=1;i<=200000;i++)		L[i]=L1[i],R[i]=R1[i];
	
	
	for(int i=0;i<Q[now].size();i++){
		int Q1=Q[now][i].c;
//		if(Q1==7)	cout<<"YES"<<endl;
		if((L[Q1]>=1||R[Q1]<=n)&&Q1!=0)	Ans[Q[now][i].id]=true;
		else	Ans[Q[now][i].id]=false;
	}
}
void Clear(){
	tot=0;
	for(int i=1;i<=100000;i++)	Ans[i]=0;
	for(int i=1;i<=101;i++)	Q[i].clear();
	for(int i=1;i<=200000;i++)	New[i]=vis[i]=false;
	for(int i=1;i<=200000;i++){
		g[i].clear();
	}
}
int main(){
//	freopen("chain6.in","r",stdin);
//	freopen("ans.out","w",stdout);
	int T;
	cin>>T;
//	T=1;
	while(T--){
		cin>>n>>k>>q;
		for(int i=1,l;i<=n;i++){
			cin>>l;
			for(int j=1,x;j<=l;j++){
				cin>>x,g[i].push_back(x);
				if(!vis[x])	vis[x]=true,Dus[++tot]=x;	
			}
		}
		sort(Dus+1,Dus+tot+1);
		for(int i=1;i<=tot;i++)	New[Dus[i]]=i;
		for(int i=1;i<=n;i++){
			for(int j=0;j<g[i].size();j++)
				g[i][j]=New[g[i][j]];
		}
		
		// check 1 
		
		for(int i=1;i<=200000;i++)	L[i]=0,R[i]=n+1;
		
		for(int i=1;i<=n;i++){
			for(int j=0;j<g[i].size();j++){
				if(g[i][j]!=1)	continue;
				for(int K=2;K<=k&&j+K-1<g[i].size();K++){
					int l=j,r=j+K-1;
					L[g[i][r]]=max(L[g[i][r]],i-1);
					R[g[i][r]]=min(R[g[i][r]],i+1);
				}
			}	
		}
		
		
		for(int i=1,x,y;i<=q;i++){
			cin>>x>>y;
			Q[x].push_back({New[y],i});
		}
		
		for(int i=0;i<Q[1].size();i++){
			int Q1=Q[1][i].c;
			if((L[Q1]>=1||R[Q1]<=n)&&Q1!=0)	Ans[Q[1][i].id]=true;
			else	Ans[Q[1][i].id]=false;
		}
		

		
		for(int i=2;i<=100;i++)	Slove(i);
		
		for(int i=1;i<=q;i++)	cout<<Ans[i]<<endl;
		
		Clear();
	}
	return 0;
} 
/*
  G[i][j] Kaolv dao person i, lst is (j) T/F?
  
  G[i] lst is (i) T/F
1
2 6 1
16 1 150009 183489 171982 50184 1 58293 48879 1 1 98813 1 16668 98813 1 150009
2 98813 1
4 150009


1 7 9 8 4 1 5 3 1 1 6 1 2 6 1 7
6 1

*/

注意到
CPP
	for(int i=1;i<=n;i++){
			for(int j=0;j<g[i].size();j++){
				if(g[i][j]!=1)	continue;
				for(int K=2;K<=k&&j+K-1<g[i].size();K++){
					int l=j,r=j+K-1;
					L[g[i][r]]=max(L[g[i][r]],i-1);
					R[g[i][r]]=min(R[g[i][r]],i+1);
				}
			}	
		}
显然是 n2n^2 级别的。但是他还是通过了CCF的全部数据。(还没加优化,加了读入优化会更快)。

回复

10 条回复,欢迎继续交流。

正在加载回复...