博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树分治
阅读量:6452 次
发布时间:2019-06-23

本文共 2556 字,大约阅读时间需要 8 分钟。

以时间为下标建线段树,则持续[L, R]时间的一个事物就能被表示成logn段区间。

这样就避免删除只有插入。

例题:

bzoj4644 经典傻逼题

每个点的点权为与它相连的边的权值异或和。求最大权点集即可。

线段树分治 + 线性基 + bitset。

1 #include 
2 #include
3 #include
4 #include
5 6 const int N = 1010; 7 8 std::vector
v[N * 4]; 9 typedef std::bitset
B; 10 11 struct Edge { 12 int x, y; 13 B v; 14 }edge[N]; 15 16 int n, m; 17 char str[N]; 18 B base[N], val[N]; 19 20 void insert(int i, int l, int r, int o) { 21 if(i <= l && r <= m) { 22 v[o].push_back(i); 23 return; 24 } 25 int mid = (l + r) >> 1; 26 if(i <= mid) { 27 insert(i, l, mid, o << 1); 28 } 29 if(mid < m) { 30 insert(i, mid + 1, r, o << 1 | 1); 31 } 32 return; 33 } 34 35 inline void getAns() { 36 for(int i = 0; i < N; i++) { 37 base[i].reset(); 38 } 39 for(int i = 1; i <= n; i++) { 40 B x = val[i]; 41 for(int j = N - 1; j >= 0 && x.any(); j--) { 42 if(!x[j]) { 43 continue; 44 } 45 if(base[j].none()) { 46 base[j] = x; 47 break; 48 } 49 x ^= base[j]; 50 } 51 } 52 B ans; 53 ans.reset(); 54 for(int i = N - 1; i >= 0; i--) { 55 if(base[i].none()) { 56 continue; 57 } 58 if(!ans[i]) { 59 ans ^= base[i]; 60 } 61 } 62 bool f = false; 63 for(int i = N - 1; i >= 0; i--) { 64 if(ans[i]) f = true; 65 if(!f) continue; 66 printf("%d", (int)ans[i]); 67 } 68 if(!f) printf("0"); 69 puts(""); 70 return; 71 } 72 73 void ask(int l, int r, int o) { 74 for(int i = 0; i < (int)v[o].size(); i++) { 75 int j = v[o][i]; 76 val[edge[j].x] ^= edge[j].v; 77 val[edge[j].y] ^= edge[j].v; 78 } 79 if(l == r) { 80 getAns(); 81 for(int i = 0; i < (int)v[o].size(); i++) { 82 int j = v[o][i]; 83 val[edge[j].x] ^= edge[j].v; 84 val[edge[j].y] ^= edge[j].v; 85 } 86 return; 87 } 88 int mid = (l + r) >> 1; 89 ask(l, mid, o << 1); 90 ask(mid + 1, r ,o << 1 | 1); 91 for(int i = 0; i < (int)v[o].size(); i++) { 92 int j = v[o][i]; 93 val[edge[j].x] ^= edge[j].v; 94 val[edge[j].y] ^= edge[j].v; 95 } 96 return; 97 } 98 99 int main() {100 //printf("%d \n", (sizeof(base) * 3) / 1048576);101 int q;102 scanf("%d%d%d", &q, &n, &m);103 for(int i = 1; i <= m; i++) {104 scanf("%d%d%s", &edge[i].x, &edge[i].y, str);105 int a = strlen(str);106 for(int j = a - 1; j >= 0; j--) {107 edge[i].v[a - 1 - j] = str[j] - '0';108 }109 for(int j = a; j < N; j++) {110 edge[i].v[j] = 0;111 }112 insert(i, 1, m, 1);113 }114 115 ask(1, m, 1);116 117 return 0;118 }
AC代码

bzoj4025 二分图

带撤销带权并查集 + 线段树分治。

  线段树分治 + lct。

转载于:https://www.cnblogs.com/huyufeifei/p/10417540.html

你可能感兴趣的文章
学生选课系统数据存文件
查看>>
flutter进行自动编译操作步骤
查看>>
4.6 直接插入排序法
查看>>
我的毕设总结所用的技术和只是要点 基于stm32F4的AGV嵌入式控制系统的设计
查看>>
盘点国内外那些有野心的BI公司
查看>>
JMeter—断言
查看>>
C++的新类创建:继承与组合
查看>>
m5-第9周作业
查看>>
odoo 权限设置
查看>>
asp操作access提示“无法从指定的数据表中删除”
查看>>
git bash 风格调整
查看>>
997D Cycles in product
查看>>
bzoj4589 Hard Nim
查看>>
java实现pdf旋转_基于Java实现PDF文本旋转倾斜
查看>>
java二维数组内存模型_C++二级指针第二种内存模型(二维数组)
查看>>
java static import 与 import_Java中的import和static import语句之间有什么区别?
查看>>
python time库3.8_python3中datetime库,time库以及pandas中的时间函数区别与详解
查看>>
java 代替Python_Java总是“沉沉浮浮”,替代者会是Python?
查看>>
贪吃蛇java程序简化版_JAVA简版贪吃蛇
查看>>
poi java web_WebPOI JavaWeb 项目 导出excel表格(.xls) Develop 238万源代码下载- www.pudn.com...
查看>>