题意

给出一张无向图,定义S[x]表示与点x直接相连的点集,有两个操作
1 x y表示将第x到第y条边状态变化(若存在则删除,不存在则建立)
2 x y询问S[x]与S[y]是否相等

题解

有一个技巧可以压缩的表示点集:给每个点随机一个key,S[x]就可以表示为
与x相连的点的key亦或起来。
考虑如何维护S[x], 因为修改操作是对输入的顺序的区间修改,我们就按边输入的
顺序进行分块,用sum[i][j]记录第i块对点j的贡献值,也就是如果第i块有一条边u-v
那么\(sum[i][u] \bigoplus= key[v], sum[i][v] \bigoplus= key[u]\)
查询一个点的点集就变成求\(sum[1][x] \bigoplus sum[2][x] \bigoplus sum[3][x] \cdots \bigoplus sum[num][x]\)
修改的时候如果修改区间落在不同的块上,对夹在中间的块打个lazy标记,表示查询的时候
不用亦或上这个块的贡献,对与两边块内的修改操作可以再用一个数组S记录暴力修改的状态,
比如要修改区间\([l,r]\)是块内的,那么就修改\(S[u[i]] \bigoplus= key[v[i]], S[v[i]] \bigoplus= key[u[i]] (i\in[l,r])\)
查询x的点集时再xor上S[x]就行,总的来说就是块间修改只需要对sum打标记,块内修改就
暴力更改S,最后复杂度\(O(q\sqrt m)\),分块的时候块数要开成\(1.5\sqrt m\)

代码

#include <bits/stdc++.h>using namespace std;
const int mx = 2e5+10;
typedef long long ll;int belong[mx], block, num, l[mx], r[mx], id[mx];
int n, m, q, u[mx], v[mx];
int lazy[mx];
ll  sum[450][mx], S[mx];void build() {block = 1.5*sqrt(m);num = m / block;if (m % block) num++;for (int i = 1; i <= num; i++) {l[i] = (i-1) * block + 1;r[i] = i * block;lazy[i] = 1;for (int j = 1; j <= n; j++)sum[i][j] = 0;}r[num] = m;for (int i = 1; i <= m; i++)belong[i] = (i-1) / block + 1;for (int i = 1; i <= n; i++) S[i] = 0;}void update(int x, int y) {if (belong[x] == belong[y]) {for (int i = x; i <= y; i++) {S[u[i]] ^= id[v[i]];S[v[i]] ^= id[u[i]];}return;}int L = belong[x], R = belong[y];for (register int i = x; i <= r[L]; i++) {S[u[i]] ^= id[v[i]];S[v[i]] ^= id[u[i]];}for (register int i = L+1; i < R; i++) lazy[i] ^= 1;for (register int i = l[R]; i <= y; i++) {S[u[i]] ^= id[v[i]];S[v[i]] ^= id[u[i]];}
}int main() {srand(time(NULL));for (int i = 1; i < 100005; i++) id[i] = rand() + 1;int T;scanf("%d", &T);while (T--) {scanf("%d%d", &n, &m);build();for (int i = 1; i <= m; i++) {scanf("%d%d", &u[i], &v[i]);sum[belong[i]][u[i]] ^= id[v[i]];sum[belong[i]][v[i]] ^= id[u[i]];}scanf("%d", &q);while (q--) {int op, x, y;scanf("%d%d%d", &op, &x, &y);if (op == 1) {update(x, y);} else {ll ansx = S[x], ansy = S[y];for (int i = 1; i <= num; i++) {if (lazy[i]) {ansx ^= sum[i][x];ansy ^= sum[i][y];}}putchar(ansx==ansy?'1':'0');}}putchar('\n');}return 0;
}

转载于:https://www.cnblogs.com/bpdwn-cnblogs/p/11290523.html

A-Graph Games_2019牛客暑期多校训练营(第三场)相关推荐

  1. 2019牛客暑期多校训练营 第三场 I Median

    传送门 链接:https://ac.nowcoder.com/acm/contest/883/I 来源:牛客网 JSB has an integer sequence a1,a2,-,ana_1, a ...

  2. 2020牛客暑期多校训练营(第一场)

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

  3. 2020牛客暑期多校训练营(第二场)

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

  4. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

  5. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...

  6. 【2019牛客暑期多校训练营(第二场) - D】Kth Minimum Clique(bfs,tricks)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/D 来源:牛客网 Given a vertex-weighted graph with N vertice ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  9. 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/F 来源:牛客网 Given 2N people, you need to assign each of ...

  10. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)

    题干: 链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Two arrays u and v each with m distinct elem ...

最新文章

  1. PhpStorm 默认快捷键
  2. JVM运行时数据区概览
  3. java 强制gc_java应用性能调优之详解System的gc垃圾回收方法
  4. Docker将在存储上崭露头角?
  5. 打开逻辑STANDBY写入功能
  6. 如何使用Proxy模式及Java内建的动态代理机制
  7. Android的四大组件
  8. 阿里云与中国联通首个公共云平台上线
  9. Python——集合字典解析的对象无序和无副本特性
  10. 人工智能的数学基础(一):绪论
  11. LeetCode数据库 178. 分数排名
  12. Eclipse查看源码乱码问题
  13. 我从可用性测试中学到的五件事
  14. 管理感悟:眼高手低到眼高手高
  15. 汽车CAN总线技术详解
  16. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐
  17. 租车APP都哪些,租车平台成功案例
  18. 计算机设备配备情况,计算机设备配置标准.doc
  19. Design Compiler - DC综合的流程(三)
  20. Jenkins邮箱配置过程(qq + 163)

热门文章

  1. 1.9 编程基础之顺序查找 11 连续出现的字符 python
  2. 第十一届蓝桥杯省赛C++组试题 第4题 选择题判定
  3. 西单大悦城苹果店4s_“神秘列车”复活!金融街-西单,3号免费专线今天回归...
  4. 内网转外网方法 Sunny-Ngrok
  5. Java笔记-spring-rabbit框架中消息中header的添加
  6. 前端笔记-利用thymeleaf隐藏显示input及label
  7. HTTP之Cache-Control基本概念以及实例(C++ Qt实现)
  8. 大三软件工程小项目-小技术集合-Qt状态栏设置
  9. 虚拟机非正常关闭 无法打开
  10. php数组10000分割1000_PHP切割整数工具类似微信红包金额分配的思路详解