bzoj 5218: [Lydsy2017省队十连测]友好城市
题意:


这题显然直接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省队十连测]友好城市的更多相关文章
- 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)
		传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ... 
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
		[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 93 Solved: 53[Submit][Status][ ... 
- bzoj 5216: [Lydsy2017省队十连测]公路建设
		5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 66 Solved: 37[Submit][St ... 
- bzoj 5217: [Lydsy2017省队十连测]航海舰队
		Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ... 
- BZOJ 5215: [Lydsy2017省队十连测]商店购物
		裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ... 
- @bzoj - 5219@ [Lydsy2017省队十连测]最长路径
		目录 @description@ @solution@ @accepted code@ @details@ @description@ 在Byteland一共有n个城市,编号依次为1到n,形成一个n个 ... 
- Lydsy2017省队十连测
		5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ... 
- 【BZOJ 5222】[Lydsy2017省队十连测]怪题
		题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ... 
- 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)
		传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ... 
随机推荐
- 开启Hyper-V
			开启Hyper-V 添加方法非常简单,把以下内容保存为.cmd文件,然后以管理员身份打开这个文件.提示重启时保存好文件重启吧,重启完成就能使用功能完整的Hyper-V了. pushd "%~ ... 
- VMware虚拟机Linux配置
			1.设置时区和时间 打开虚拟机,设置好用户名和密码,就可以进入了. 进入之后,可以先设置时区和时间 在CentOS桌面右上角,点击时间,然后进行设置 2.添加用户使用root权限 安装虚拟机之后,登录 ... 
- idea git提交代码步骤
			这位兄台已经写的很清楚了... 我这里直接给你们链接把... https://blog.csdn.net/u013452337/article/details/79956604 Git 初次提交,以及 ... 
- i2c中start和restart的区别【转】
			有的硬件芯片提供了一个个寄存器,供我们很好的操作i2c,但是,在用的时候,我们是不知道他到地是怎么操作的,下边,我就探讨下i2c中的start和restart的区别. start是在scl是高电平的时 ... 
- combination sum && combination sum II
			1.Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), f ... 
- Yii2中$model->load($data)一直返回false问题
			上次使用$model->load()方法时一直返回false,数据添加不成功,这里记录一下: 出错代码: $data = [ 'name' => 'test', 'phone' => ... 
- 【ES6学习笔记之】Object.assign()
			基本用法 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const sou ... 
- Linux下dos2unix命令将windows文件编码格式dos转换成Unix格式
			问题描述: 在Windows系统下面使用文本编辑器notepad后传到Linux系统下的话 Linux下处理和执行一般都存在一些问题,我们可以通过命令查看文件是否是dos格式的, 如果有如图所示的M标 ... 
- 经验之谈-switch结构常见错误的分析与处理
			1.缺少break语句 本来只想输出“出任武林盟主”可输出结果为 错误分析:在 switch结构中,每一个case语句块后面如果不写 break语句, switch就会 直接往下面的case语句块运行 ... 
- Java中Atomic类的使用分析
			1:为什么会出现Atomic类 在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 稍有经验的同学都知道这种写法是线程不安全的.为了达到线程安全的目的,我们通常会用synchro ... 
