• bzoj2322 梦想封印


    题意和题解见思路索引。

    标程及易错点:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll read()
     5 {
     6     ll x=0;char ch=getchar();
     7     while (ch<'0'||ch>'9') ch=getchar();
     8     while ('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
     9     return x;
    10 }
    11 const int M=20005;
    12 const int N=5005;
    13 set<ll> s;
    14 int cnt,head[N],blo,u[M],v[M],top,x,y,pos,vis[N],tag[M*2],n,m,Q,e[M];
    15 ll ans[M],ww,w[N],base[65],q[N];
    16 set<ll>::iterator it;
    17 struct node{int to,next;ll w;}num[M*2];
    18 void add(int x,int y,ll w)
    19 {num[++cnt].to=y;num[cnt].next=head[x];num[cnt].w=w;head[x]=cnt;}
    20 void ins(ll x)
    21 {
    22     if (!x) return;
    23     for (int i=62;i>=0;i--)//从大到小 
    24       if ((x>>i)&1) {base[i]=x;blo++;break;}    
    25     for (top=0,it=s.begin();it!=s.end();++it) q[++top]=min(*it,*it^x);
    26     s.clear(); 
    27     for (int j=1;j<=top;j++) s.insert(q[j]);
    28 }
    29 ll match(ll x)
    30 {
    31     for (int i=62;i>=0&&x;i--)//从高位到低位消 
    32       if ((x^base[i])<x) x^=base[i];//能消的位都消元 
    33     return x;
    34 }
    35 void dfs(int x,int fa)
    36 {
    37    vis[x]=1;s.insert(match(w[x]));
    38    for (int i=head[x];i;i=num[i].next)
    39      if (num[i].to!=fa&&!tag[i])
    40      {
    41         if (!vis[num[i].to]) w[num[i].to]=w[x]^num[i].w,dfs(num[i].to,x);
    42         else ins(match(w[x]^w[num[i].to]^num[i].w));//这里加环也要对set消元 
    43      }    
    44 }
    45 int main()
    46 {
    47     n=read();m=read();Q=read();
    48     for (int i=1;i<=m;i++) u[i]=read(),v[i]=read(),ww=read(),add(u[i],v[i],ww),add(v[i],u[i],ww);
    49     for (int i=1;i<=Q;i++) e[i]=read(),tag[e[i]*2-1]=tag[e[i]*2]=1;
    50     dfs(1,-1);
    51     ans[Q+1]=(ll)s.size()*(1ll<<blo)-1; 
    52     for (int i=Q;i>=1;i--)
    53     {
    54         tag[e[i]*2-1]=tag[e[i]*2]=0;
    55         x=u[e[i]],y=v[e[i]],ww=num[e[i]*2].w;
    56         if (vis[x]&&vis[y]) ins(match(w[x]^w[y]^ww));
    57         else if (vis[x]) w[y]=w[x]^ww,dfs(y,x);
    58         else if (vis[y]) w[x]=w[y]^ww,dfs(x,y);
    59         ans[i]=(ll)s.size()*(1ll<<blo)-1;
    60     }
    61     for (int i=1;i<=Q+1;i++) printf("%lld
    ",ans[i]);
    62     return 0;
    63 }
  • 相关阅读:
    成为Emacs高手01-学习自带教程
    成为Emacs高手03-学习基础Elisp
    Google Drive For Linux
    Yet Another Scheme Tutorial 02
    1、Maven 基本配置
    eclipse添加easyExport插件,打开本地文件
    原创一看便知、Maven创建web项目
    1、启动oracle的步骤
    java正则表达式【大全】
    servlet上传下载(任何格式的都可以)
  • 原文地址:https://www.cnblogs.com/Scx117/p/9044484.html
Copyright © 2020-2023  润新知