CF1386C. Joker(整体二分)

CF1386C. Joker

Solution

难得有一道可以整体二分的题。

有一个基本的思路是:考虑求出AnsiAns_iAnsi表示最小的右端点,满足[1,i]∪[Ansi,m][1,i]\cup[Ans_i,m][1,i][Ansi,m]中存在奇环。

考虑到AnsiAns_iAnsi序列是非减的,因此我们可以twopointers+LCTtwo\;pointers+LCTtwopointers+LCT维护生成树以及是否存在奇环,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)

不过还有一种O(nlog⁡2n)O(n \log^2n)O(nlog2n)的整体二分做法:
Solve(l,r,L,R)Solve(l,r,L,R)Solve(l,r,L,R)表示求出i∈[l,r],Ansi∈[L,R]i\in[l,r],Ans_i\in[L,R]i[l,r],Ansi[L,R]的所有AnsiAns_iAnsi。有一个精妙的想法是:我们去保证Solve(l,r,L,R)Solve(l,r,L,R)Solve(l,r,L,R)[1,l]∪[R,n][1,l]\cup[R,n][1,l][R,n]的边已经加入 ,那么i=midi=midi=mid的答案就可以通过加入[l+1,mid][l+1,mid][l+1,mid]以及不超过O(R−L)O(R-L)O(RL)条边求出,然后分治下去。

总时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)

Code

#include <bits/stdc++.h>using namespace std;template<typename T> inline bool upmin(T &x, T y) { return y < x ? x = y, 1 : 0; }
template<typename T> inline bool upmax(T &x, T y) { return x < y ? x = y, 1 : 0; }#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondtypedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int, int> PR;
typedef vector<int> VI; const lod eps = 1e-9;
const lod pi = acos(-1);
const int oo = 1 << 30;
const ll loo = 1ll << 60;
const int mods = 1e9 + 7;
const int inv2 = (mods + 1) >> 1;
const int MAXN = 200005;
const int INF = 0x3f3f3f3f; //1061109567
/*--------------------------------------------------------------------*/namespace FastIO{constexpr int SIZE = (1 << 21) + 1;int num = 0, f;char ibuf[SIZE], obuf[SIZE], que[65], *iS, *iT, *oS = obuf, *oT = obuf + SIZE - 1, c;#define gc() (iS == iT ? (iT = ((iS = ibuf) + fread(ibuf, 1, SIZE, stdin)), (iS == iT ? EOF : *iS ++)) : *iS ++)inline void flush() {fwrite(obuf, 1, oS - obuf, stdout);oS = obuf;}inline void putc(char c) {*oS ++ = c;if (oS == oT) flush();}inline void getc(char &c) {for (c = gc(); c != '<' && c != '>' && c != EOF; c = gc());}inline void reads(char *st) {char c;int n = 0;getc(st[++ n]);for (c = gc(); c == '<' || c == '>' ; c = gc()) st[++ n] = c;st[n + 1] = '\0';}template<class I>inline void read(I &x) {for (f = 1, c = gc(); c < '0' || c > '9' ; c = gc()) if (c == '-') f = -1;for (x = 0; c >= '0' && c <= '9' ; c = gc()) x = (x << 3) + (x << 1) + (c & 15);x *= f;}template<class I>inline void print(I x) {if (x < 0) putc('-'), x = -x;if (!x) putc('0');while (x) que[++ num] = x % 10 + 48, x /= 10;while (num) putc(que[num --]);}struct Flusher_{~Flusher_(){flush();}} io_Flusher_;
}
using FastIO :: read;
using FastIO :: putc;
using FastIO :: reads;
using FastIO :: print;PR E[MAXN];
int f[MAXN], col[MAXN], Ans[MAXN], num[MAXN], top = 0, n, m, Case;
struct stknode{ int x, p, y, q; } stk[MAXN];int find(int x) { return f[x] == x ? f[x] : find(f[x]); }
int getcol(int x) { return f[x] == x ? col[x] : getcol(f[x]) ^ col[x]; }
int Add(int u, int v) {int x = find(u), y = find(v);if (num[x] > num[y]) swap(x, y);if (x != y) {stk[++ top] = (stknode){x, col[x], y, num[y]};col[x] ^= getcol(u) ^ getcol(v) ^ 1;f[x] = y, num[y] += num[x];return 0;}return (getcol(u) == getcol(v));
}
void del(int x) {while (top > x) {f[stk[top].x] = stk[top].x;col[stk[top].x] = stk[top].p;num[stk[top].y] = stk[top].q;-- top;}
}
void solve(int l, int r, int L, int R, int flag) {
//	cout << l << " " << r << " " << L << " " << R << " " << flag << endl;if (l > r) return;if (flag || L == R) {for (int i = l; i <= r ; ++ i) Ans[i] = R;return;}int mid = (l + r) >> 1, lst = top, Flag = 0;for (int i = l + 1; i <= mid ; ++ i) Flag |= Add(E[i].fi, E[i].se);if (Flag) Ans[mid] = R;else {int Lst = top;for (int i = R - 1; i >= L ; -- i)if (Add(E[i].fi, E[i].se)) { Ans[mid] = i; break; }del(Lst);}Flag |= Add(E[mid + 1].fi, E[mid + 1].se);solve(mid + 1, r, Ans[mid], R, Flag);del(lst);Flag = 0;for (int i = R - 1; i >= Ans[mid] ; -- i) Flag |= Add(E[i].fi, E[i].se);solve(l, mid - 1, L, Ans[mid], Flag);
}
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifread(n), read(m), read(Case);for (int i = 1; i <= n ; ++ i) f[i] = i, num[i] = 1;for (int i = 1; i <= m ; ++ i) read(E[i].fi), read(E[i].se);solve(0, m - 1, 1, m + 1, 0);
//	for (int i = 1; i <= n ; ++ i) cout << Ans[i] << endl;while (Case --) {int l, r;read(l), read(r);if (Ans[l - 1] > r) putc('Y'), putc('E'), putc('S');else putc('N'), putc('O');putc('\n');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core使用serilog将日志推送到腾讯云日志服务

为什么是serilog&#xff1f;Serilog是 .NET 中最著名的结构化日志类库。基于日志事件log events&#xff0c;而不是日志消息log message。你可以将日志事件格式化为控制台的可读文本或者可以将相同的事件格式化为JSON并将其发送到远程日志服务器。应用程序中的日志语句会创建L…

P5787 二分图 /【模板】线段树分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 线段树分治就是在线段树上进行遍历&#xff0c;到每个点都加上它对子节点的贡献&#xff0c;最后到叶子节点的时候算一下贡献。 对于这个题先考虑维护二分图的话&#xff0c;可以用扩展域并…

CF1413F. Roads and Ramen(树的直径,线段树)

CF1413F. Roads and Ramen Solution 感觉这个套路也见过许多次了&#xff1f;大概这种奇奇怪怪的树上最长路径的题都得往直径靠一靠。 大概有个结论是&#xff1a;存在一个最优路径使得其起始点和直径起始点有交。 然后我们只需要求出一个直径的起始点A,BA,BA,B&#xff0c…

微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境

北京时间 2019 年 6 月 14 日 &#xff0c;微软发布了 VS Code Java 安装程序&#xff0c;方便开发者能一键安装所有 Java 开发环境。几乎是在三年前&#xff0c;在微软苏黎世办公室的编程马拉松中&#xff0c;来自 Red Hat&#xff0c;IBM&#xff0c;Codenvy 和 Microsoft 的…

CF1361C. Johnny and Megan‘s Necklace(构造,欧拉回路,传递闭包)

CF1361C. Johnny and Megan’s Necklace Solution 真duliu&#xff0c;快做吐了。。。 刚开始想了一个假做法&#xff08;但前面还是很真的&#xff09;。 假的做法大概是你发现这个东西具有传递性&#xff0c;因此你考虑把aia_iai​翻转后在后面补0直到20位之后&#xff0…

Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 大体题意跟easyeasyeasy版本差不多&#xff0c;就是hardhardhard版本的aaa范围更大。见这里Codeforces Round #601 (Div. 2) 思路&#xff1a; 首先还是考虑质因子分解&#xff0c;因为一个数被分成以xyxy…

[译]C#中的条件断点

这只是你们许多人中可能使用的一个简单技巧。这是一个小但非常强大的技巧&#xff0c;在你调试大型代码库时尤其有用。这是条件断点的概念。正如名称本身所暗示的那样&#xff0c;只有在满足某个条件时才会设置被击中的断点。它也很容易实现。创建一个新的应用程序并设置一个普…

CF1090F - How to Learn You Score(构造)

CF1090F - How to Learn You Score Solution 很不戳的构造题。 首先观察数据范围&#xff1a;n∈[5,1000]n\in[5,1000]n∈[5,1000]&#xff0c;这启发我们什么&#xff1f;n5n5n5的时候解是唯一的&#xff0c;因此我们可以把nnn切成若干段长度为555的段&#xff0c;每一段分…

前菜---二叉树+堆的小练习

目录 前言&#x1f3dc;️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习&#x1f3d5;️ 3. 答案解析&#x1f4a1; 4. 堆概念结构小练习&#x1fa94; 5. 答案解析&#x1f9ff; 6. 前/中/后/层序遍历小练习&#x1f52b; 7. 答案解析&#x1f9fa; 后语…

牛客 CCA的区间 dp + 补集转移

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先翻转一个区间意味着可以将任意两段不相交的区间组合&#xff0c;所以问题变成了选两端不相交的区间&#xff0c;使得合并后区间和最大。那么我们就处理出来区间&#xff0c;让后进行转…

ASP.NET Core IP 请求频率限制

在网站或API应用中&#xff0c;我们为了防止无聊人士或恶意攻击&#xff0c;通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中&#xff0c;限制IP请求频率非常简单&#xff0c;我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛&#xff0c;轮子也越来越多。只…

2019 秦皇岛 I - Invoker Gym - 102361I dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 累了&#xff0c;略。 思路&#xff1a; 将这101010个串打乱顺序&#xff0c;每个串最多有666种情况&#xff0c;全部写出来&#xff0c;让后连边。最后直接在转移的时候分别从上一个字符的666个状态转移就…

CF1016G. Appropriate Team(Pollard-pho,FWT,数论)

CF1016G. Appropriate Team Solution 相当于选出的两个数需要满足不存在一个质因子ppp&#xff0c;aia_iai​在ppp的指数比XXX多&#xff0c;aja_jaj​在ppp的指数比YYY少。 我们用Pollard−phoPollard-phoPollard−pho求出YYY所有最多151515个质因数&#xff0c;然后把所有…

Exceptionless - .Net Core开源日志框架

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/11020140.html官网地址&#xff1a;http://letyouknow.net今天要给大家介绍的Exceptionless是一个基于 .net core的开源日志框架&#xff0c;Exceptionless的意思是&#xff1a;没有异…

CF981E Addition on Segments 线段树分治 + bitset优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们考虑如果我们选择的区间都包含某个位置&#xff0c;那么这个位置一定是最大值。那么对于每个位置&#xff0c;我们枚举包含其的区间&#xff0c;让后每次加xxx都用bitsetbitsetbitset来…

CF1146F - Leaf Partition(树形dp)

CF1146F - Leaf Partition Solution 感觉做这种细节很多的分类讨论树形dp还是有点乱。 大概有一个naivenaivenaive的想法是&#xff0c;我们令fx,0/1f_{x,0/1}fx,0/1​表示以xxx为根的子树&#xff0c;xxx结点有没有颜色的方案数。 然后如果存在两个有颜色的儿子&#xff0…

开源基于Canal的开源增量数据订阅消费中间件

canal 是阿里巴巴开源的一款基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。我开发的这个CanalSync项目 https://github.com/yuzd/CanalSync >觉得不错帮忙给个star谢谢是基于canal-server之上的数据库同步&消费中间件&#…

E2. Square-free division (hard version) dp + 质因子分解

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你长度为nnn的数组&#xff0c;让后最多修改其中kkk个数(可以修改为任意数)&#xff0c;让后问你分成的最少组是多少。这个组内元素是连续的且不存在任意两个数的积为平方数。 思路&#xff1a; 首先两个…

CF1000G. Two-Paths(树形dp)

CF1000G. Two-Paths Solution 我们发现除了树上(x,y)(x,y)(x,y)最短路径上的边经过一次&#xff0c;其余边要么走000次&#xff0c;要么走222次。 因此考虑先假设每条边走两次&#xff0c;最后把走一次的边的贡献加上。 我们把从(x,y)(x,y)(x,y)路径上的点扩展出去连痛块的…

不装 VS 自己编译安装 Windows Terminal

Windows Terminal 一直没有发布可以直接安装的二进制文件&#xff0c;想自行编译的时候&#xff0c;看到系统需求中包含体积巨大的 Visual Studio 和 Windows SDK&#xff0c;脑袋都大了。直接下载其他人编译好的安装包又不放心&#xff0c;那么就想个办法避免在本地环境编译吧…