大意: 给定无向图, 定义$S(x)$为$x$的邻接点集合. 每次操作翻转$[L,R]$范围的边, 询问$S(x)$与$S(y)$是否相等.

快速判断集合相等可以用$CF 799F$的技巧. 采用$hash$, 对每个数取一个随机$ull$, 转为判断异或和是否相等.

然后考虑度数分块.

对于轻点, 一个想法是查询时暴力枚举邻接边, 树状数组判断是否存在. 这样的话复杂度还带$log$很难卡过.

一个更好的做法是用分块代替树状数组实现$O(1)$查询.

对于重点, 可以对每个重点用$vector$存邻接边, 每次更新对一个重点$x$的贡献是$x$的$vector$内连续的一段, 但是这样需要二分来确定位置.

一个更好的做法是考虑对边分块, 预处理出每个块对每个重点的影响, 然后修改时对边界暴力, 整块打标记. 查询时暴力查询每块的标记即可.

#include <iostream>
#include <random>
#include <cstdio>
#include <math.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define pb push_back
#define x first
#define y second
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N = 2e5+10;
int n, m, u[N], v[N], deg[N];
char ans[N];
vector<pii> small[N];
int S,c1[N],c2[N],c3[N],ID[N];
ull f[800][800];
ull a[N],s[N];
void upd(int x) {
REP(i,x/S*S,x) c1[i]^=1,s[u[i]]^=a[v[i]],s[v[i]]^=a[u[i]];
PER(i,0,x/S-1) c2[i]^=1,c3[i]^=1;
}
ull query(int x) {
return c1[x]^c2[x/S];
}
ull qry(int x) {
ull ans = 0;
if (ID[x]) {
PER(i,0,m/S) if (c3[i]) ans ^= f[i][ID[x]];
return ans^s[x];
}
for (auto e:small[x]) if (query(e.x)) ans ^= a[e.y];
return ans;
} std::mt19937 rd(time(0));
void work() {
scanf("%d%d", &n, &m), S = 1.5*sqrt(m);
REP(i,0,m+5) c1[i]=c2[i]=c3[i]=0;
REP(i,0,n+5) s[i]=ID[i]=deg[i]=0,small[i].clear();
REP(i,1,m) {
scanf("%d%d", u+i, v+i);
++deg[u[i]],++deg[v[i]];
}
upd(m);
REP(i,1,n) if (deg[i]>=S) ID[i]=++*ID;
PER(i,0,m/S) REP(j,0,*ID) f[i][j]=0;
if (S>=800) throw;
if (*ID>=800) throw;
if (m/S>=800) throw;
REP(i,1,m) {
int id = i/S;
if (ID[u[i]]) f[id][ID[u[i]]]^=a[v[i]];
else small[u[i]].pb(pii(i,v[i]));
if (ID[v[i]]) f[id][ID[v[i]]]^=a[u[i]];
else small[v[i]].pb(pii(i,u[i]));
}
int q, cnt = 0;
scanf("%d", &q);
while (q--) {
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if (op==1) upd(y),upd(x-1);
else ans[++cnt] = qry(x)==qry(y)?'1':'0';
}
ans[cnt+1] = 0;
puts(ans+1);
}
int main() {
REP(i,0,N-1) a[i] = rd()*rd();
int t;
scanf("%d", &t);
while (t--) work();
}

2019牛客多校三 A. Graph Games (图分块)的更多相关文章

  1. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  2. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  3. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  4. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  5. 2019牛客多校第一场E ABBA(DP)题解

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

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  8. 2019牛客多校第三场A Graph Games 分块思想

    题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...

  9. 2019牛客多校训练第三场H.Magic Line(思维)

    题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...

随机推荐

  1. [转]解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).

    Git fetch和git pull的区别: 都可以从远程获取最新版本到本地 1.Git fetch:只是从远程获取最新版本到本地,不会merge(合并) $:git fetch origin mas ...

  2. HTTP请求客户端工具类

    1.maven 引入依赖 <dependency> <groupId>commons-httpclient</groupId> <artifactId> ...

  3. Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考) 1.返回顶部 1. #line(C# 参考) 2015/07/20 借助 #line,可修改编译器的行 ...

  4. SQL-W3School-函数:SQL 函数

    ylbtech-SQL-W3School-函数:SQL 函数 1.返回顶部 1. SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function ...

  5. Inventor2018专业版软件安装激活教程

    如果你安装的是Autodesk Inventor Professional 2018,那么序列号为:666-69696969,产品密钥为:797J1, 如果你安装的是Autodesk Inventor ...

  6. Qt编写自定义控件45-柱状标尺控件

    一.前言 这个控件写了很久了,是最早期的一批控件中的一个,和温度计控件类似,都是垂直的进度条,可以设置不同的背景颜色,左侧的刻度也可以自由设定,还提供了动画效果,其实就是开启定时器慢慢的进度到设定的目 ...

  7. 测试理论03-svn-缺陷及报告-jira

    回顾--用例设计方法 边界值(三个点,使用步骤) 判定表(适用,四个组成部分,规则,使用) 因果图(适用,四个符号,使用) 正交表(定义,特性,L_n(m^k),因素,水平,使用,工具allpairs ...

  8. 【转】Selenium-xpath详解

    1.XPATH是什么 XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档.X ...

  9. Oracle ORA-00984: column not allowed here

    ORA-00984错误: 列在此处不允许当数据以char的形式存在时,应加单引号,则插入数据库就不会出现类似错误.

  10. LD_LIBRARY_PATH无效

    在os x 上设置LD_LIBRARY_PATH无效,env命令看不到这个变量,下面的文章说明了这个问题 说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说, ...