这题说的给了n个点m条边要求保证是一个有向无环图,可以删除至多k条边使得这个图的拓扑序的字典序最大,我们知道如果我们要排一个点的时候一定要考虑比他大的点是否可以、通过拆边马上拆出来,如果可以拆当然是拆,肯定保证字典序最大,如果不能拆,就不拆留着以后拆,当初这个比他大的点度数小于k的,最大是多少,这个方法我一直想不出,后来看了题解,二分加线段树,可以做到,线段树维护每个点的d[i],然后通过二分找出小于k的最大点是多少。

 #include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <cstdio>
#include<queue>
using namespace std;
const int maxn =;
struct Edge{
int u,v;
Edge(int uu=, int vv=){
u= uu; v =vv;
}
};
vector<Edge> E;
vector<int> G[maxn],REG[maxn];
void add_edg(int u, int v){
E.push_back(Edge(u,v));
G[u].push_back(E.size()-);
REG[v].push_back(E.size()-);
}
int ind[maxn];
int cL, cR,cans;
struct Itree{
int id[maxn*];
void build(int O, int L, int R){
if(L==R){
id[O] = ind[L] ; return ;
}
int mid = ( L + R ) >> ;
build(O*,L,mid);
build(O*+,mid+,R);
id[O]=min(id[O*],id[O*+]);
}
void update(int o, int L, int R){
if( L == R ){
id[o] = cans; return ;
}
int mid=(L+R)>>;
if(cL<=mid){
update(o*,L,mid);
}else update(o*+,mid+,R);
id[o]=min(id[o*],id[o*+]);
}
void query(int o , int L, int R){
if(cL<=L && cR>=R){
cans =min(cans,id[o]);return ;
}
int mid = (L+R)>>;
if(cL <= mid) query(o*,L,mid);
if(cR>mid) query(o*+,mid+,R);
}
}T;
bool use[maxn];
void init(int n){
for(int i=; i<n; i++){
G[i].clear();
REG[i].clear();
}
E.clear();
memset(ind,,sizeof(ind));
memset(use,true,sizeof(use));
}
int jud(int k, int n){
int L=,R=n,ans=-;
while(L<=R){
int mid = (L+R)>>;
cans = k+;
cL=mid; cR=R;
T.query(,,n);
if(cans<=k){
ans=mid; L=mid+;
}
else R=mid-;
}
return ans;
}
priority_queue<int> Q;
void solve1(int nk,int k,int n){ for(int i=; i<REG[nk].size(); i++){
use[ REG[nk][i] ] = false;
}
cans = k+;
cL=cR=nk;
T.update(,,n);
}
void solve2(int nk,int k,int n){
for(int i=; i<G[nk].size(); i++){
int numedg = G[nk][i];
if(use[numedg]){
use[numedg]=false;
Edge q = E[numedg];
ind[q.v]--;
if(ind[q.v]==){
Q.push(q.v); ind[q.v]=k+;
}
cL = cR = q.v;
cans =ind[q.v];
T.update(,,n);
}
}
}
int ans[maxn];
int main()
{
int n,m,k; while(scanf("%d%d%d",&n,&m,&k)==){
init(n);
for(int i=; i<m; i++){
int u,v;
scanf("%d%d",&u,&v);
add_edg(u,v);
ind[v]++;
}
while(!Q.empty())Q.pop();
for(int i =; i<=n; i++){
if(ind[i]==){
Q.push(i);
ind[i]=k+;
}
}
T.build(,,n);
int st=;
while(!Q.empty()){
int top = Q.top();
int nk = jud(k,n);
if(nk>top){
k-=ind[nk];
solve1(nk,k,n);
Q.push(nk);
}else{
Q.pop();
ans[st++]=top;
solve2(top,k,n);
}
}
for(int i=; i<n-; i++) printf("%d ",ans[i]);
printf("%d\n",ans[n-]);
} return ;
}

hdu5195 二分+线段树+拓扑序的更多相关文章

  1. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  2. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  3. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  4. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  5. J - Joseph and Tests Gym - 102020J (二分+线段树)

    题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...

  6. Educational Codeforces Round 61 D 二分 + 线段树

    https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...

  7. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  8. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  9. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

随机推荐

  1. 大规模Elasticsearch集群管理心得

    转载:http://elasticsearch.cn/article/110 ElasticSearch目前在互联网公司主要用于两种应用场景,其一是用于构建业务的搜索功能模块且多是垂直领域的搜索,数据 ...

  2. H3C系列之三层交换机dhcp功能的开启

    环境介绍>>>>>>>>>>>>>>>>>>>>交换机名牌:H3C交换机类型:三 ...

  3. 数字模型制作规范(转自Unity3D群)

    本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸.单位,模型归类塌陷.命名.节点编辑, ...

  4. 【转载】ARM与单片机的区别

    前几天在博客园的博问模块上面发布了一个博问,可能是我问题描述有些问题,被一个园友指出,ARM与单片机是不同的.所以我特地查了一下ARM与单片机的区别,之前一直以为ARM就是加强版的单片机,stm32无 ...

  5. ztree学习---将默认勾选的展开

    这里只给出前台页面上的代码,数据可以从后台获取,注意,在封装数据的时候,注意:Id(节点的id,可以是数字也可以是字符串) , pid(父亲节点的id) , name(节点名称)不能少 . html页 ...

  6. 赋诗一首<<往事>>

    长笛叙落意,情深知几许: 孤灯伴清影,深山夕照雨. 梦有几轮回,飞舞蝴蝶雨.

  7. ibatitsnet 因为会Dao.config 配置数据版本太低导致的问题

    ProjectReview.Test.SqlMapTest.TestSqlMap:IBatisNet.Common.Exceptions.ConfigurationException : - The ...

  8. opengl学习笔记(二):使用OpenCV来创建OpenGL窗口

    通常的增强现实应用需要支持OpenGL的OpenCV来对真实场景进行渲染.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL.这意味着在OpenCV中可轻松渲染任何3D内容. 若要在Op ...

  9. PyCharm导入tensorflow包报错的问题

    [注]PyCharm导入tensorflow包报错的问题 若是你也遇到这个问题,说明你也没有理解tensorflow到底在哪里. 当安装了anaconda3.6后,在PyCharm中设置interpr ...

  10. FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具

    本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...