Description

           琥珀色黄昏像糖在很美的远方,思念跟影子在傍晚一起被拉长……
Description
      小 B 带着 GF 去逛公园,公园一共有 n 个景点,标号为 1 . . . n。景点之间有 m 条路径相连。
      小 B 想选择编号在一段区间 [l, r] 内的景点来游玩,但是如果这些景点的诱导子图形成了环,那么 GF 将会不高兴。
      小 B 给出很多个询问 [x, y],想让你求有多少个区间 [l, r] 满足 x ≤ l, r ≤ y 且不会使 GF不高兴。
 

Input

第一行为两个整数 n, m,表示景点和路径的数量。
第 2 . . . m + 1 行每行两个整数 ui, vi 表示第 i 路径的两端。
第 m + 2 行是一个整数 q 表示询问的个数,接下来 m 行每行两个整数 xi, yi 表示询问。

Output

q 行,每行一个整数表示答案。
 

Sample Input

8 9
1 2
2 3
3 1
4 5
5 6
6 7
7 8
8 4
7 2
3
1 8
1 4
3 8
 

Sample Output

27
8
19  
 

Data Constraint

对于 30% 的数据,n, m ≤ 100。
对于另外 10% 的数据,n = m + 1。
对于另外 10% 的数据,n = m
对于 100% 的数据,n, m ≤ 3 × 10^5, xi ≤ yi,不存在重边、自环,不存在一条边同时存在于两个不同的简单环。
 
做法(摘自JZOJ):我们先 DFS 出图的每一个环,得到环上编号最小和最大的节点,那么合法的区间一定不 能同时跨过这两个点。于是我们搞出一个 R 数组,R[i] 表示以 i 作为左端点时右端点最右可 以到哪个位置。R 数组显然是单调递增的。 对于询问 l, r,我们二分出一个位置 i 满足 R[l . . . i − 1] ≤ r,R[i . . . r] ≥ r,直接计算即可
 #include <cstdio>
#include <cstring>
#include <iostream>
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define N 500007
using namespace std;
int n,m,ls[N],tot,cnt,num,top,Q;
int dfn[N],low[N],stack[N];
int can[N];
long long sum[N]; struct edge{
int to,next;
}e[N*];
struct arr{
int mx,mi;
}a[N]; void Add(int x,int y){
e[++tot].to=y;
e[tot].next=ls[x];
ls[x]=tot;
} void Init(){
scanf("%d%d",&n,&m);
rep(i,,m){
int u,v;
scanf("%d%d",&u,&v);
Add(u,v);
Add(v,u);
}
} void tarjan(int x,int pre){
dfn[x]=low[x]=++num;
stack[++top]=x;
for (int i=ls[x];i;i=e[i].next){
int v=e[i].to;
if (v==pre) continue;
if (!dfn[v]){
tarjan(v,x);
low[x]=min(low[x],low[v]);
if (dfn[x]<=low[v]){
cnt++;
a[cnt].mi=1e9;
int tmp=top;
while(top){
int y=stack[top--];
a[cnt].mi=min(a[cnt].mi,y);
a[cnt].mx=max(a[cnt].mx,y);
if (y==v) break;
}
a[cnt].mi=min(a[cnt].mi,stack[top]);
a[cnt].mx=max(a[cnt].mx,stack[top]);
if (tmp-top>) can[a[cnt].mi]=min(can[a[cnt].mi],a[cnt].mx-);
}
}
else low[x]=min(low[x],dfn[v]);
}
} void Work(){
scanf("%d",&Q);
while(Q--){
int x,y;
long long ans=;
scanf("%d%d",&x,&y);
int l=x,r=y,pos;
while (l<=r){
int mid=(l+r)/;
if (can[mid]>=y) pos=mid,r=mid-;
else l=mid+;
}
ans=sum[pos-]-sum[x-];
ans+=(long long)(y-pos+)*(y-pos+)/;
printf("%lld\n",ans);
}
} int main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
Init();
rep(i,,n) can[i]=n;
rep(i,,n) if(!dfn[i]) tarjan(i,);
for(int i=n-;i>=;i--) can[i]=min(can[i],can[i+]);
for(int i=;i<=n;i++) sum[i]=sum[i-]+(long long)(can[i]-i+);
Work();
}

JZOJ 5919. 逛公园的更多相关文章

  1. [vijos P1083] 小白逛公园

    不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...

  2. Bzoj 1756: Vijos1083 小白逛公园 线段树

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1021  Solved: 326[Submit][Statu ...

  3. BZOJ 1756: Vijos1083 小白逛公园

    题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 856  Solved: 264[Submit][Sta ...

  4. JDOJ-P1260 VIJOS-P1083 小白逛公园

    首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memor ...

  5. [NOIP2017] 逛公园

    [NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...

  6. [NOIp 2017]逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

  7. 【NOIP 2017】逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要 ...

  8. 逛公园 [NOIP2017 D1T3] [记忆化搜索]

    Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...

  9. [luogu P3953] [noip2017 d1t3] 逛公园

    [luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...

随机推荐

  1. StreamReader类

    StreamReader类用于从文件中读取数据,该类是一个通用类,可用于任何流,构造方法和StreamWrite类格式一样的. 创建方式有两种: 1.先创建Filestream类在创建StreamRe ...

  2. ThinkPHP find大坑 不要随便用

    举例: M("User")->find(3); $m=M("User"); $m->userName="aaa"; $m-> ...

  3. MacOS python自动补全设置

    1. 新建python自动补全脚步 $ cd <workdir> $ touch tab.py $ vim tab.py,输入如下内容后保存 $ chmod +x tab.py #!/us ...

  4. jQuery属性选择器中加变量

    $(function () { $('#bkhandle').on('click','#bkdel',function () { $.ajax( { url:"{% url 'bkdel' ...

  5. Dreams save us. Dreams lift us up and transform us into something better.

    Dreams save us. Dreams lift us up and transform us into something better.梦想能够拯救我们.梦想能够激励我们并让我们成为更好的人 ...

  6. 转:ACCESS数据库转ORACLE数据库分享

    来源: 作者:zz 网上有很多文章介绍access转oracle数据库的方法,本人都尝试了,不是很成功,列举一下,后来人不必盲目试了,基本不成功: 1.Access-->excel-->P ...

  7. Office加载项安装

    出自我的个人主页 Alvin Blog 前言 Excel加载项离不开安装,Excel加载项本身安装及其简单,但这是在申请下来Office开发者账户之后,再次之前都得自行安装 线上安装 微软申请开发者账 ...

  8. 使用BaiDu Java Script Web Api 在Web开发中嵌入地图使用步骤

    前言 很多做企业网站的朋友,都喜欢有一个关于我们.联系我们的栏目,那么这个栏目放什么内容才能饱满那,只有放个地图才显得有点高大上. 一.产生并复制访问Api的密钥(AK) 1.首先我们需要注册一个百度 ...

  9. 3dsmax2014的下载、安装与注册激活教程详解

    3dsmax2014的下载.安装与注册激活教程,虽然网上类似的教程文章不胜枚举,但大多比较粗枝大叶,没有详细的步骤,尤其对于电脑小白来说,更是不易参考,今天我就教大家如何注册破解3dsmax2014吧 ...

  10. ARM实验2 —— 蜂鸣器实验

    PWM蜂鸣器实验: 实验内容: 编写PWM模块程序,通过PWM控制FS_4412平台上的蜂鸣器. 实验目的: 熟悉开发环境. 掌握exynos4412处理器的PWM功能. 实验平台: FS_4412开 ...