HDU 5638 Toposort 线段树+贪心
题意:bc round 74
分析:
参考下普通的用堆维护求字典序最小拓扑序, 用某种数据结构维护入度小于等于k的所有点, 每次找出编号最小的, 并相应的减少k即可.
这个数据结构可以用线段树, 建立一个线段树每个节点[l,r]维护编号从ll到rr的所有节点的最小入度, 查询的时候只需要在线段树上二分,
找到最小的x满足入度小于等于k.
复杂度O((n+m)logn)
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <queue>
- #include <cmath>
- using namespace std;
- typedef long long LL;
- const int mod=1e9+;
- const int INF=0x3f3f3f3f;
- const int N=1e5+;
- int d[N],o[N<<],head[N],p;
- struct Edge
- {
- int v,next;
- }edge[N*];
- void add(int u,int v)
- {
- edge[p].v=v;
- edge[p].next=head[u];
- head[u]=p++;
- }
- void pushup(int rt)
- {
- o[rt]=min(o[rt*],o[rt*+]);
- }
- void build(int rt,int l,int r)
- {
- if(l==r)
- {
- o[rt]=d[l];
- return;
- }
- int mid=(l+r)>>;
- build(rt*,l,mid);
- build(rt*+,mid+,r);
- pushup(rt);
- }
- void update(int rt,int l,int r,int pos)
- {
- if(l==r)
- {
- o[rt]=d[l];
- return;
- }
- int mid=(l+r)>>;
- if(pos<=mid)update(rt*,l,mid,pos);
- else update(rt*+,mid+,r,pos);
- pushup(rt);
- }
- int query(int rt,int l,int r,int c)
- {
- if(l==r)
- return l;
- int mid=(l+r)>>;
- if(o[rt*]<=c)return query(rt*,l,mid,c);
- else return query(rt*+,mid+,r,c);
- }
- int main()
- {
- int T,n,m,k;
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d%d%d",&n,&m,&k);
- memset(head,-,sizeof(head));
- memset(d,,sizeof(d));
- p=;
- for(int i=;i<m;++i)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- add(u,v);
- ++d[v];
- }
- build(,,n);
- LL ans=;
- for(int i=;i<=n;++i)
- {
- LL x=query(,,n,k),y=i;
- ans=(ans+x*y%mod)%mod;
- k-=d[x];
- d[x]=INF;
- update(,,n,x);
- for(int j=head[x];~j;j=edge[j].next)
- {
- int v=edge[j].v;
- if(d[v]==INF)continue;
- --d[v];
- update(,,n,v);
- }
- }
- printf("%I64d\n",ans);
- }
- return ;
- }
HDU 5638 Toposort 线段树+贪心的更多相关文章
- HDU 2795 Billboard (线段树+贪心)
手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/article/details/77488127 URL: http ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...
- Bzoj5251 线段树+贪心
Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...
- 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码
- HDU 5638 Toposort 拓扑排序 优先队列
Toposort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 Description There is a directed acycli ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
随机推荐
- (转载)猫都能学会的Unity3D Shader入门指南(一)
原文地址 http://onevcat.com/2013/07/shader-tutorial-1/ 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚 ...
- The ‘Microsoft.ACE.OLEDB.12.0′ provider is not registered on the local machine. (System.Data)
When you try to import Excel 2007 or later “.xlsx” files into an SQL Server 2008 database you may ge ...
- DataTable经典报错{列/行已属于其他表}
Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除, 还可以通过datatable.RejectChange ...
- Dapper使用方法
这里记下Dapper容易忘的使用方法: 返回的数据可以有相同名称的列,会分配到不同的类上,默认使用Id这个列作为分割列 connection.Open(); //手动打开的话会保持长连接,否则每次查 ...
- C#正则表达式Regex类
C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...
- 1197: [HNOI2006]花仙子的魔法 - BZOJ
Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示 ...
- [转载]jquery cookie的用法
原文地址:http://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526663.html jQuery cookie是个很好的cookie插件 ...
- 对jQuery.isArray方法的分析
jQuery.isArray方法应于判断是不是数组,是的话返回true,否则返回false.调用如:jQuery.isArray([]),返回true.其实现源码如下: isArray: Array. ...
- uva 10827
与108类似 多加了两层循环 水过 #include <iostream> #include <cstring> #include <cstdio> #includ ...
- python参考手册--第4、5、6、7章
1.zip zip(s,t):将序列组合为一个元组序列[(s[0],t[0]), (s[1],t[1]), (s[2],t[2]), (s[3],t[3]),...] >>> s = ...