社区讨论
校内OJ直接过了,但洛谷WA,不知道数据哪儿下,求hack
P7353[2020-2021 集训队作业] Tom & Jerry参与者 3已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2pkq8
- 此快照首次捕获于
- 2025/11/03 19:45 4 个月前
- 此快照最后确认于
- 2025/11/03 19:45 4 个月前
WA on 14 22 23 24,都是 No 判为 Yes。
自己对排 n=30,q 拉满都一直没拍出来/yun
代码有点屎
CPP#include<bits/stdc++.h>
using namespace std;
#pragma GCC diagnostic ignored "-Wsign-compare"
namespace estidi{
const int mn=100003;
unordered_set<int>son[mn];
vector<int>sons[mn],te[mn],bcc[mn],rsons[mn];
vector<bool>rcango[mn],can[mn];
stack<int>s;
int n,f[23][mn],d[mn],dcnt,dfn[mn],low[mn],b[mn],bccnt,hd[mn],bccfa[mn],evdf[mn],evdg[mn],evdrg[mn];
bool ish[mn],cap[mn],wk[mn],vis[mn],bccevd[mn],rcf[mn],rcg[mn],rcrg[mn];
void get(int x,int fa){
f[0][x]=fa;
d[x]=d[fa]+1;
s.push(x);
dcnt++;
dfn[x]=dcnt;
low[x]=dcnt;
cap[x]=0;
for(int i=0;i<sons[x].size();i++){
if(dfn[sons[x][i]])
low[x]=min(low[x],dfn[sons[x][i]]);
else{
te[x].push_back(sons[x][i]);
get(sons[x][i],x);
low[x]=min(low[x],low[sons[x][i]]);
if(dfn[x]==low[sons[x][i]]){
bccnt++;
while(s.top()!=sons[x][i]){
bcc[bccnt].push_back(s.top());
b[s.top()]=bccnt;
s.pop();
}
bcc[bccnt].push_back(s.top());
b[s.top()]=bccnt;
s.pop();
bcc[bccnt].push_back(x);
hd[bccnt]=x;
ish[x]=1;
}
}
}
}
void getbccst(int i){
if(bcc[i].size()<=sqrt(n)){
for(int j=0;j<bcc[i].size();j++){
cap[bcc[i][j]]=1;
for(int k=0;k<bcc[i].size();k++)
cap[bcc[i][j]]&=(bcc[i][j]==bcc[i][k]||son[bcc[i][j]].find(bcc[i][k])!=son[bcc[i][j]].end());
// cerr<<bcc[i][j]<<":"<<cap[bcc[i][j]]<<endl;
}
bccevd[i]=1;
for(int j=0;j<bcc[i].size();j++)
bccevd[i]&=(!cap[bcc[i][j]]);
return;
}
for(int j=0;j<bcc[i].size();j++)
wk[bcc[i][j]]=1;
for(int j=0;j<bcc[i].size();j++){
int now=bcc[i].size()-1;
for(int k=0;k<sons[bcc[i][j]].size();k++)
if(wk[sons[bcc[i][j]][k]]&&vis[sons[bcc[i][j]][k]]==0){
vis[sons[bcc[i][j]][k]]=1;
now--;
}
if(!now)
cap[bcc[i][j]]=1;
else
cap[bcc[i][j]]=0;
for(int k=0;k<sons[bcc[i][j]].size();k++)
vis[sons[bcc[i][j]][k]]=0;
}
bccevd[i]=1;
for(int j=0;j<bcc[i].size();j++){
wk[bcc[i][j]]=0;
bccevd[i]&=(!cap[bcc[i][j]]);
}
}
void build(int x){
bool fst=(!cap[x]);
for(int i=0;i<te[x].size();i++){
if(b[x]!=b[te[x][i]]){
bccfa[b[te[x][i]]]=b[x];
rsons[b[x]].push_back(b[te[x][i]]);
rsons[b[te[x][i]]].push_back(b[x]);
getbccst(b[te[x][i]]);
rcango[b[x]].push_back(!cap[x]);
rcango[b[te[x][i]]].push_back(fst);
can[b[x]].push_back(fst);
can[b[te[x][i]]].push_back(!cap[x]);
}
build(te[x][i]);
}
}
void getans(int x,int fa){
rcf[x]=false;
evdf[x]=bccevd[x]*2;
for(int i=0;i<rsons[x].size();i++){
if(rsons[x][i]==fa){
if(can[x][i]){
rcf[x]=true;
if(evdf[x]==0)
evdf[x]=1;
}
continue;
}
getans(rsons[x][i],x);
rcf[x]|=(rcf[rsons[x][i]]||rcango[x][i]);
if(evdf[x]==2)
continue;
if(evdf[rsons[x][i]]==2)
evdf[x]=2;
if(evdf[x]==1&&(evdf[rsons[x][i]]==1||rcango[x][i]))
evdf[x]=2;
if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
evdf[x]=2;
if(evdf[x]==2)
continue;
if(evdf[rsons[x][i]]==1||rcango[x][i])
evdf[x]=1;
}
}
void getdans(int x,int fa){
int now=0,pre=0,nowst=0;
vector<int>sufevdfm;
for(int i=0;i<=rsons[x].size();i++)
sufevdfm.push_back(0);
for(int i=rsons[x].size()-1;i>=0;i--){
if(rsons[x][i]==fa){
sufevdfm[i]=nowst;
continue;
}
now+=rcf[rsons[x][i]];
if(evdf[rsons[x][i]]==2)
nowst=2;
if(nowst==1&&(evdf[rsons[x][i]]==1||rcango[x][i]))
nowst=2;
if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
nowst=2;
if(nowst!=2&&(evdf[rsons[x][i]]==1||rcango[x][i]))
nowst=1;
sufevdfm[i]=nowst;
}
nowst=0;
for(int i=0;i<rsons[x].size();i++){
if(rsons[x][i]==fa)
continue;
now-=rcf[rsons[x][i]];
// cerr<<x<<" "<<rcg[x]<<" "<<now<<" "<<pre<<" "<<can[x][i]<<endl;
rcrg[rsons[x][i]]=rcg[x]||now||pre;
rcg[rsons[x][i]]=rcrg[rsons[x][i]]||can[x][i];
evdrg[rsons[x][i]]=min(2,sufevdfm[i+1]+nowst+evdg[x]);
evdg[rsons[x][i]]=evdrg[rsons[x][i]];
if(bccevd[rsons[x][i]]||(evdrg[rsons[x][i]]==1&&rcango[x][i]))
evdg[rsons[x][i]]=2;
getdans(rsons[x][i],x);
pre+=rcf[rsons[x][i]];
if(evdf[rsons[x][i]]==2)
nowst=2;
if(nowst==1&&nowst==1)
nowst=2;
if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
nowst=2;
if(nowst!=2&&(evdf[rsons[x][i]]==1||rcango[x][i]))
nowst=1;
}
}
bool tryloop(int x,int fa,int bl){
for(int i=0;i<rsons[x].size();i++){
int tg=hd[rsons[x][i]];
if(rsons[x][i]==bccfa[x])
tg=hd[x];
if(rsons[x][i]==fa||tg==bl)
continue;
if(rcango[x][i]||tryloop(rsons[x][i],x,bl))
return true;
}
return false;
}
int getevd(int x,int fa,int bl){
if(bccevd[x])
return 2;
int nowst=0;
for(int i=0;i<rsons[x].size();i++){
int tg=hd[rsons[x][i]];
if(rsons[x][i]==bccfa[x])
tg=hd[x];
if(rsons[x][i]==fa||tg==bl)
continue;
int st=getevd(rsons[x][i],x,bl);
// cerr<<x<<" "<<fa<<" "<<rcango[x][i]<<" "<<can[x][i]<<endl;
if(st==2)
return 2;
if((st==1||rcango[x][i])&&nowst==1)
return 2;
if((st==1||rcango[x][i])&&can[x][i])
return 2;
if(st==1||rcango[x][i])
nowst=1;
}
return nowst;
}
int kfa(int x,int k){
for(int i=17;i>=0;i--)
if(k&(1<<i))
x=f[i][x];
return x;
}
int lca(int x,int y){
if(d[x]>d[y])
swap(x,y);
y=kfa(y,d[y]-d[x]);
if(x==y)
return x;
for(int i=17;i>=0;i--)
if(f[i][x]!=f[i][y]){
x=f[i][x];
y=f[i][y];
}
return f[0][x];
}
int main(){
int m,q,x,y;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
son[x].insert(y);
son[y].insert(x);
sons[x].push_back(y);
sons[y].push_back(x);
}
get(1,0);
assert(s.size()==1);
// cerr<<"asd";
for(int i=1;i<=17;i++)
for(int j=1;j<=n;j++)
f[i][j]=f[i-1][f[i-1][j]];
// cerr<<"asd";
cap[1]=1;
// for(int i=1;i<=n;i++)
// cerr<<i<<" "<<b[i]<<" "<<ish[i]<<endl;
// cerr<<"asd";
build(1);
// for(int i=0;i<=bccnt;i++)
// cerr<<i<<" "<<bccevd[i]<<endl;
// cerr<<"asd";
getans(0,-1);
// cerr<<"asd";
getdans(0,-1);
// cerr<<"asd";
int gans=getevd(0,-1,-1);
// cerr<<"asd";
// for(int i=0;i<=bccnt;i++)
// for(int j=0;j<rsons[i].size();j++)
// cerr<<i<<" "<<rsons[i][j]<<" "<<can[i][j]<<" "<<rcango[i][j]<<endl;
// for(int i=1;i<=bccnt;i++)
// cerr<<i<<" "<<rsons[i].size()<<"|"<<tryloop(1,-1,hd[i])<<" "<<getevd(1,-1,hd[i])<<" "<<rcrg[i]<<" "<<evdrg[i]<<endl;
while(q--){
scanf("%d%d",&x,&y);
swap(x,y);
int nowans=0;
if(ish[y]){
// cerr<<x<<" "<<y<<" "<<lca(x,y)<<" "<<b[y]<<"\t\t "<<tryloop(b[x],-1,y)<<" "<<getevd(b[x],-1,y)<<" "<<(lca(x,y)==y&&b[x]!=b[y]?rcf[b[kfa(x,d[x]-d[y]-1)]]:rcg[b[y]])<<" "<<(lca(x,y)==y&&b[x]!=b[y]?evdf[b[kfa(x,d[x]-d[y]-1)]]:evdg[b[y]])<<endl;
if(lca(x,y)==y&&b[x]!=b[y])
if(rcf[b[kfa(x,d[x]-d[y]-1)]])
nowans=gans;
else
nowans=evdf[b[kfa(x,d[x]-d[y]-1)]];
else
if(rcg[b[y]])
nowans=gans;
else
nowans=evdg[b[y]];
}
else
nowans=gans;
if(nowans==2)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
}
int main(){
// freopen("soldier.in","r",stdin);
// freopen("soldier.out","w",stdout);
estidi::main();
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...