题面

题意:有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. 移动端开发需要加的meta

    移动端开发需要加的meta和常用的css3媒体查询样式,移动开发中头部要加的一些常用meta. <meta name="viewport" content="ini ...

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

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

  3. linux ifstat-统计网络接口流量状态

    推荐:更多linux 性能监测与优化 关注:linux命令大全 ifstat命令就像iostat/vmstat描述其它的系统状况一样,是一个统计网络接口活动状态的工具.ifstat工具系统中并不默认安 ...

  4. hdu 1166敌兵布阵(线段树入门题)

    >>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...

  5. 多校1007 Naive Operations

    >>点击进入原题测试<< 思路:好像是第一次这么印象深刻的写线段树,说实话,这个题确实很有意思,值得学习. 看了大神讲解视频,但是自己写的还是超时了. 参考来自 https:/ ...

  6. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  7. Codeforces Round #544 (Div. 3) Editorial C. Balanced Team

    http://codeforces.com/contest/1133/problem/Ctime limit per test 2 secondsmemory limit per test 256 m ...

  8. [fw]Best Practices for Exception Handling

    http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html http://www.onjava.com/pub/a/onjava/200 ...

  9. NOIP2005 树网的核

    题目描述 Description [问题描述]设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T 为树网(treenetwork),其中V, E分别表 ...

  10. 【Teamviewer】Teamviewer远程访问工具使用方法

    首先电脑必须能访问外网,即使是在局域网内也无所谓. 1.这里以非自动登录.自动受控的方式为例.首先,让对方也安装一个Teamviewer,或运行一个绿色的Teamviewer,并保证网络可通.然后我们 ...