【CodeForces】901 C. Bipartite Segments
【题意】给定n个点m条边的无向连通图,保证不存在偶数长度的简单环。每次询问区间[l,r]中包含多少子区间[x,y]满足只保留[x,y]之间的点和边构成的图是一个二分图。
【算法】Tarjan缩点(找环)
【题解】如果两个奇数长度的环相交,会得到一个偶数长度的简单环。所以原图是不存在偶数长度环的仙人掌(每条边只属于一个简单环)。
二分图的定义:一个图是二分图当且仅当不存在奇数长度的环。在当前仙人掌上,二分图实际上要求选择的点不存在环。
也就是对于图上已有的每个环x有最小编号点min(x)和最大编号点max(x),区间不能同时包含min(x)和max(x)。(找环可以用Tarjan缩点)
为了统计区间数量,我们预处理r[i]表示以i为区间左端点,区间右端点最远到达r[i],初始r[min(x)]=max(x)-1,然后统计后缀最小值就可以得到r[]数组。
对于询问的区间i∈[l,r],若i>r则ans+=r-i+1,否则ans+=r[i]-i+1。容易发现r[]数组单调递增,所以可以二分求解转折点。
复杂度O(n log n)。
边编号不能为0 QAQ
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
using namespace std;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
int tot=,first[maxn],low[maxn],dfn[maxn],dfsnum=,c[maxn],n,m,mins[maxn],maxs[maxn],s[maxn],d[maxn];
ll sum[maxn],ss[maxn];
bool iscut[maxn];
struct edge{int v,from;}e[maxn*];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}//
void tarjan(int x,int fa){
low[x]=dfn[x]=++dfsnum;
for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
if(!dfn[e[i].v]){
tarjan(e[i].v,x);
low[x]=min(low[x],low[e[i].v]);
if(low[e[i].v]>dfn[x])iscut[i]=iscut[i^]=;
}else low[x]=min(low[x],dfn[e[i].v]);
}
}
void dfs(int x,int y){
c[x]=y;d[y]++;
for(int i=first[x];i;i=e[i].from)if(!iscut[i]&&!c[e[i].v])dfs(e[i].v,y);
} int main(){
n=read();m=read();
for(int i=;i<=m;i++){
int u=read(),v=read();
insert(u,v);insert(v,u);
}
tarjan(,);int cnt=;
for(int i=;i<=n;i++)if(!c[i])dfs(i,++cnt);
memset(mins,0x3f,sizeof(mins));
for(int i=;i<=n;i++){
mins[c[i]]=min(mins[c[i]],i);
maxs[c[i]]=max(maxs[c[i]],i);
}
for(int i=;i<=n;i++)s[i]=n;
for(int i=;i<=cnt;i++)if(d[i]>)s[mins[i]]=maxs[i]-;
for(int i=n-;i>=;i--)s[i]=min(s[i],s[i+]);
for(int i=;i<=n;i++)sum[i]=sum[i-]+(s[i]-i+),ss[i]=ss[i-]+i;
int q=read();
while(q--){
int u=read(),v=read();
int x=lower_bound(s+u,s+v+,v)-s;
ll ans=;
ans+=sum[x-]-sum[u-];
ans+=1ll*(v-x+)*(v+)-(ss[v]-ss[x-]);
printf("%lld\n",ans);
}
return ;
}
【CodeForces】901 C. Bipartite Segments的更多相关文章
- 【CodeForces】901 B. GCD of Polynomials
[题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...
- 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP
题意 给一张$n\times m$二分图,带点权,问有多少完美匹配子集满足权值和大于等于$t$ 这里有一个结论:对于二分图$\mathbb{A}$和$\mathbb{B}$集合,如果子集$A \in ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 【CodeForces】899 E. Segments Removal
[题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. ...
- 【CodeForces】601 D. Acyclic Organic Compounds
[题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...
- 【Codeforces】849D. Rooter's Song
[算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
- 【CodeForces】925 C.Big Secret 异或
[题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...
随机推荐
- prototype.js中Function.prototype.bind方法浅解
prototype.js中的Function.prototype.bind方法: Function.prototype.bind = function() { var __method = this; ...
- 解释Spring中IOC, DI, AOP
oc就是控制翻转或是依赖注入.通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象.aop就是面向切面的编程.比如说 ...
- 【week10】psp
项目 内容 开始时间 结束时间 中断时间 净时间 2016/11/19(星期六) 写博客 吉林一日游规格说明书 10:30 15:10 20 260 2016/11/20(星期日) 看论文 磷酸化+三 ...
- (转)Elasticsearch search-guard 插件部署
我之前写了ELK+shield的部署文档,由于shield是商业收费的,很多人都推崇开源项目search-guard来做ELK的安全组件,准确来说是elasticsearch的安全组件.search- ...
- Android 混淆签名打包
1.混淆文件 proguard-rules.pro # Add project specific ProGuard rules here. # By default, the flags in thi ...
- 【HLSDK系列】服务端实体 edict_t 和 控制类
我们来了解一下引擎是怎么管理实体的吧!我们这里就说说服务端的实体(edict_t) 服务端用 edict_t 这个结构体来保存一个实体,可以说一个 edict_t 就是一个 服务端实体,下文简称实体. ...
- Now or later UVALive - 3211(2-SAT 最小值最大化)
emmm...去吃早饭了... rujia讲的很好.. 最小值最大化问题,,,二分枚举答案 设x1.x2为同一个集合中的元素,y1.y2为另一个集合中的元素,如果x1与y1之差小于mid,那么如果 ...
- 【JavaScript】BOM
一.前言 接着前一章的内容,继续Js的学习. 二.内容 window对象 //确定窗口位置 var leftPos = (typeof window.screenLeft == &quo ...
- 【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)
[BZOJ1416/1498][NOI2006]神奇的口袋(数论,概率) 题面 BZOJ1416 BZOJ1498 洛谷 题面都是图片形式是什么鬼.. 题解 考虑以下性质 1.\(x[1],x[2]. ...
- JS中如何使用EL表达式中的对象
JS中如何使用EL表达式中的对象 2017年09月25日 15:33:09 lhpnba 阅读数:4859 1.js中使用el表达式要加双引号或单引号:'${list}' 2.js变量获取el表达 ...