根据$[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. spark性能优化(一)

    本文内容说明 初始化配置给rdd和dataframe带来的影响 repartition的相关说明 cache&persist的相关说明 性能优化的说明建议以及实例 配置说明 spark:2.4 ...

  2. pycharm环境下配置scrap爬虫环境

    [写在开头] 参考文章后面给出了备注信息,是在解决这个问题的时候,查找的比较有亮点的参考文章,如果本文章写的不太清楚的,可以去原文章进行查看.下面列举的四个文章有参考的成分也有验证的成分,解决办法重点 ...

  3. Java---String和StringBuffer类

    Java---String和StringBuffer类 Java String 类 字符串在Java中属于对象,Java提供String类来创建和操作字符串. 创建字符串 创建字符串常用的方法如下: ...

  4. 数据结构与算法-基础(十一)AVL 树

    AVL 树 是最早时期发明的自平衡二叉搜索树之一.是依据它的两位发明者的名称命名. AVL 树有一个重要的属性,即平衡因子(Balance Factor),平衡因子 == 某个节点的左右子树高度差. ...

  5. 【Java虚拟机9】类加载器之命名空间详解

    前言 前面介绍类加载器的时候,介绍了一下命名空间这个概念.今天就通过一个例子,来详细了解一下[类加载器的命名空间].然后通过这个例子,我们可以总结一下双亲委托模型的好处与优点. 例1(不删除class ...

  6. Sequence Model-week3编程题1-Neural Machine Translation with Attention

    1. Neural Machine Translation 下面将构建一个神经机器翻译(NMT)模型,将人类可读日期 ("25th of June, 2009") 转换为机器可读日 ...

  7. Scrum Meeting 最终总结

    [软工小白菜]Scrum Meeting 最终总结 2020/4/28 一.会议内容 1.工作及计划 组员代号 完成的工作 明日计划 炎龙 1.整合了整个程序,生成了apk并且上传审核 无 风鹰 1. ...

  8. the Agiles Scrum Meeting 6

    会议时间:2020.4.14 20:00 1.每个人的工作 今天已完成的工作 增量组:开发广播正文展开收起功能 issues:增量组:广播正文展开收起功能实现 完善组:修复冲刺部分的bug issue ...

  9. Mac 系统如何利用软链接在根目录创建文件夹?

    作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统 ...

  10. Noip模拟80 2021.10.18

    预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...