MnZn刚学OI求调线性基
查看原帖
MnZn刚学OI求调线性基
566289
RP_INT_MAX楼主2023/5/14 19:38

用的是离线询问,带删线性基的做法。仅 AC #1。

#include <bitset>

#include <cstdio>

#include <iostream>

using namespace std;

const int N=1010;

typedef bitset<N> BT;

inline void in(BT &x) {

    string s;

    cin>>s;

    BT tmp(s);

    x=tmp;

}

inline void out(BT x) {

    bool flag=0;

    for(int i=999;i>=0;--i) {

        if(x[i]||flag) putchar('0'+x[i]);

        if(x[i]) flag=1;

    }

    if(!flag) putchar('0');

    putchar('\n');

}

int tot,hd[N];

struct node {

    int next,to;

    BT v;

} edg[N];

inline void add(int fr,int to,BT v) {

    edg[++tot].to=to;

    edg[tot].v=v;

    edg[tot].next=hd[fr];

    hd[fr]=tot;

}

BT p[N];

int t[N];

void upd(BT x,int time) {

    for(int i=1000;i>=0;--i)

        if(x[i]) {

            if(t[i]<time) swap(time,t[i]),swap(x,p[i]);

            if(time==0) break;

            x^=p[i];

        }

}

void getmx(int time) {

    BT ans;

    for(int i=1000;i>=0;--i)

        if(time<t[i]&&!ans[i]) ans^=p[i];

    out(ans);

}

BT dis[N];

bool vis[N];

void DFS(int x) {

    vis[x]=1;

    for(int i=hd[x];i;i=edg[i].next) {

        int v=edg[i].to;

        if(vis[v]) upd(dis[v]^edg[i].v^dis[x],0x3f3f3f3f);

        else dis[v]=dis[x]^edg[i].v,DFS(v);

    }

}

int n,m,q,qcnt,ed[N],op[N],del[N];

BT val[N];

pair<int,int>New[N];

int main () {

    ios::sync_with_stdio(0);

    cin>>n>>m>>q;

    int num=q+1;

    for(int i=1;i<=m;++i) {

        int u,v;

        BT w;

        cin>>u>>v,in(w);

        add(u,v,w);

    }

    DFS(1);

    for(int i=1;i<=q;++i) {

        string s;

        cin>>s;

        int x,y;

        BT z;

        if(s=="Add") {

            cin>>x>>y,in(z);

            op[i]=++qcnt;

            val[qcnt]=(z^dis[x]^dis[y]);

            New[qcnt]=make_pair(x,y);

            del[qcnt]=qcnt;

        }

        else if(s=="Change") {

            cin>>x,in(z);

            ed[del[x]]=i;

            op[i]=--num;

            val[num]=(z^dis[New[x].first]^dis[New[x].second]);

            del[x]=num;

        }

        else if(s=="Cancel") {

            cin>>x;

            ed[del[x]]=i;

        }

    }

    for(int i=1;i<=q;++i)

        if(!ed[i]) ed[i]=0x3f3f3f3f;

    getmx(0);

    for(int i=1;i<=q;++i) {

        if(op[i]) upd(val[op[i]],ed[op[i]]);

        getmx(i);

    }

    return 0;

}
2023/5/14 19:38
加载中...