博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZJOI2012]灾难
阅读量:5735 次
发布时间:2019-06-18

本文共 1304 字,大约阅读时间需要 4 分钟。

OJ题号:BZOJ2815、洛谷2597

思路:

先将所有的“生产者”连接至0号点“太阳”,然后用kahn求拓扑序。 、

易证一种生物会灭绝当且仅当他的所有食物均灭绝,
而所有食物均灭绝当且仅当他们的LCA灭绝。
按照拓扑序依次将各点加入新图,同时求该点所有食物的LCA,将该点作为LCA的儿子。
DFS遍历求各点后代数量。
注意倍增时不能直接循环到logN,而要循环到log2(dep)。

1 #include
2 #include
3 #include
4 #include
5 #include
6 inline int getint() { 7 int ch; 8 while(!isdigit(ch=getchar())); 9 int x=ch^'0';10 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');11 return x;12 }13 const int N=65535,logN=17;14 std::vector
c[N],p[N];15 std::queue
top;16 int anc[N][logN]={ 0},dep[N]={ 0},in[N]={ 0};17 void kahn(const int x) {18 std::queue
q;19 q.push(x);20 while(!q.empty()) {21 int v=q.front();22 q.pop();23 top.push(v);24 for(unsigned int i=0;i
newc[N];31 inline void swap(int &a,int &b) {32 int t;33 t=a;34 a=b;35 b=t;36 }37 inline int LCA(int a,int b) {38 if(dep[a]
=0;i--) {40 if(dep[a]-(1<
=dep[b]) a=anc[a][i];41 }42 if(a==b) return a;43 for(int i=(int)log2(dep[a]);i>=0;i--) {44 if(anc[a][i]!=anc[b][i]) a=anc[a][i],b=anc[b][i];45 }46 return anc[a][0];47 }48 int ans[N]={ 0};49 void getans(const int x) {50 for(unsigned int i=0;i

 

转载于:https://www.cnblogs.com/skylee03/p/7148742.html

你可能感兴趣的文章
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>
【http】post和get请求的区别
查看>>
/etc/profile
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
编写who命令
查看>>
2.1 sikuli 中编程运行
查看>>
愚公移山第一章伪代码
查看>>
常见的位运算技巧总结(膜wys)
查看>>
python魔法函数(二)之__getitem__、__len__、__iter__
查看>>
EL表达式无法显示Model中的数据
查看>>
Linux应用小技巧
查看>>
考题纠错2
查看>>
ps6-工具的基础使用
查看>>
关于CefSharp.WinForms的学习
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
linux 参数内核
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
计组_定点数一位乘_布斯公式
查看>>