Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆
题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1
题解:首先可以想到对于限制条件,先进行拓扑排序,如果不能则无解
针对拓扑排序的结果,可以更精确每个人站的位置的区间[Li,Ri]
然后从后往前进行考虑,我们考虑每个位置由谁来坐比较好,那我们策略是,R能覆盖这个位置的中,L最大的那一个来最优,
我们一直维护一个R的堆,每次我们将R超过当前位置的人都丢进一个新的堆里,这个堆按L大来排序,再使用最大的那个L
如此贪心做完,不行则无解
#include<bits/stdc++.h>
#define lld long long
#define N 300005
using namespace std;
vector<int> g[N];
int n,m,du[N],x,y,ans[N];
struct rec
{
int l,r,id;
bool operator <(const rec& a)const
{
if (r!=a.r) return r<a.r;
return l>a.l;
}
}a[N];
struct ssy
{
int l,r,id;
bool operator <(const ssy& a)const
{
return l<a.l;
}
}b[N];
int ask()
{
priority_queue<ssy>q;
priority_queue<rec>qq;
ssy st;
while (!q.empty()) q.pop();
while (!qq.empty()) qq.pop();
for (int i=;i<=n;i++) if (du[i]==) qq.push(a[i]);
for (int i=n;i>=;i--)
{
while (!qq.empty())
{
if (qq.top().r<i) break;
q.push(b[qq.top().id]);
// cout << b[qq.top().id].id << endl;
qq.pop();
}
if (q.empty() || q.top().l>i) return ;
st=q.top();
// cout<<st.id << endl;
q.pop(); //cout<<"id"<<st.id<<endl;
ans[i]=st.id; for (int j=;j<g[st.id].size();j++)
{
int u=g[st.id][j];
du[u]--;
if (du[u]==) qq.push(a[u]);
}
}
return ;
}
int c[N];
bool dfs(int u)
{
c[u]=-;
for (int v=;v<g[u].size();v++)
{
int to=g[u][v];
if (c[to]<)
{
//cout<<"u xxx:"<<u<<endl;
//cout<<"1 xxx:"<<to<<endl;
return ;
}else
if (!c[to] && !dfs(to))
{
//cout<<"u xxx:"<<u<<endl;
//cout<<"1 xxx:"<<to<<endl;
return ;
}
a[u].l=max(a[u].l,a[to].l+);
b[u].l=a[u].l;
}
c[u]=;
return ;
}
bool toposort()
{
memset(c,,sizeof(c));
for (int u=;u<=n;u++) if (!c[u])
if (!dfs(u)) return ;
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);a[i].id=i;
b[i].l=a[i].l;
b[i].r=a[i].r;
b[i].id=a[i].id;
}
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[y].push_back(x);
du[x]++;
}
if (!toposort()) printf("-1\n");else
if (!ask()) printf("-1\n");else
for (int i=;i<=n;i++) printf("%d\n",ans[i]); //for (int i=1;i<=n;i++) cout<<a[i].l<<" "<<a[i].r<<endl;
}
Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆的更多相关文章
- 【GYM 102059】2018-2019 XIX Open Cup, Grand Prix of Korea
vp了一场gym,我又开心地划水了. A. Coloring Roads 题意:给定一棵树,树边一开始都是无色的,每次操作可以把一个点到根的路径染成某个颜色,每次询问当前树上出现过某个次数的颜色种数. ...
- 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数
http://codeforces.com/gym/102058/problem/F 题意:平面上n个点 两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还 ...
- Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)
整体来说,这一场的质量比较高,但是题意也有些难懂. E.Electronic Circuit 题意: 给你N个点,M根线,问它是否是一个合法的电路. 思路: 一个合法的电路,经过一些串联并联关系, ...
- Codeforces gym102058 J. Rising Sun-简单的计算几何+二分 (2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2))
J. Rising Sun time limit per test 1.0 s memory limit per test 1024 MB input standard input output st ...
- 2018-2019 XIX Open Cup, Grand Prix of Korea B - Dev, Please Add This!
B - Dev, Please Add This! 思路: 对于每一个经过 '*' 的横线和竖线看成一个整体,设他们分别为分量x和分量y 用2-sat考虑这个问题, 如果要经过 '*' ,那么x和y至 ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...
- 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake
题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...
- 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut
题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...
- 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus) 题解
题目列表 C. Brave Seekers of Unicorns D. Bank Security Unification G. Biological Software Utilities I. B ...
随机推荐
- Java基本数据类型、包装类与String类之间的转换
一.基本数据类型与包装类之间的转换: import org.junit.Test; public class MainTest { /** * 基本数据类型与包装类之间的转换 */ @Test pub ...
- linux less-分屏上下翻页浏览文件内容
博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more ...
- 第十节:Web爬虫之数据存储与MySQL8.0数据库安装和数据插入
用解析器解析出数据之后,接下来就是存储数据了,保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如 TXT.JSON.csv 另外,还可以保存到数据库中,如关系型数据库MySQL ,非关系型数 ...
- MaxScale初探
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mrcto.blog.51cto.com/1923168/1437287 内容预览 ...
- UVa - 12451 - Let's call SPaDe a SPaDe
先上题目: Problem H: Let's call SPaDe a SPaDe Passing time, walking the passage, as you pass the String ...
- 关于${ctx}拿不到值的问题
当项目开发时我们喜欢用 <c:set var="ctx" value="${pageContext.request.contextPath}"/>来 ...
- 【ZJOI2017 Round2练习&BZOJ4826】D1T2 sf(主席树,单调栈)
题意: 思路:From http://blog.csdn.net/neither_nor/article/details/70211150 对每个点i,单调栈求出左边和右边第一个大于i的位置,记为l[ ...
- Linux下Ubuntu 操作系统 部署
1.1 先更新系统 环境 更新命令为: apt-get update 1.2 安装jdk 安装JDK命令为:sudo apt-get install o penjdk-7-jdk 1.3 安装tomc ...
- 用xtrabackup+binlog恢复误删除的数据库
关键技术,数据库产生的二进制文件,在主库就是binlog在从库就是relay-log,用最新的物理备份可以新启动个新实例,可以模拟个从库,把主库的binlog复制到新的数据库实例上,利用主从复制和物理 ...
- 晶振虚焊导致TI 28335 DSP 烧写FLASH后,连接仿真器时正常工作,拔掉仿真器却不能启动运行
遇到个诡异的问题,28335的DSP,之前程序调试一切正常,但是烧写FLASH后,拔掉仿真器却始终部工作. 解决思路: 1) 检查配置文件貌似没什么问题,复制到其他工程,在开发板上拔掉仿真器启动正常. ...