QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#641330#9449. New School TermWuyanruWA 1ms6120kbC++143.0kb2024-10-14 19:54:102024-10-14 19:54:10

Judging History

你现在查看的是最新测评结果

  • [2024-10-14 19:54:10]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:6120kb
  • [2024-10-14 19:54:10]
  • 提交

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.