题意:



这题显然直接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. golang协程同步的几种方法

    目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几 ...

  2. pyecharts画图总结

    pyecharts 画图归纳 将本地文件导入到Pyecharts: test = open(filename, 'r') data = test.readlines() test.close() 如果 ...

  3. 龙芯(mips64)电脑安装NodeJS

    背景 龙芯是国产的cpu,采用是mips架构,就类似大家熟知的x86.arm. 最近在一台龙芯电脑(系统是中兴新支点,Linux)上调试前端应用(electron),于是就需要安装NodeJS. 但是 ...

  4. CSS入门(定位的简单总结)

    一.定位 普通流定位 浮动定位 相对定位 绝对定位 固定定位 二.position定位 1.static(默认值) 2.relative 相对定位 3.absolute 绝对定位 4.fixed 固定 ...

  5. git命令行的颜色配置

    Git颜色branch,diff,interactive,status配置,git终端配置颜色,git命令行高亮 Git默认的输出是单一颜色的,感觉很不容易阅读,Git支持用多种颜色来显示其输出的信息 ...

  6. VUE组件 之 Drawer 抽屉

    注:因为项目中用的是 element-ui 框架,而这个框架并没有抽屉组件,所以自己实现一个. 一.源码地址 https://github.com/imxiaoer/DrawerForVue 二.效果 ...

  7. Unable to connect to the server: x509: certificate signed by unknown authority

    0x00 Problem 在使用二进制搭建 k8s 集群的过程中,使用 kubectl get 等操作时始终显示 x509: certificate signed by unknown authori ...

  8. post请求四种传送正文的方式

    一.简介 HTTP协议规定post提交的数据必须放在消息主体(entity-body)中,但协议没有规定数据必须使用什么编码方式.HTTP协议是以ASCII码传输,建立再TCP/IP协议之上的应用层规 ...

  9. PostgreSQL 安装 & 用户配置

    一.为什么选择 PostgreSQL 自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. MySQL被oracle收购,innodb随之被oracle控制. 二 ...

  10. Dicom文件支持中文字符

    Dicom文件的默认字符集编码为ISO-IR6,这种字符集是不支持中文的,当使用Dicom工具修改病人姓名后,名字会成乱码而无法正常显示,如下图: 知道了原因就知道解决办法了,修改Dicom的字符集( ...