题意:



这题显然直接tarjan是做不了的。

这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客

于是结合莫队,我们有了个暴力。

发现主要瓶颈是dfs过程中找最小的未经过的点,我们用bitset优化一下就过了。

注意有重边,不能直接在biset中删除,要开个邻接矩阵判一下。

code:

#include<bits/stdc++.h>
using namespace std;
#define re register
typedef long long ll;
const int maxn=200;
const int maxm=3*1e5+10;
const int maxq=50010;
int n,m,Q,t,block,nowl=1,nowr,tot,cnt;
int pos[maxm],size[maxn],a[maxn];
int cnt1[maxn][maxn],cnt2[maxn][maxn];
ll ans[maxq];
struct Edge{int u,v;}E[maxm];
struct Query{int l,r,id;}qr[maxq];
bitset<maxn>vis;
bitset<maxn>e1[maxn],e2[maxn];
inline int read()
{
re char c=getchar();re int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
char num[35];
inline void write(ll x)
{
if(!x){putchar('0');return;}
re ll tmp=x>0?x:-x;
if(x<0)putchar('-');
re int cnt=0;
while(tmp>0)
{
num[cnt++]=tmp%10+'0';
tmp/=10;
}
while(cnt>0)putchar(num[--cnt]);
}
inline bool cmp(Query x,Query y)
{
if(pos[x.l]==pos[y.l])
{
if(pos[x.l]&1)return x.r<y.r;
else return x.r>y.r;
}
else return x.l<y.l;
}
inline void add(int id)
{
re int x=E[id].u,y=E[id].v;
cnt1[x][y]++,cnt2[y][x]++;
if(cnt1[x][y]==1)e1[x].set(y);
if(cnt2[y][x]==1)e2[y].set(x);
}
inline void del(int id)
{
re int x=E[id].u,y=E[id].v;
cnt1[x][y]--,cnt2[y][x]--;
if(!cnt1[x][y])e1[x].reset(y);
if(!cnt2[y][x])e2[y].reset(x);
}
void dfs1(int x)
{
vis.reset(x);
bitset<maxn>now=vis&e1[x];
while(now.any())
{
dfs1(now._Find_first());
now&=vis;
}
a[++cnt]=x;
}
void dfs2(int x)
{
size[tot]++;vis.reset(x);
bitset<maxn>now=vis&e2[x];
while(now.any())
{
dfs2(now._Find_first());
now&=vis;
}
}
inline ll solve()
{
memset(size,0,sizeof(size));
vis.set();cnt=tot=0;
re ll res=0;
for(re int i=1;i<=n;i++)if(vis.test(i))dfs1(i);
vis.set();
for(re int i=cnt;i;i--)if(vis.test(a[i]))tot++,dfs2(a[i]);
for(re int i=1;i<=tot;i++)res+=size[i]*(size[i]-1)/2;
return res;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
n=read(),m=read(),Q=read();
for(re int i=1;i<=m;i++)E[i].u=read(),E[i].v=read();
for(re int i=1;i<=Q;i++)qr[i].l=read(),qr[i].r=read(),qr[i].id=i;
t=pow(m,1.0*3/5);
for(re int i=1;i<=m;i++)pos[i]=(i-1)/t+1;
sort(qr+1,qr+Q+1,cmp);
for(re int i=1;i<=Q;i++)
{
while(nowl<qr[i].l)del(nowl++);
while(nowl>qr[i].l)add(--nowl);
while(nowr<qr[i].r)add(++nowr);
while(nowr>qr[i].r)del(nowr--);
ans[qr[i].id]=solve();
}
for(re int i=1;i<=Q;i++,puts(""))write(ans[i]);
return 0;
}

bzoj 5218: [Lydsy2017省队十连测]友好城市的更多相关文章

  1. 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)

    传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...

  2. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 93  Solved: 53[Submit][Status][ ...

  3. bzoj 5216: [Lydsy2017省队十连测]公路建设

    5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 66  Solved: 37[Submit][St ...

  4. bzoj 5217: [Lydsy2017省队十连测]航海舰队

    Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ...

  5. BZOJ 5215: [Lydsy2017省队十连测]商店购物

    裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ...

  6. @bzoj - 5219@ [Lydsy2017省队十连测]最长路径

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在Byteland一共有n个城市,编号依次为1到n,形成一个n个 ...

  7. Lydsy2017省队十连测

    5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...

  8. 【BZOJ 5222】[Lydsy2017省队十连测]怪题

    题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...

  9. 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)

    传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...

随机推荐

  1. CAD怎么算面积?这种方法你要知道

    在CAD中,打开可能都是用过CAD制图软件,这是一个比较强大的绘图软件,可以绘制出各种类型的CAD图纸文件,还可以将绘制好的图纸面积进行测量.那CAD怎么算面积?其实计算面积的方法有很多中,下面给大家 ...

  2. Execl数据上传到数据库

    =============================================================asp.net================================ ...

  3. GitLab基本设置-新增用户

    场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  4. windows重装系统后grub引导菜单修复方法(亲自实验过)

    问题: 电脑安装的是windows7+ubuntu 15.10双系统.windows重装后,grub引导界面消失. 解决方法有两大步: 1.进入ubuntu; 2.在ubuntu中修复grub. 一. ...

  5. shell中字典的一个用法示例

    1. shell中字典的用法示例, 数组用法同字典 2. 以上使用sell配合字典实现的功能, 使用awk能轻松搞定, 如下: awk '{print $2}' file.txt | sort | u ...

  6. Python关于去除字符串中空格的方法

    Python关于去除字符串中空格的方法 在编写程序时我们经常会遇到需要将字符串中的空格去掉的情况,通常我们可以使用下面几种解决方法: 1.strip()方法:该方法只能把字符串头和尾的空格去掉,但是不 ...

  7. SpringBoot控制台版图书借阅程序

    // 实验存档... 效果图: 完整程序:https://pan.baidu.com/s/1-d1J90dkEtM0WKkABu0K0Q 提取码:hcnm DAO层代码由MyBatis Generat ...

  8. JavaScript -- 筑基

    本片博客记录了我JavaScript筑基阶段的学习内容,JavaScript不是Java,但是我下意识的把它和java对比学习,有些地方比较有趣,有些地方从java角度看,简直匪夷所思,不过现在总体感 ...

  9. [算法]PriorityQueue的应用

    1. 数据流中的第K大元素 题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组 ...

  10. IE浏览器远程代码执行高危漏洞(CVE-2019-1367)

    IE浏览器远程代码执行高危漏洞(CVE-2019-1367)加固遇到的问题 一.背景介绍 Internet Explorer,是微软公司推出的一款网页浏览器.用户量极大.9月23日微软紧急发布安全更新 ...