QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#641330 | #9449. New School Term | Wuyanru | WA | 1ms | 6120kb | C++14 | 3.0kb | 2024-10-14 19:54:10 | 2024-10-14 19:54:10 |
Judging History
answer
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3fll
#define debug(x) cerr<<#x<<"="<<x<<endl
using namespace std;
using ll=long long;
using ld=long double;
using pli=pair<ll,int>;
using pi=pair<int,int>;
template<typename A>
using vc=vector<A>;
inline int read()
{
int s=0,w=1;char ch;
while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline ll lread()
{
ll s=0,w=1;char ch;
while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const ll mod=114514191981011453ll;
ll dp[10001];
ll fp[10001];
ll tp[10001];
int siz[20001];
int fa[20001];
int x[1000001];
int y[1000001];
int n,m;
inline void Add(ll &a,ll b)
{
a+=b;
if(a>=mod) a-=mod;
}
inline void run(ll *dp,ll *fp,int x,int y)
{
memset(fp,0,sizeof(ll)*(n+1));
for(int i=0;i<=n;i++)
{
if(i>=x) Add(fp[i],dp[i-x]);
if(i>=y) Add(fp[i],dp[i-y]);
}
// printf("run %d %d\n",x,y);
// for(int i=0;i<=n;i++) printf("%lld%c",dp[i]," \n"[i==n]);
// for(int i=0;i<=n;i++) printf("%lld%c",fp[i]," \n"[i==n]);
}
inline void unr(ll *dp,ll *fp,int x,int y)
{
memset(dp,0,sizeof(ll)*(2*n+1));
if(x>y) swap(x,y);
if(x==y)
{
for(int i=n;i>=x;i--)
{
if(fp[i]&1) dp[i-x]=(fp[i]+mod)/2;
else dp[i-x]=fp[i]/2;
}
}
else
{
for(int i=n;i>=y;i--)
{
ll val=fp[i];
Add(val,mod-dp[i-x]);
dp[i-y]=val;
}
}
// printf("unr %d %d\n",x,y);
// for(int i=0;i<=n;i++) printf("%lld%c",fp[i]," \n"[i==n]);
// for(int i=0;i<=n;i++) printf("%lld%c",dp[i]," \n"[i==n]);
}
inline int find(int num)
{
if(fa[num]==num) return num;
return fa[num]=find(fa[num]);
}
inline void merge(int x,int y)
{
x=find(x),y=find(y);
fa[x]=y,siz[y]+=siz[x];
}
inline void output()
{
for(int i=1;i<=2*n;i++) printf("i=%d : fa=%d fsiz=%d\n",i,fa[i],siz[find(i)]);
for(int i=0;i<=n;i++) printf("%lld%c",dp[i]," \n"[i==n]);
}
int main()
{
n=read()*2,m=read();
for(int i=1;i<=2*n;i++) fa[i]=i,siz[i]=i<=n;
for(int i=1;i<=m;i++) x[i]=read(),y[i]=read();
dp[0]=1;
for(int i=1;i<=n;i++)
{
run(dp,fp,1,0);
memcpy(dp,fp,sizeof(dp));
}
// output();
for(int i=m;i;i--)
{
if(find(x[i])==find(y[i])) continue;
if(find(x[i]+n)==find(y[i])) continue;
int A=siz[find(x[i])],B=siz[find(x[i]+n)];
int C=siz[find(y[i])],D=siz[find(y[i]+n)];
unr(fp,dp,A,B);
unr(tp,fp,C,D);
run(tp,dp,A+D,B+C);
if(dp[n/2]) merge(x[i],y[i]+n),merge(x[i]+n,y[i]);
else run(tp,dp,A+C,B+D),merge(x[i],y[i]),merge(x[i]+n,y[i]+n);
// printf("i=%d : %d %d : %d %d %d %d\n",i,x[i],y[i],A,B,C,D);
// output();
}
for(int i=1;i<=n;i++) printf("%d",find(i)<=find(i+n));
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5936kb
input:
2 4 1 3 2 4 1 4 1 2
output:
1010
result:
ok Output is valid. OK
Test #2:
score: 0
Accepted
time: 1ms
memory: 6120kb
input:
3 7 2 5 1 3 4 6 2 6 4 5 2 4 5 6
output:
001101
result:
ok Output is valid. OK
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 4004kb
input:
1 0
output:
11
result:
wrong answer The number of 0s must be equal to that of 1s.