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分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...
随机推荐
- ABAP分享五 ALV修改单元格并将修改数据更新到数据表中示例1
*下面的代码是在alv字段中修改字段的内容,点击保存后就可以保存数据至数据表. TABLES: spfli. DATA: wa_fieldcat TYPE lvc_s_fcat , " 相 ...
- 搭建Vue开发环境
1.安装Node.js 安装包下载地址: https://nodejs.org/en/ 安装时可以选择是否自动安装必要的工具,如Chocolatey.Python2,这里我选择了自动安装 Node.j ...
- Test Case:: 12C ASM New feature (Doc ID 1571975.1)
Test Case:: 12C ASM New feature (Doc ID 1571975.1) APPLIES TO: Oracle Database - Enterprise Edition ...
- 如何在linux终端创建文件
我们都知道可以用mkdir命令创建一个新的目录,但更多时候如果能直接创建一个文件(普通文件)会让人感觉更愉悦:这样就可以不用在去打开一个专门的创建文本文件的软件,然后还要设置文件名,保存路径那样的繁琐 ...
- MATLAB实例:绘制条形图
MATLAB实例:绘制条形图 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用MATLAB绘制条形图,自定义条形图的颜色.图例位置.横坐标名称.显示条 ...
- Django回顾--配置文件
""" Django settings for meiduo_mall project. Generated by 'django-admin startproject' ...
- 从数据表字段 float 和 double 说起
今天在公司讨论项目重构的问题时,公司的 DBA 针对表中的字段大概介绍了一下 float 和 double 的存储方式.然后,我发现这个问题又回到了浮点数类型在内存中的存储方式,即 IEEE 对浮点数 ...
- Github新项目Dress(好耶是女装)
面向可爱的蓝孩子 (/ω\) 的 git 学习实践项目,包含了600多位蓝孩子的女装照,访问前做好心理准备. 每个人都可以成为这个项目的参与者 访问地址:https://github.com/kome ...
- 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案
本文源码:GitHub·点这里 || GitEE·点这里 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 (1 ...
- uni-app中onLoad不起作用
最近开始使用uni-app,坑还是很多的 今天在使用onLoad是发现,页面上的onLoad方法是可以起作用的,但是组件中的onLoad方法并没有起作用 后来经过一番尝试后还是不行,看文档发现uni- ...