题目链接  Bipartite Segments

题意  给出一个无偶环的图,现在有$q$个询问。求区间$[L, R]$中有多少个子区间$[l, r]$

  满足$L <= l <= r <= R$,并且一个只包含$l$到$r$这些点的无向图为二分图。

因为整张图没有偶环,所以在这道题中如果某个无向图没有环,那个这个无向图就是二分图

Tarjan求出每个环的标号最小点和标号最大点。

令$f[i]$为能保证$[i, j]$这个区间构成的图都是二分图的$j$的最大值,则$f[i]$是不下降的

当询问区间$[L, R]$的时候,即求$\begin{equation*}\sum_{i=L}^Rmin(f(i), R) - i + 1\end{equation*}$

二分然后分类讨论即可

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 3e5 + 10; int f[N], dfn[N], stk[N];
int n, m, ti = 0;
int q, top;
LL s[N];
vector <int> v[N]; void dfs(int x, int fa){
dfn[x] = ++ti;
stk[++top] = x;
for (auto u : v[x]){
if (u == fa) continue;
if (dfn[u]){
if (dfn[u] < dfn[x]){
int mx = u, mi = u;
for (int p = top; stk[p] != u; --p){
mi = min(mi, stk[p]);
mx = max(mx, stk[p]);
}
f[mi] = mx;
}
}
else dfs(u, x);
}
--top;
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, m){
int x, y;
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
} rep(i, 1, n) if (!dfn[i]) dfs(i, 0);
rep(i, 1, n) if (f[i]) --f[i]; else f[i] = n;
dec(i, n - 1, 1) f[i] = min(f[i], f[i + 1]);
rep(i, 1, n) s[i] = s[i - 1] + f[i]; scanf("%d", &q);
while (q--){
int x, y;
scanf("%d%d", &x, &y);
if (f[x] > y){
LL num = y - x + 1;
printf("%lld\n", 0ll - 1ll * (x + y) * num / 2 + 1ll * y * num + num);
continue;
} int l = x, r = y;
while (l + 1 < r){
int mid = (l + r) >> 1;
if (f[mid] <= y) l = mid; else r = mid - 1;
} int t;
if (f[r] <= y) t = r; else t = l; int u = t + 1;
LL num = y - x + 1;
LL ans = num - 1ll * (x + y) * num / 2; LL et = y - u + 1;
ans = ans + (s[t] - s[x - 1]);
if (et > 0) ans = ans + 1ll * y * et;
printf("%lld\n", ans); }
return 0;
}

  

Codeforces 901C Bipartite Segments(Tarjan + 二分)的更多相关文章

  1. Codeforces 901C Bipartite Segments

    Bipartite Segments 因为图中只存在奇数长度的环, 所以它是个只有奇数环的仙人掌, 每条边只属于一个环. 那么我们能把所有环给扣出来, 所以我们询问的区间不能包含每个环里的最大值和最小 ...

  2. Codeforces 901C. Bipartite Segments(思维题)

    擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...

  3. Codeforces Round #453 (Div. 1) 901C C. Bipartite Segments

    题 http://codeforces.com/contest/901/problem/C codeforces 901C 解 首先因为图中没有偶数长度的环,所以: 1.图中的环长度全是奇数,也就是说 ...

  4. 【CodeForces】901 C. Bipartite Segments

    [题目]C. Bipartite Segments [题意]给定n个点m条边的无向连通图,保证不存在偶数长度的简单环.每次询问区间[l,r]中包含多少子区间[x,y]满足只保留[x,y]之间的点和边构 ...

  5. codeforces 895B XK Segments 二分 思维

    codeforces 895B XK Segments 题目大意: 寻找符合要求的\((i,j)\)对,有:\[a_i \le a_j \] 同时存在\(k\),且\(k\)能够被\(x\)整除,\( ...

  6. Bipartite Segments CodeForces - 901C (区间二分图计数)

    大意: 给定无向图, 无偶环, 每次询问求[l,r]区间内, 有多少子区间是二分图. 无偶环等价于奇环仙人掌森林, 可以直接tarjan求出所有环, 然后就可以预处理出每个点为右端点时的答案. 这样的 ...

  7. CF901C Bipartite Segments[点双+二分+前缀优化]

    不想翻译了,直接放luogu翻译 说了没有偶环,也就是说全是奇环,再结合二分图性质,那么暴力的话,固定左端点,增大序号,加点直到产生环就不合法了.也就是说,任何一个环,只要他上面的数全都被加了,就不合 ...

  8. CodeForces 377B---Preparing for the Contest(二分+贪心)

    C - Preparing for the Contest Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  9. Codeforces 484B Maximum Value(高效+二分)

    题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,而且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然 ...

随机推荐

  1. rope(转载)

    谈c++ pb_ds库(一)rope大法好 (转载)原文链接 https://www.cnblogs.com/keshuqi/p/6257642.html 参考资料 1)官方说明 支持 sorry,c ...

  2. UVALive 4685 Succession 树DP+背包

    一.前言 这道题同样来自于红书P142,作为树DP专题中的一道比较难的题目,A了一天左右的时间,看上去事实证明,这题的难度理我本身的实力还是有些太远了,于是正确的做法应该是分析一下题目之后进行解析什么 ...

  3. Flume-NG源码分析-整体结构及配置载入分析

    在 http://flume.apache.org 上下载flume-1.6.0版本,将源码导入到Idea开发工具后如下图所示: 一.主要模块说明 flume-ng-channels 里面包含了fil ...

  4. adb offline解决办法

    假如你连接手机之后,adb devices找不到设备,或者找到了设备,但是device ID后总是offline的状态,那估计就是驱动有问题. 强烈建议1.安装豌豆荚,它可以自己主动修复手机驱动,一般 ...

  5. HTML5/CSS3速成教程

    http://www.w3cfuns.com/thread-5592317-1-1.html

  6. C++指针详解 (转)

    C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...

  7. Linux内核使用毫秒延时函数

    毫秒延时函数:mdelay() 微妙延时函数:ndelay() #ifndef mdelay #define mdelay(n) (/ (__builtin_constant_p(n) &&a ...

  8. 翻译MDN里js的一些方法属性

    TypeError The TypeError object represents an error when a value is not of the expected type. [TypeEr ...

  9. php+mysqli预处理技术实现添加、修改及删除多条数据的方法

    本文实例讲述了php+mysqli预处理技术实现添加.修改及删除多条数据的方法.分享给大家供大家参考.具体分析如下: 首先来说说为什么要有预处理(预编译)技术?举个例子:假设要向数据库添加100个用户 ...

  10. 文本文件txt生成excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...