题目大意

给定一个图,每次加一些边,或者删掉一些后来加上去的边,定义一个环的价值为环上所有的边的异或和,重复走的边重复算。每次询问这个时刻图中的所有经过1号点的环的最大价值。

思路

首先考虑对于一个静态的图如何求解图中所有经过1号点的环的最大价值,发现这个经过1号点就是唬人的,图中任意一个环都可以经过1号点再走回来。

于是题目变成了求解图中环的最大价值,可以将图中所有的简单环给拎出来放到线性基里面求最大价值,不难发现这是对的。

然后题目转化为了如何求图中所有的简单环,一般我们可以直接对图dfs找环,这个题目可以随便建出一颗生成树,任何一条非树边都对应了一个简单环,于是我们每次只需要在树上加边删边即可。

但是线性基不支持删除啊,线段树分治就好了。

/*=======================================* Author : ylsoi* Time : 2019.4.3* Problem : luogu3733* E-mail : ylsoi@foxmail.com* ====================================*/
#include<bits/stdc++.h>#define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define debug(x) cout<<#x<<"="<<x<<" "
#define fi first
#define se second
#define mk make_pair
#define pb push_back
#define pii pair<bitset<maxn>,int>
typedef long long ll;using namespace std;void File(){freopen("luogu3733.in","r",stdin);freopen("luogu3733.out","w",stdout);
}template<typename T>void read(T &_){_=0; T f=1; char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())_=(_<<1)+(_<<3)+(c^'0');_*=f;
}string proc(){ifstream f("/proc/self/status");return string(istreambuf_iterator<char>(f),istreambuf_iterator<char>());
}const int maxn=1000+10;
int n,m,q,tot;
struct edge{int u,v,l,r;bitset<maxn>w;
}e[maxn];
vector<pii>G[maxn];
vector<edge>lis;
bitset<maxn>dis[maxn];void read_bitset(bitset<maxn>&x){static char strbuf[maxn];char ch=getchar(); int tp=0;for(;!isdigit(ch);ch=getchar());for(;isdigit(ch);ch=getchar())strbuf[tp++]=ch;tot=max(tot,tp),x.reset();DREP(i,tp-1,0)if(strbuf[tp-1-i]=='1')x.set(i);
}void output(bitset<maxn>&x,char ch='\n'){int p=0;DREP(i,tot-1,0)if(x[i]){p=i;break;}DREP(i,p,0)putchar(x[i]+48);putchar(ch);
}int fa[maxn];
int find(int x){return fa[x]==x ? x : fa[x]=find(fa[x]);}void dfs_init(int u,int fh){REP(i,0,G[u].size()-1){bitset<maxn>w=G[u][i].fi;int v=G[u][i].se;if(v==fh)continue;/*cout<<u<<" "<<v<<endl;output(w);*/dis[v]=dis[u]^w;dfs_init(v,u);}
}struct liner_base{bitset<maxn>b[maxn];liner_base(){DREP(i,tot-1,0)b[i].reset();}void insert(bitset<maxn>x){DREP(i,tot-1,0)if(x[i]){if(!b[i][i]){b[i]=x;break;}x^=b[i];}}bitset<maxn>query(){bitset<maxn>ret(0);DREP(i,tot-1,0)if(!ret[i] && b[i][i])ret^=b[i];return ret;}
}T[21];void init(){read(n),read(m),read(q);REP(i,1,n)fa[i]=i;int u,v;REP(i,1,m){read(u),read(v),read_bitset(e[i].w);e[i].u=u,e[i].v=v;//output(e[i].w);if(find(u)!=find(v)){fa[find(u)]=find(v);G[u].push_back(mk(e[i].w,v));G[v].push_back(mk(e[i].w,u));}else lis.push_back(e[i]);}dfs_init(n,0);
}#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (o<<1|1)
#define lson lc,l,mid
#define rson rc,mid+1,rvector<bitset<maxn> >t[maxn<<2];
void insert(int o,int l,int r,int L,int R,bitset<maxn>&x){if(L<=l && r<=R)t[o].push_back(x);else{if(L<=mid)insert(lson,L,R,x);if(R>=mid+1)insert(rson,L,R,x);}
}void divide(int o,int l,int r,int dep){REP(i,0,t[o].size()-1)T[dep].insert(t[o][i]);if(l==r){bitset<maxn>ans=T[dep].query();output(ans);}else{T[dep+1]=T[dep];divide(lson,dep+1);T[dep+1]=T[dep];divide(rson,dep+1);}
}vector<edge>tl[maxn];
void work(){char opt[11];int u,v,cnt=0;bitset<maxn>w;REP(i,0,lis.size()-1){w=dis[lis[i].u]^dis[lis[i].v]^lis[i].w;insert(1,1,q+1,1,q+1,w);}REP(i,1,q){scanf("%s",opt);if(opt[0]=='A'){read(u),read(v),read_bitset(w);tl[++cnt].push_back((edge){u,v,i+1,q+1,w});}else if(opt[1]=='h'){read(u),read_bitset(w);int las=tl[u].size()-1;tl[u][las].r=i;tl[u].push_back((edge){tl[u][las].u,tl[u][las].v,i+1,q+1,w});}else{read(u);int las=tl[u].size()-1;tl[u][las].r=i;}}REP(i,1,cnt)REP(j,0,tl[i].size()-1){w=dis[tl[i][j].u]^dis[tl[i][j].v]^tl[i][j].w;insert(1,1,q+1,tl[i][j].l,tl[i][j].r,w);}divide(1,1,q+1,0);
}int main(){File();init();work();return 0;
}

转载于:https://www.cnblogs.com/ylsoi/p/10647955.html

HAOI2017 八纵八横——线段树分治+线性基相关推荐

  1. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  2. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  3. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  4. 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基

    题目链接:A - XOR 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后 ...

  5. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...

  6. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)

    P3292 [SCOI2016]幸运数字 思路 如果这题是求x,yx, yx,y之间的距离显然我们可以通过树剖加线段树来写, 但是这里变成了求任意个数的异或最大值.如果给定区间我们显然可以通过线性基来 ...

  7. UVALive - 8512——线段树维护线性基

    [题目描述] UVALive - 8512XOR [题目分析] 这种区间+线性基的问题我们可以考虑用线段树维护,线性基的合并的话就直接暴力合并 找到所在区间的线性基后再查找最大的数,我看网上的博客要说 ...

  8. bzoj 4184 shallot 时间线建线段树+vector+线性基

    题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...

  9. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)

    链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its element ...

  10. 【BZOJ4184】shallot 线段树+vector+线性基

    [BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...

最新文章

  1. 硬件知识:u-boot和bootloader的区别
  2. fusion构建器代码语法_构建器模式:适用于代码,适用于测试
  3. 云原生技术的挑战是什么?
  4. Linux sites
  5. python简明教程_03
  6. mysql数据库旅游管理系统_JSP+MySQL基于ssm的旅游管理系统
  7. 运营商iptv服务器,电信运营商IPTV业务发展趋势浅析
  8. linux中的so文件
  9. java dagger2_mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践
  10. 【web学习之对话框】对话框的使用
  11. 网站域名如何解析到阿里云和腾讯云服务器?
  12. SQL Server 进程无法连接到 Subscriber “xxxxxx”
  13. dubbo中bugger集
  14. async.whilst 的一个简化版实现
  15. 2012湘潭ICPC邀请赛感悟
  16. k8s主从自动切换mysql_Kubernetes一键部署Mycat+Mysql主从集群
  17. 普通本科,一年经验外包直接跳槽阿里?论我是怎么快速晋升的
  18. kettle闪退问报错无法打开图形界面ETI安装问题
  19. Part-Ⅱ7.交流等效电路模型-7.2基本的交流建模方法
  20. grpc-gateway搭建

热门文章

  1. linux rpm 装 mac,linux之 rpm,yum
  2. 13.MD5对用户密码进行加密
  3. android11 rom,第一个Android 11的第三方ROM来了,适用于红米K20 Pro
  4. 初学python爬虫心得(豆瓣电影top250)
  5. 网络摄像头RTSP流媒体协议视频平台EasyNVR如何进行延迟测试?
  6. 数据分析师之路-数据埋点
  7. 联想服务器怎么拆硬盘,联想ThinkStation P900工作站高清拆解
  8. FPGA基础知识1(FPGA芯片结构)
  9. 长方形面积计算机方式,《长方形面积的计算》教学设计
  10. 【读书笔记-诗词歌赋】诗词积累(一)