社区讨论
CCF 直言到:CCF 这样造数据,怕是连脸都不要了。
P11230[CSP-J 2024] 接龙参与者 10已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @m3wh2xxz
- 此快照首次捕获于
- 2024/11/25 11:32 去年
- 此快照最后确认于
- 2025/11/04 13:57 4 个月前
不好评价。 过 。
这是我一开始写的代码。
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);
}
}
}
显然是 级别的。但是他还是通过了CCF的全部数据。(还没加优化,加了读入优化会更快)。
回复
共 10 条回复,欢迎继续交流。
正在加载回复...