题目链接  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. [Uva1642]魔法Gcd(数论)

    Description 给定n个数,某个连续区间[L,R]的收益为\(gcd(A_l,A_{l+1},A_{l+2}...A_r)*(r-l+1)\), 求收益最大的区间的收益值 \(1 \leq n ...

  2. java中equals和==区别

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变 ...

  3. leetcode 【 Remove Element 】python 实现

    题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...

  4. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)

    Oracle 安装.PL/SQL 配置使用  前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔 ...

  5. 移动弱网测试方案Network Emulator for Windows Toolkit

    移动app在测试时,有时需要考虑弱网的情形下,app的表现,那么怎么营造这样子的环境呢? 一.首先需要控制网络,有两种方式其一使用网络损伤仪进行,其二采用软件方式.硬件采购费用太贵,因此使用win平台 ...

  6. Python-S9-Day127-Scrapy爬虫框架2

    01 今日内容概要 02 内容回顾:爬虫 03 内容回顾:并发和网络 04 Scrapy框架:起始请求定制 05 Scrapy框架:深度和优先级 06 Scrapy框架:内置代理 07 Scrapy框 ...

  7. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  8. $.ajax相关用法

      ? $.ajax({             type: "GET",             url: "Services/EFService.svc/Member ...

  9. 【转】Using Raycasts and Dynamically Generated Geometry to Create a Line of Sight on Unity3D

    http://www.linkedin.com/pulse/using-raycasts-dynamically-generated-geometry-create-line-thomas José ...

  10. tail /grep/more

    1.tail -f 文件名 不断的刷新日志信息,实时的得到新追加到文件中的信息,常用来跟踪日志文件,如tail -f err.log Ctrl+C退出 2.grep '内容' 文件名 3.more 分 ...