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, ...
随机推荐
- 各个浏览器下实现Ajax的JS
var xmlhttpget; try { // Firefox, Opera 8.0+, Safari xmlhttpget = new window.XMLHttpRequest( ...
- bnu 4351 美女来找茬(水水)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4351 [题意]:用最小的矩形框,框住像素点差超过5的点. [题解]:求坐标x,y最大最小值 [cod ...
- 3123 高精度练习之超大整数乘法 - Wikioi
题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过100000位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Ou ...
- 1972: [Sdoi2010]猪国杀 - BZOJ
题目太长,我只发链接吧 wikioi(排版看起来舒服一点):http://www.wikioi.com/problem/1834/ bzoj:http://www.lydsy.com:808/Judg ...
- Atmel Studio 6.0 重新安装
问题描述: Atmel Studio 6.0 重新安装 在卸载Atmel Studio6.0之后,重新安装Atmel Studio6.0软件,提示cannot find one ...
- js常识
btnDelAll.Attributes.Add("onclick", "<script lunguage='javascript'>return windo ...
- 团体程序设计天梯赛-练习集L1-003. 个位数统计
L1-003. 个位数统计 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个k位整数N = dk-1*10k-1 + . ...
- 团体程序设计天梯赛-练习集L1-002. 打印沙漏
L1-002. 打印沙漏 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给 ...
- spoj 1436
用并查集看一下是否会围成一个环 若围成环直接输出NO 当然 当 m >= n 时必然会围成环直接输出NO #include <algorithm> #include < ...
- 【leetcode】Trapping Rain Water(hard)
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...