P3588 [POI2015]PUS

对于每个$(l,r,k)$,将$k$个位置向剩下$r-l-k+1$个位置连边,边权为$1$,这样就保证$k$个位置比剩下的大

先给所有位置填$1e9$保证最优

然后拓扑排序填数

填的数不在$[1,1e9]$内或者出现环,即为不合法

但是这样边数过多会超时

于是考虑线段树优化建图

把$n$个点建成线段树,每个节点向左右儿子连边,边权为0。

这样每次连一个区间$[l,r]$就只需要$log(r-l+1)$次

注意不合法情况要枚举完整

#include<iostream>
#include<cstdio>
using namespace std;
#define N 100005
#define M 6000005
int n,s,m,u,pos[N],h[N*],L,R,no;
int p[N*],w[N*],id[N]; bool vis[N*];
int Cnt,hd[N*],nxt[M],ed[N*],poi[M],val[M],in[N*];
void adde(int x,int y,int v){
nxt[ed[x]]=++Cnt; hd[x]=hd[x]?hd[x]:Cnt;
ed[x]=Cnt; poi[Cnt]=y; val[Cnt]=v; ++in[y];
}
#define mid (l+r)/2
int build(int o,int l,int r){
w[p[o]=++u]=1e9;
if(l==r) return id[l]=u;
adde(p[o],build(o<<,l,mid),);
adde(p[o],build(o<<|,mid+,r),);
return p[o];
}
void Add(int o,int l,int r,int x1,int x2,int k){
if(x1<=l&&r<=x2){adde(k,p[o],); return ;}
if(x1<=mid) Add(o<<,l,mid,x1,x2,k);
if(x2>mid) Add(o<<|,mid+,r,x1,x2,k);
}
void work(){
int tt=;
for(int i=;i<=u;++i) if(!in[i]) h[++R]=i;
while(L!=R){
if(L>=N) L=;
int x=h[++L]; ++tt;
if(w[x]<) no=;//填的数<1
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(vis[to]&&w[to]>w[x]-val[i]) no=;//填的数比已给定位置上的数值小
w[to]=min(w[to],w[x]-val[i]);
if((--in[to])==){
if(R>=N) R=;
h[++R]=to;
}
}
}
if(tt<u) no=;//图中有环
}
int main(){
scanf("%d%d%d",&n,&s,&m);
build(,,n);
for(int i=,Id,v;i<=s;++i){
scanf("%d%d",&Id,&v);
if(v<||v>1e9) no=;//给定数不合法
w[id[Id]]=v; vis[id[Id]]=;
}
for(int i=,l,r,k;i<=m;++i){
scanf("%d%d%d",&l,&r,&k); w[++u]=1e9;//新建一个中转节点
for(int j=;j<=k;++j)
scanf("%d",&pos[j]),adde(id[pos[j]],u,);
if(l<pos[]) Add(,,n,l,pos[]-,u);
if(r>pos[k]) Add(,,n,pos[k]+,r,u);
for(int j=;j<k;++j)
if(pos[j]+<pos[j+])
Add(,,n,pos[j]+,pos[j+]-,u);
}work();
if(no) puts("NIE");
else{
puts("TAK");
for(int i=;i<=n;++i) printf("%d ",w[id[i]]);
}return ;
}

P3588 [POI2015]PUS(拓扑排序+线段树)的更多相关文章

  1. P3588 【[POI2015]PUS】(线段树优化建边)

    P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...

  2. CF798E. Mike and code of a permutation [拓扑排序 线段树]

    CF798E. Mike and code of a permutation 题意: 排列p,编码了一个序列a.对于每个i,找到第一个\(p_j > p_i\)并且未被标记的j,标记这个j并\( ...

  3. Nowcoder Hash Function ( 拓扑排序 && 线段树优化建图 )

    题目链接 题意 : 给出一个哈希表.其避免冲突的方法是线性探测再散列.现在问你给出的哈希表是否合法.如果合法则输出所有元素插入的顺序.如果有多解则输出字典序最小的那一个.如果不合法则输出 -1 分析 ...

  4. Luogu5289 十二省联考2019字符串问题(后缀数组+拓扑排序+线段树/主席树/KDTree)

    先考虑80分做法,即满足A串长度均不小于B串,容易发现每个B串对应的所有A串在后缀数组上都是一段连续区间,线段树优化连边然后判环求最长链即可.场上就写了这个. 100分也没有什么本质区别,没有A串长度 ...

  5. hdu 5195 DZY Loves Topological Sorting (拓扑排序+线段树)

    DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  6. hdu 5638 Toposort (拓扑排序+线段树)

    Toposort Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  7. bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  8. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  9. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

随机推荐

  1. $.param()序列化对象

    1.$.param(): param() 方法创建数组或对象的序列化表示形式. 序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中. 第一行是原始数据,第二行是序列化后的.$.param( ...

  2. js 获取select的值

    var t = document.getElementById("provid"); console.log(t.value); console.log(t.text); //未定 ...

  3. POJ 2528 Mayor’s posters (线段树段替换 && 离散化)

    题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...

  4. JUnit——单元测试步骤

    步骤: 1. New Package(一般命名为*.Test,测试类与开发类放在不同的包中)2. New JUnit Text Case(一般命名为*Test)3. 选择需要测试的方法 4. 可以下载 ...

  5. 51nod 1228 序列求和(伯努利数)

    1228 序列求和  题目来源: HackerRank 基准时间限制:3 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 T(n) = n^k,S(n) = T(1 ...

  6. TTTTTTTTTTT LA 4329 BIT模版

    题意: 有n个打乒乓球的人,住在一排房子内,以房子的顺序从做到由,每个人都有一个不同的乒乓球等级ai.每次比赛需要三人,两人比赛和一人裁判,裁判必须居住在两个比赛者之间,且等级必须也在两个人之间.问最 ...

  7. Shell中Bash的基本功能(二)

    1 历史命令 1)历史命令的查看[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件.如果不手 ...

  8. 关于如何解决TeamViewer限制时间问题

    最近在弄一个项目,我们是乙方,甲方离我们比较远,所以需要用到远程操作软件.也就是TeamViewer. 这个软件一开始运行还行,后来时间用久了,很容易被限制时间.在网上查了大部分资料,都是一些修改MA ...

  9. sed将一个文件插入到另一个文件(合并两个文件)

    将before.sh的内容插入到catalina.sh的第一行之后 sed -i '1r /srv/tomcat8/bin/before.sh' /srv/tomcat8/bin/catalina.s ...

  10. C++ 左值与右值

    https://baike.baidu.com/item/%E5%B7%A6%E5%80%BC%E4%B8%8E%E5%8F%B3%E5%80%BC/5537417?fr=aladdin https: ...