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. Linux培训教程 linux下修改用户权限的方法

    一般我们日常碰到要修改用户权限的,往往是要么修改一下用户的gorupid,通过上面命令可以改;要么是把普通用户改成具有超级权限的用户,这个一般自己不能直接改,只能是root或有root权限的用户才能帮 ...

  2. CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

  3. 手动创建Maven项目并建立两个项目之间的依赖关系

    用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...

  4. android开机引导界面的几种实现

    不少应用在设计的时候都会有几个引导界面,这里总结一下几个典型实现: 之前自己做过仅具有一个引导界面的应用,在welcomeActivity中设置一张图片,更复杂的为该图片设置一个渐入渐出的动画,然后利 ...

  5. javadoc生成文档

    标签(空格分隔): javadoc java生成html的文档: 要生成注释文档html格式,java里面提供一个工具:javadoc 例如: javadoc -d myhelp -author -v ...

  6. SpringBoot 优雅的整合 Shiro

    Apache Shiro是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理.借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到最 ...

  7. Window下PHP环境配置使用Redis总结

    什么是Redis? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.它和Memcached类似,它支持存储的 ...

  8. 使用type在对象方法中调用类方法

    type简介 type在Python中的作用是创建一个类. 我们创建类的时候一般会使用这样的方法: # -*- coding:utf-8 -*- class Student(object): coun ...

  9. 用Vue来实现音乐播放器(四十):歌单详情页布局以及Vuex实现路由数据通讯

    1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 ...

  10. [数据结构] 2.3 Trie树

    抱歉更新晚了,看了几天三体,2333,我们继续数据结构之旅. 一.什么是Tire树? Tire树有很多名字:字典树.单词查找树. 故名思意,它就是一本”字典“,当我们查找"word" ...