BZOJ4383 Pustynia(线段树+拓扑排序)
线段树优化建图暴力拓扑排序即可。对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解。叶子连出的边表示大于号,其余边表示大于等于。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define inf 1000000000
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,s,m,a[N<<],b[N],c[N],p[N<<],id[N],pos[N<<],degree[N<<],q[N<<],t,root,cnt;
bool flag[N];
struct data{int to,nxt;
}edge[N<<];
struct data2{int l,r;
}tree[N<<];
void addedge(int x,int y){t++;degree[y]++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void build(int &k,int l,int r)
{
k=++cnt;a[k]=inf;
if (l==r) {id[l]=k,pos[k]=l;if (flag[l]) a[k]=c[l];return;}
int mid=l+r>>;
build(tree[k].l,l,mid);
build(tree[k].r,mid+,r);
addedge(k,tree[k].l),
addedge(k,tree[k].r);
}
void add(int p,int k,int l,int r,int x,int y)
{
if (l==x&&r==y) {addedge(p,k);return;}
int mid=l+r>>;
if (y<=mid) add(p,tree[k].l,l,mid,x,y);
else if (x>mid) add(p,tree[k].r,mid+,r,x,y);
else add(p,tree[k].l,l,mid,x,mid),add(p,tree[k].r,mid+,r,mid+,y);
}
bool topsort()
{
int head=,tail=;for (int i=;i<=cnt;i++) if (!degree[i]) q[++tail]=i;
while (head<tail)
{
int x=q[++head],y=a[x]-(pos[x]>);
for (int i=p[x];i;i=edge[i].nxt)
{
degree[edge[i].to]--;
if (flag[pos[edge[i].to]])
{
if (a[edge[i].to]>y) return cout<<"NIE"<<endl,;
}
else a[edge[i].to]=min(a[edge[i].to],y);
if (!degree[edge[i].to]) q[++tail]=edge[i].to;
}
}
if (tail<cnt) return cout<<"NIE"<<endl,;
else return cout<<"TAK"<<endl,;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4383.in","r",stdin);
freopen("bzoj4383.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),s=read(),m=read();
for (int i=;i<=s;i++)
{
int x=read(),y=read();
c[x]=y;flag[x]=;
}
build(root,,n);
for (int i=;i<=m;i++)
{
int l=read(),r=read(),k=read();
for (int j=;j<=k;j++) b[j]=read();
b[]=l-,b[k+]=r+;
cnt++;a[cnt]=inf;
for (int j=;j<=k+;j++)
if (b[j-]+<=b[j]-) add(cnt,root,,n,b[j-]+,b[j]-);
for (int j=;j<=k;j++) addedge(id[b[j]],cnt);
}
if (topsort()) for (int i=;i<=n;i++) printf("%d ",a[id[i]]);
return ;
}
BZOJ4383 Pustynia(线段树+拓扑排序)的更多相关文章
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...
- hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
DZY Loves Topological Sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
- HDU5638 / BestCoder Round #74 (div.1) 1003 Toposort 线段树+拓扑排序
Toposort 问题描述 给出nn个点mm条边的有向无环图. 要求删掉恰好kk条边使得字典序最小的拓扑序列尽可能小. 输入描述 输入包含多组数据. 第一行有一个整数TT, 表示测试数据组数. 对 ...
- [CSP-S模拟测试]:Permutation(线段树+拓扑排序+贪心)
题目描述 你有一个长度为$n$的排列$P$与一个正整数$K$你可以进行如下操作若干次使得排列的字典序尽量小对于两个满足$|i−j|\geqslant K$且$|P_i−P_j|=1$的下标$i$与$j ...
- BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...
- BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
- BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]
收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
随机推荐
- 常见camera测试卡
常见camera测试卡 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/luckywang1103/article/details/87166 ...
- 【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★
1.题目 2.思路 3.java代码 //测试 public class BuildTreeUsingInorderAndPreorder { public static void main(Stri ...
- Luogu4774 NOI2018 屠龙勇士 ExCRT
传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...
- CSS3选择器之:nth-child(n)
第一次用到这个选择器还是为了解决下面了的问题: 手机的前端,我们使用了mint-ui,里面有一个日期选择控件,但是选择的时候没有提供年月的选择器,如: 而是提供了下面的方式: 为了达到上面的效果,使用 ...
- R绘图 第十一篇:统计转换、位置调整、标度和向导(ggplot2)
统计转换和位置调整是ggplot2包中的重要概念,统计转换通常使用stat参数来引用,位置调整通常使用position参数来引用. bin是分箱的意思,在统计学中,数据分箱是一种把多个连续值分割成多个 ...
- 提升----你所不知道的JavaScript系列(3)
很多编程语言在执行的时候都是自上而下执行,但实际上这种想法在JavaScript中并不完全正确, 有一种特殊情况会导致这个假设是错误的.来看看下面的代码, a = 2; var a; console. ...
- Scrum与看板区别
看板:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 看板 ...
- Docker容器学习梳理 - Volume数据卷使用
之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...
- python基础学习笔记(八)
创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部 ...
- 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...