QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#723060 | #9449. New School Term | jimmyywang | TL | 0ms | 0kb | C++14 | 3.4kb | 2024-11-07 21:04:38 | 2024-11-07 21:04:38 |
answer
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define f(i,a,b) for(ll i=a;i<=b;i++)
ll read(){
ll x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
#define d read()
ll n,m;
ll fa[1000010],x[1000010],y[1000010],de[1000010];
ll find(ll x){if(fa[x]==x)return x;return find(fa[x]);}
ll U[1000010],V[1000010];
#define pb push_back
bitset<10010>dp;
ll num[100010];
vector<ll>e;
bool eq[10010];
bool ch(){
ll s=0;dp.reset();dp[0]=1;e.clear();
f(i,1,2*n){ll t;
if(eq[i])t=i;
else if(eq[i+2*n])t=i+2*n;
else continue;
s+=min(x[t],y[t]);
if(x[t]==y[t])continue;
num[abs(x[t]-y[t])]++;
if(num[abs(x[t]-y[t])]==1)e.pb(abs(x[t]-y[t]));
}
for(int i=0;i<e.size();i++){
ll t=e[i];ll o=1;
while(o<=num[t]){
dp|=dp<<(o*t);num[t]-=o;
o*=2;
}if(num[t])dp|=dp<<(num[t]*t);
num[t]=0;
}
return dp[n-s];
}
ll is[1000010];
bool in[1000010];
ll pre[1000010];
ll deg[100010];
map<pair<ll,ll>,bool>mp;
int main(){
n=d,m=d;
f(i,1,2*n)fa[i]=i,x[i]=1,eq[i]=1;
f(i,2*n+1,4*n)fa[i]=i,y[i]=1,eq[i]=1;
f(i,1,m){
// U[i]=rand()%(2*n)+1,V[i]=rand()%(2*n)+1;
// while(U[i]==V[i])V[i]=rand()%(2*n)+1;
// mp[U[i]][V[i]]=1,mp[V[i]][U[i]]=1;
// cout<<U[i]<<" "<<V[i]<<endl;
U[i]=d,V[i]=d;
}
for(int i=m;i>=1;i--){
ll u=U[i],v=V[i];
// if(mp[{u,v}])continue;
// mp[{u,v}]=1,mp[{v,u}]=1;
if(find(u)==find(v)||find(u)==find(v+2*n)||deg[u]==n||deg[v]==n)continue;
ll fu=find(u),fv=find(v),fuu=find(u+2*n),fvv=find(v+2*n);
ll oux=x[fu],ouy=y[fu],ovx=x[fv],ovy=y[fv],oude=de[fu],ovde=de[fv];
ll ouux=x[fuu],ouuy=y[fuu],ovvx=x[fvv],ovvy=y[fvv],ouude=de[fuu],ovvde=de[fvv];
ll oueq=eq[fu],oveq=eq[fv],ouueq=eq[fuu],ovveq=eq[fvv];
ll ou=fa[u],ov=fa[v],ouu=fa[u+2*n],ovv=fa[v+2*n];
ll uu=fuu,vv=fvv;u=fu,v=fv;
if(de[uu]>de[v])swap(uu,v);
fa[uu]=v,x[v]=x[uu]+x[v],y[v]=y[uu]+y[v],de[v]=max(de[v],de[uu]+1);eq[uu]=0;
if(de[u]>de[vv])swap(u,vv);
fa[u]=vv,x[vv]=x[u]+x[vv],y[vv]=y[u]+y[vv],de[vv]=max(de[vv],de[u]+1);eq[u]=0;
if(ch()){deg[u]++,deg[v]++;
// e[U[i]].pb(V[i]);
// e[V[i]].pb(U[i]);
// cout<<U[i]<<" "<<V[i]<<endl;
continue;
}
x[fu]=oux,y[fu]=ouy,x[fv]=ovx,y[fv]=ovy;
x[fuu]=ouux,y[fuu]=ouuy,x[fvv]=ovvx,y[fvv]=ovvy;
fa[u]=ou,fa[v]=ov,fa[u+2*n]=ouu,fa[v+2*n]=ovv;
de[fu]=oude,de[fv]=ovde,de[fuu]=ouude,de[fvv]=ovvde;
eq[fu]=oueq,eq[fv]=oveq,eq[fuu]=ouueq,eq[fvv]=ovveq;
}
// return 0;
// puts("111");
ll s=0;in[0]=1;
f(i,1,2*n){ll t;
if(find(i)==i)t=i;
else if(find(i+2*n)==i+2*n)t=i+2*n;
else continue;
s+=min(x[t],y[t]);ll q=abs(x[t]-y[t]);
for(int j=n-q;j>=0;j--)if(!in[j+q]&&in[j]){
in[j+q]=1;pre[j+q]=t;
}if(x[t]<=y[t])is[t]=1;else is[t]=2;
}s=n-s;
// puts("222");
while(1){
ll p=pre[s];is[p]=3-is[p];
s-=abs(x[p]-y[p]);
if(s<=0)break;
}
// puts("333");
f(i,1,2*n){
if(is[find(i)]==1||is[find(i+2*n)]==2)cout<<0;
else cout<<1;
}
return 0;
}
/*
2 4
2 4
4 2
1 2
2 3
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
2 4 1 3 2 4 1 4 1 2