LOJ

洛谷


最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值。

bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\)的。(这就有\(70\)分?)

因为最开始的图是连通的,可以先求一个\(dis[i]\)表示\(1\)到\(i\)的异或和。每次加边会形成环,就是在线性基中插入一个元素。

因为有撤销,所以线段树分治就好了。线段树上每个节点开一个线性基。同一时刻只需要\(\log\)个线性基的空间。

复杂度\(O(\frac{q\log qL^2}{w})\)。

话说这题好无聊啊=-= 我现在怎么老在做这些模板套模板的题=-=

线段树里bitset直接传参比拿个栈分配空间快多了=-=

另外好像是有非线段树分治且在线的做法(见LOJ统计?)。


  1. //187ms 2.64MB
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <vector>
  5. #include <bitset>
  6. #include <cstring>
  7. #include <algorithm>
  8. #define gc() getchar()
  9. typedef long long LL;
  10. const int N=1e3+5,M=N<<1;
  11. typedef std::bitset<N> Bit;
  12. int tot,lim,Enum,H[N],nxt[N],to[N],las[M];
  13. std::bitset<N> len[N],dis[N];
  14. inline int read()
  15. {
  16. int now=0;register char c=gc();
  17. for(;!isdigit(c);c=gc());
  18. for(;isdigit(c);now=now*10+c-48,c=gc());
  19. return now;
  20. }
  21. inline char GetOpt()
  22. {
  23. register char c=gc(); while(c!='A'&&c!='C') c=gc();
  24. return gc();
  25. }
  26. void ReadBit(Bit &bit)
  27. {
  28. static char s[N];
  29. scanf("%s",s+1); int l=strlen(s+1);
  30. /*bit.reset(),*/ lim=std::max(lim,l-1);
  31. for(int i=1; i<=l; ++i) bit[l-i]=s[i]-48;
  32. }
  33. inline void AE(int u,int v)
  34. {
  35. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  36. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
  37. ReadBit(len[Enum]), len[Enum-1]=len[Enum];
  38. }
  39. void Print(const Bit &x)
  40. {
  41. bool fg=0;
  42. for(int i=lim; ~i; --i)
  43. fg|=x[i]==1, fg&&putchar((x[i]==1)+48);
  44. if(!fg) putchar('0');
  45. putchar('\n');
  46. }
  47. struct Edge
  48. {
  49. int u,v; Bit w;
  50. inline void Init() {u=read(),v=read(),ReadBit(w);}
  51. }e[M];
  52. struct Base
  53. {
  54. Bit x[N];
  55. void Insert(Bit v)
  56. {
  57. for(int i=lim; ~i; --i)
  58. if(v[i]==1)
  59. if(x[i].none()) {x[i]=v; break;}
  60. else v^=x[i];
  61. }
  62. void Query()
  63. {
  64. Bit ans; ans.reset();
  65. for(int i=lim; ~i; --i)
  66. if(ans[i]==0&&x[i].any()) ans^=x[i];
  67. Print(ans);
  68. }
  69. }B;
  70. struct Segment_Tree
  71. {
  72. #define ls rt<<1
  73. #define rs rt<<1|1
  74. #define lson l,m,ls
  75. #define rson m+1,r,rs
  76. #define S N<<2
  77. std::vector<int> vec[S];
  78. #undef S
  79. void Modify(int l,int r,int rt,int L,int R,int v)
  80. {
  81. if(L<=l && r<=R) {vec[rt].push_back(v); return;}
  82. int m=l+r>>1;
  83. if(L<=m) Modify(lson,L,R,v);
  84. if(m<R) Modify(rson,L,R,v);
  85. }
  86. void Solve(int l,int r,int rt,Base base)
  87. {
  88. const std::vector<int> &v=vec[rt];
  89. for(int i=0,lim=v.size(),p; i<lim; ++i)
  90. p=v[i], base.Insert(dis[e[p].u]^dis[e[p].v]^e[p].w);
  91. if(l==r) {base.Query(); return;}
  92. int m=l+r>>1;
  93. Solve(lson,base), Solve(rson,base);
  94. }
  95. }T;
  96. void DFS(int x)
  97. {
  98. static int Index,dfn[N];
  99. static bool vis[N];
  100. dfn[x]=++Index, vis[x]=1;
  101. for(int i=H[x],v; i; i=nxt[i])
  102. if(!vis[v=to[i]]) dis[v]=dis[x]^len[i], DFS(v);
  103. else if(dfn[v]<=dfn[x]) B.Insert(dis[x]^dis[v]^len[i]);
  104. }
  105. int main()
  106. {
  107. static int id[N];
  108. int n=read(),m=read(),q=read();
  109. while(m--) AE(read(),read());
  110. DFS(1), B.Query();
  111. if(!q) return 0;
  112. #define S 1,q,1
  113. char c; int tot=0;
  114. for(int i=1,k,t,cnt=0; i<=q; ++i)
  115. if((c=GetOpt())=='d') e[++tot].Init(), ++cnt, las[id[cnt]=tot]=i;
  116. else if(c=='a') k=id[read()], T.Modify(S,las[k],i-1,k), las[k]=0;
  117. else t=read(), k=id[t], T.Modify(S,las[k],i-1,k), las[k]=0,
  118. ++tot, e[tot].u=e[k].u, e[tot].v=e[k].v, ReadBit(e[tot].w), las[id[t]=tot]=i;//las要改对=-=
  119. for(int i=1; i<=tot; ++i) if(las[i]) T.Modify(S,las[i],q,i);
  120. T.Solve(S,B);
  121. return 0;
  122. }

洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)的更多相关文章

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

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

  2. 【洛谷P4319】 变化的道路 线段树分治+LCT

    最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...

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

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

  4. BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)

    题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...

  5. 洛谷P4570 [BJWC2011]元素 线性基

    正解:线性基+贪心 解题报告: 传送门! 这题其实没什么好写题解的,,,显然贪心一下尽量选魔力大的,不用证明趴挺显然的来着 所以就直接按魔力排个序,插入线性基里面,能插就加个贡献,over 放下代码趴 ...

  6. 洛谷P3857 [TJOI2008]彩灯 [线性基]

    题目传送门 彩灯 题目描述 Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜.已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一 ...

  7. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  8. ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)

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

  9. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

随机推荐

  1. postgresql语句

    查询oracle数据库所有表数据量 select t.table_name,t.num_rows from user_tables t ORDER BY t.num_rows desc 查询postg ...

  2. 3173. 【GDOI2103模拟3.17】扫雷游戏(搜索 + 剪枝)

    Problem 给出一个类似扫雷的游戏,有\(num\)个数字,求至少有多少个雷. Data constraint \(n,m\le 15,num\le 15\) Solution 好搜索啊. 现讲一 ...

  3. 值得推荐的C/C++框架和库 (真的很强大) c

    http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14 ...

  4. CMDB资产管理系统开发【day25】:表结构设计1

    资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...

  5. Ubuntu16下Hadoop安装

    1. 安装Ubuntu 2. 新装Ubuntu常用软件安装和系统设置 (1) 安装vim yum install vim (2) 更改hostname为hadoop_master sudo vim / ...

  6. jvisualvm安装visualgc插件

    jdk1.7自带jvisualvm可以对java应用进行监控.其中有个插件visualgc可以查看jvm垃圾回收的具体信息.安装插件的步骤是打开jvisualvm,点击工具->插件,在可用插件列 ...

  7. django - 总结 - ORM性能

    QuerySet 1.惰性查询 2.缓存机制 3.可迭代 4.可切片 -------------------------------------------------------在一个新创建的查询集 ...

  8. jQuery1.9及以上版本检测IE版本号

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  9. Linux IO Scheduler(Linux IO 调度器)【转】

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  10. spring中用到哪些设计模式?

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...