题面

题意:有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 贪心+堆的更多相关文章

  1. 【GYM 102059】2018-2019 XIX Open Cup, Grand Prix of Korea

    vp了一场gym,我又开心地划水了. A. Coloring Roads 题意:给定一棵树,树边一开始都是无色的,每次操作可以把一个点到根的路径染成某个颜色,每次询问当前树上出现过某个次数的颜色种数. ...

  2. 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数

    http://codeforces.com/gym/102058/problem/F 题意:平面上n个点  两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还 ...

  3. Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)

    整体来说,这一场的质量比较高,但是题意也有些难懂. E.Electronic Circuit 题意:  给你N个点,M根线,问它是否是一个合法的电路. 思路:  一个合法的电路,经过一些串联并联关系, ...

  4. 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 ...

  5. 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至 ...

  6. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea

    A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...

  7. 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake

    题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...

  8. 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut

    题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...

  9. 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 ...

随机推荐

  1. 大理石在哪儿(Where is the Marble?,Uva 10474)

    现有N个大理石,每个大理石上写了一个非负整数.首先把各数从小到大排序,然后回 答Q个问题.每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上 写着x.排序后的大理石从左到右编号为1 ...

  2. 日常操作之如何打开windows注册表

    1.打开注册表:第一步按“win+R”或者点击开始菜单,找到运行,在运行输入框里面输入“regedit”.

  3. [luoguP1736] 创意吃鱼法(DP)

    传送门 f[i][j][0] 表示从右下角到左上角,以(i,j)为起点能延伸的最大值 f[i][j][1] 表示从左下角到右上角,以(i,j)为起点能延伸的最大值 up[i][j] 表示(i,j)上面 ...

  4. [luoguP1941] 飞扬的小鸟(DP)

    传送门 动归,用f[i][j]表示到达第I列高度为j时最少需要飞的次数,容易想到最裸的转移: f[i][j]=min(min(f[i-1][j-up[i-1]*k]+k),f[i-1][j+down[ ...

  5. [K/3Cloud]如何解决kdpkg无法部署到业务站点的问题

    自从下载了sp1后,就迫不急待的试用下,看看反馈的几个关键bug是否修复,可惜sp1安装后发现业务站点下的组件一个都没有被更新,这指定是有问题了,这真是让哥百思不得其解,真后悔在研发时没仔细研究下部署 ...

  6. ubuntu18.04安装magento2

    magento2更新很快,使用的技术都是很前沿的,国内外的技术帖子又很少,安装的时候难免会遇到各种各样的问题.我们单位因为是外资,总部在国外,最近在自主开发电商网站,开发语言是php,首选了magen ...

  7. bzoj1072【SCOI2007】排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1479  Solved: 928 [id=1072&q ...

  8. Solid Edge如何快速装配,如何截取组装关系式

    我们点击装配体的任意零件,下方将显示他的装配关系,由于一些零件的装配关系是固定的,比如螺栓,肯定要做一个面贴和,再做一个同轴,所以我们可以保存这些固有的步骤,不用再每次挨个点击这些装配关系.   点击 ...

  9. wpf 禁用启用webbroswer右键菜单

    //禁用脚本错误等类似的窗口信息 this.webBrowser1.ScriptErrorsSuppressed = true; //禁用右键菜单 this.webBrowser1.IsWebBrow ...

  10. Android开源框架ViewPageIndicator和ViewPager实现Tab导航

    前言: 关于使用ViewPageIndicator和ViewPager实现Tab导航,在开发社区里已经有一堆的博客对其进行了介绍,假设我还在这里写怎样去实现.那简直就是老生常谈,毫无新奇感,并且.我也 ...