根据$[WC2011]XOR$的思路,每次暴力重构线性基,令$l'=\frac{l^{2}}{w}$,则有一个$nql'$的做法(这里线性基位数很多,所以要用bitset)
由于初始连通,因此每一个环一定可以由若干个[树边+1条非树边]的环构成(构成指异或),那么预处理出每一个操作的环大小,相当于维护一个支持插入和删除的线性基(修改操作可以看成删除+插入操作)
证明:归纳k条新边($k=1$显然成立)可以划分,对$k+1$条新边的环,设新边依次为$(l1,r1),(l2,r2),……,(l_{k+1},r_{k+1})$,前k条边所构成的环被划分,多出的部分为树边上的$(l_{1},r_{k}),(l_{1},r_{k+1}),({r_{k},l_{k+1})}$和新边$(l_{k+1},r_{k+1})$,容易发现这个恰好构成了[树边+$(l_{k+1},r_{k+1})$]的环
但线性基无法支持删除,因此用线段树分治:将操作打在区间上,在当前点到根的链上的每一个点维护一个线性基,时间复杂度$o((n\log_{2}n+l')q\log_{2}q)$(要注意$q=0$的情况,特判$l>r$)

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define bt bitset<N>
5 #define L (k<<1)
6 #define R (L+1)
7 #define mid (l+r>>1)
8 struct ji{
9 int nex,to;
10 bt len;
11 }edge[N];
12 int V,E,n,m,t,q,x,y,head[N],vis[N],tim[N];
13 char s[N];
14 bt o,sh[N],f[31][N];
15 pair<bt,bt>val[N];
16 vector<bt>v[N<<2];
17 void read(){
18 scanf("%s",s);
19 o.reset();
20 int l=strlen(s);
21 for(int i=0;i<l;i++)o[l-i-1]=s[i]-'0';
22 }
23 void write(bt o){
24 bool flag=0;
25 for(int i=N-6;i>=0;i--)
26 if ((flag)||(o[i])){
27 x=o[i];
28 printf("%d",x);
29 flag=1;
30 }
31 if (!flag)printf("0");
32 printf("\n");
33 }
34 void add(bt x){
35 for(int i=N-6;i>=0;i--)
36 if (x[i])
37 if (f[V][i].any())x^=f[V][i];
38 else{
39 f[V][i]=x;
40 break;
41 }
42 }
43 bt query(){
44 o.reset();
45 for(int i=N-6;i>=0;i--)
46 if (!o[i])o^=f[V][i];
47 return o;
48 }
49 void add(int x,int y,bt z){
50 edge[E].nex=head[x];
51 edge[E].to=y;
52 edge[E].len=z;
53 head[x]=E++;
54 }
55 void dfs(int k,bt x){
56 vis[k]=1;
57 sh[k]=x;
58 for(int i=head[k];i!=-1;i=edge[i].nex)
59 if (!vis[edge[i].to])dfs(edge[i].to,x^edge[i].len);
60 else add(sh[edge[i].to]^sh[k]^edge[i].len);
61 }
62 void New(){
63 V++;
64 for(int i=0;i<N-5;i++)f[V][i]=f[V-1][i];
65 }
66 void update(int k,int l,int r,int x,int y,bt z){
67 if ((l>y)||(x>r))return;
68 if ((x<=l)&&(r<=y)){
69 v[k].push_back(z);
70 return;
71 }
72 update(L,l,mid,x,y,z);
73 update(R,mid+1,r,x,y,z);
74 }
75 void dfs(int k,int l,int r){
76 if (l>r)return;
77 New();
78 for(int i=0;i<v[k].size();i++)add(v[k][i]);
79 if (l==r)write(query());
80 else{
81 dfs(L,l,mid);
82 dfs(R,mid+1,r);
83 }
84 V--;
85 }
86 int main(){
87 scanf("%d%d%d",&n,&m,&q);
88 memset(head,-1,sizeof(head));
89 for(int i=1;i<=m;i++){
90 scanf("%d%d",&x,&y);
91 read();
92 add(x,y,o);
93 add(y,x,o);
94 }
95 o.reset();
96 dfs(1,o);
97 for(int i=1;i<=q;i++){
98 scanf("%s",s);
99 if (s[0]=='A'){
100 scanf("%d%d",&x,&y);
101 read();
102 tim[++t]=i;
103 val[t]=make_pair(sh[x]^sh[y],o);
104 }
105 else{
106 scanf("%d",&x);
107 update(1,1,q,tim[x],i-1,val[x].first^val[x].second);
108 if (s[1]=='a')tim[x]=-1;
109 else{
110 read();
111 tim[x]=i;
112 val[x].second=o;
113 }
114 }
115 }
116 for(int i=1;i<=t;i++)
117 if (tim[i]>0)update(1,1,q,tim[i],q,val[i].first^val[i].second);
118 write(query());
119 dfs(1,1,q);
120 }

[luogu3733]八纵八横的更多相关文章

  1. 【Luogu3733】[HAOI2017]八纵八横(线性基,线段树分治)

    [Luogu3733][HAOI2017]八纵八横(线性基,线段树分治) 题面 洛谷 题解 看到求异或最大值显然就是线性基了,所以只需要把所有环给找出来丢进线性基里就行了. 然后线性基不资磁撤销?线段 ...

  2. 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)

    Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...

  3. [Luogu3733][HAOI2017]八纵八横

    luogu sol 线性基+线段树分治傻题. 复杂度应该是\(O((n+m\log n)\frac{L^2}{\omega})\)? code #include<cstdio> #incl ...

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

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

  5. LOJ2312 LUOGU-P3733「HAOI2017」八纵八横 (异或线性基、生成树、线段树分治)

    八纵八横 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路的两端都是城市(可能两端是同一个 ...

  6. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  7. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

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

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

  9. [HAOI2017]八纵八横 线性基

    题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点 ...

随机推荐

  1. Java String的探讨

    关于String相关内容的学习,历来都是Java学习必不可少的一个经历. 以前一直想要好好总结一下String的相关的知识点,苦于没有时间,终于在今天有一个闲暇的时间来好好总结一下,也希望这文章能够加 ...

  2. django3上线部署踩的坑

    好久没有用过django写项目了,最近公司开发个官网,一时兴起就拿来练练手,这不用不知道,一用吓一跳啊. 才多久,版本都到3.0了. 踩坑一:运行项目时失败报错,后来查找资料发现, 当你使用djang ...

  3. SpringBoot之日志注解和缓存优化

    SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...

  4. Vim 不区分大小写

    Vim 不区分大小写 忽略:set ignorecase 恢复:set noignorecase

  5. DL4J实战之六:图形化展示训练过程

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<DL4J实战>系列的第六 ...

  6. JAVA复习总体大纲

    1 java基础. [1].变量--- 数据类型 变量名=值; 数据类型: 1.基本数据类型. byte[1字节] short[2字节] int[4字节] long[8字节] float[4字节] d ...

  7. Shiro反序列化的检测与利用

    1. 前言 Shiro 是 Apache 旗下的一个用于权限管理的开源框架,提供开箱即用的身份验证.授权.密码套件和会话管理等功能. 2. 环境搭建 环境搭建vulhub 3. 如何发现 第一种情况 ...

  8. 让全链路压测变得更简单!Takin2.0重磅来袭!

    自Takin社区版1.0发布两个多月以来,有很多测试同学陆续在各自的工作中运用了起来,其中包括金融.电商.物流.出行服务等行业.这个过程中我们收到了很多同学的反馈建议,同时也了解到很多同学在落地全链路 ...

  9. 带你用AVPlayer实现音频和视频播放

    项目概述 以下项目是基于AVPlayer的实际运用,实现音频播放.横竖屏视频切换播放.类似抖音的竖屏全屏播放效果. 项目地址:AVPlayerAudioVideo 如果文章和项目对你有帮助,还请给个S ...

  10. Noip模拟74 2021.10.11

    T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...