题意

题目链接

Sol

感觉自己已经老的爬不动了。。

想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去

不过不删除莫队咋写来着?。。。。跑去学。。

带撤销并查集咋写来着?。。。。跑去学。。。

发现自己的带撤销并查集是错的,,自己yy着调了1h终于过了大数据。。

#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
//#define int long long
#define LL long long
#define Fin(x) {freopen(#x".in","r",stdin);}
#define Fout(x) {freopen(#x".out","w",stdout);}
#define pb(x) push_back(x)
using namespace std;
const int mod = 1e9 + 7;
const int MAXN = 1e6 + 10;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
template <typename A> inline void debug(A a){cout << a << '\n';}
template <typename A> inline LL sqr(A x){return 1ll * x * x;}
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, M, a[MAXN], belong[MAXN], block, ans[MAXN], cnt, fa[MAXN];
struct Q {int l, r, id;bool operator < (const Q &rhs) const{return r < rhs.r;}
};
vector<Q> q[MAXN];
int SolveBlock(int x, int y) {if(x == y) return 1;vector<int> v;for(int i = x; i <= y; i++) v.pb(a[i]);sort(v.begin(), v.end());int res = 1, now = 1; for(int i = 1; i < v.size(); i++) now = (v[i] == v[i - 1] + 1 ? now + 1 : 1), chmax(res, now);return res;
}
int inder[MAXN], Top, ha[MAXN], cur, mx;
struct Node {int x, deg;
}S[MAXN];
int find(int x) {return fa[x] == x ? x : find(fa[x]);
}
void unionn(int x, int y) {x = find(x); y = find(y);if(x == y) return;if(inder[x] < inder[y]) swap(x, y);chmax(mx, inder[x] + inder[y]);fa[y] = x;S[++Top] = (Node) {y, inder[y]};S[++Top] = (Node) {x, inder[x]};//taginder[x] += inder[y];
}
void Delet(int cur) {while(Top > cur) {Node pre = S[Top--];fa[pre.x] = pre.x;inder[pre.x] = pre.deg;}
}
void Add(int x) {ha[x] = 1;if(ha[x - 1]) unionn(x - 1, x);if(ha[x + 1]) unionn(x, x + 1);
}
void solve(int i, vector<Q> &v) {memset(ha, 0, sizeof(ha));Top = 0; int R = min(N, i * block) + 1;int ql = R, qr = ql - 1;//tagcur = 0, mx = 1;for(int i = 1; i <= N; i++) fa[i] = i, inder[i] = 1;for(int i = 0; i < v.size(); i++) {Q x = v[i];while(qr < x.r) Add(a[++qr]);cur = mx; int pre = Top;while(ql > x.l) Add(a[--ql]);ans[x.id] = mx;mx = cur;Delet(pre);while(ql < R) ha[a[ql++]] = 0;}
}
signed main() {int mx = 0;N = read(); M = read(); block = sqrt(N); for(int i = 1; i <= N; i++) a[i] = read(), belong[i] = (i - 1) / block + 1, chmax(mx, belong[i]);for(int i = 1; i <= M; i++) {int x = read(), y = read();if(belong[x] == belong[y]) ans[i] = SolveBlock(x, y);else q[belong[x]].push_back({x, y, i});}for(int i = 1; i <= mx; i++) sort(q[i].begin(), q[i].end()), solve(i, q[i]);    for(int i = 1; i <= M; i++) printf("%d\n", ans[i]);return 0;
}
/*
8 3
3 1 7 2 4 5 8 6
1 6
1 3
2 4
*/

转载于:https://www.cnblogs.com/zwfymqz/p/10346860.html

BZOJ4358: permu(带撤销并查集 不删除莫队)相关推荐

  1. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  2. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  3. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  4. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  5. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  6. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  7. POJ1703带权并查集(距离或者异或)

    题意:       有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...

  8. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

  9. LA3027简单带权并查集

    题意:       有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...

最新文章

  1. new_zeros()函数的作用
  2. js中的generator
  3. python exe文件运行依赖环境_python将py代码文件转换为EXE脱离环境运行
  4. VC6重载字体对话框,去除颜色下拉框
  5. 设置IIS会话过期时间
  6. springboot获取项目路径_springboot学习
  7. 东大OJ-一元三次方程解的个数
  8. Oracle location,oracle秘境探索之11g tablespace prellocation
  9. react-native升级到0.63ios图片不展示
  10. everything-everything使用技巧,过滤文件语法
  11. “斗”转星移,高精度(NTP网络授时)北斗授时系统
  12. idea的下载与安装破解
  13. Linux用户管理 (实验2)
  14. 用大数据“魔镜”照出电商假货
  15. AutoIt的录制(AU3Record)
  16. 自然语言处理Pytorch实现CharRNN歌词生成
  17. 【BZOJ 3894】 文理分科
  18. 三个月来美国又有一万家餐馆因疫情倒闭或关闭;爱彼迎帮助在危机中的人寻找临时住宿 | 美通企业日报...
  19. Pytorch系列(四):猫狗大战1-训练和测试自己的数据集
  20. log4j的使用和log4j过时问题的解决

热门文章

  1. Codeforces Round #196 (Div. 1 + Div. 2)
  2. js 闭包作用(转自别人的)
  3. 还在用ViT的16x16 Patch分割方法吗?中科院自动化所提出Deformable Patch-based方法,涨点显著!...
  4. 章国锋:视觉SLAM最新观点分享
  5. 3行代码Python搞定图片清晰度识别,原来我们看到不一定是这样的
  6. 收藏 | LSTM模型结构的可视化
  7. CVPR 2020 Oral |目标检测+分割均实现SOTA!厦大提出协同学习网络
  8. 小林菌2020总结,我差点没毕业~
  9. HALCON学习之旅(一)
  10. 卷积神经网络-进化史 | 从LeNet到AlexNet