根据$[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. 从0到1使用Kubernetes系列(二):安装工具介绍

    该系列第一篇为:<从0到1使用Kubernetes系列--Kubernetes入门>.本文是Kubernetes系列的第二篇,将介绍使用Kubeadm+Ansible搭建Kubernete ...

  2. 学大数据一定要会Java开发吗?

    Java是目前使用广泛的编程语言之一,具有的众多特性,特别适合作为大数据应用的开发语言.Java语言功能强大和简单易用,不仅吸收了C++语言的各种优点还摒弃了C++里难以理解的多继承.指针等概念. J ...

  3. mysql锁场景及排查

    1.查询长时间不返回: 在表 t 执行下面的 SQL 语句: mysql> select * from t where id=1; 查询结果长时间不返回. 一般碰到这种情况的话,大概率是表 t ...

  4. kviy TextInput 触发事件

    from kivy.uix.widget import Widget from kivy.app import App from kivy.lang import Builder Builder.lo ...

  5. UltraSoft - Alpha - Scrum Meeting 1

    Date: Apr 06th, 2020. 会议内容为讨论功能规格书和技术规格书的撰写. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 进行Djan ...

  6. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...

  7. 常用JAVA API :HashSet 和 TreeSet

    set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E e)//如果容器中不包含此元素,则添加. clear()//清空 contain ...

  8. JS控制文本框禁止输入特殊字符

    JS 控制不能输入特殊字符<input type="text" class="domain" onkeyup="this.value=this. ...

  9. X264编码测试验证

    之前在做一个rtsp直播需求,其中一个方案是要用的x264来对摄像头数据进行实时编码推流,摄像头帧率是25fps,为了验证方案的可行性,先对x264的编码速度进行一个测试研究,再确认是否要采用此方案. ...

  10. hdu 4788 Hard Disk Drive (水题)

    题意: Input The first line contains an integer T, which indicates the number of test cases. For each t ...