大意: 给定无向图, 定义$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. java把一段时间分成周,月,季度,年的时间段

    package com.mq.test.activeMQ; import java.text.DateFormat; import java.text.ParseException; import j ...

  2. linux查看文件的编码格式的方法 set fileencoding

    查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim中 可以直接查看文件编码:set fileencoding即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决 用 ...

  3. vue 引入公共css文件

    1.在入口js文件main.js中引入,一些公共的样式文件,可以在这里引入. import Vue from 'vue'import App from './App' // 引入App这个组件impo ...

  4. 关于Android studio下V4包 KeyEventCompat 类找不到问题

    V4包 KeyEventCompat 类找不到问题   本文链接:https://blog.csdn.net/shanshan_1117/article/details/84344557 今天我把su ...

  5. 21Flutter Drawer侧边栏、以及侧边栏内容布局

    Tabs.dart import 'package:flutter/material.dart'; import 'tabs/Home.dart'; import 'tabs/Category.dar ...

  6. Linux -- Reactor

    结构 1. handles 资源的标志.这些资源通常包含网络连接,文件,定时器,同步对象等.handles 被用在注册服务器来标记socket,以便同步事件复用(Synchronous Event D ...

  7. LeetCode_121. Best Time to Buy and Sell Stock

    121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...

  8. 浅谈Delphi高效使用TreeView

    本来我一直都是使用递归算法, 效率很低 下边这段代码是我原来写的 ------------------------------------------------------------------- ...

  9. 【Leetcode_easy】1089. Duplicate Zeros

    problem 1089. Duplicate Zeros 题意: solution: 其中关于虚拟新数组的下标的计算还是有点迷糊... class Solution { public: void d ...

  10. demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理

    //durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...