#差分约束系统,最长路,线段树优化建边#洛谷 3588 [POI2015] PUS
题目
给定一个长度为\(n\)的正整数序列 \(a\) ,每个数都在 \(1\) 到 \(10^9\) 范围内,
告诉你其中 \(s\) 个数,并给出 \(m\) 条信息,每条信息包含三个数 \(l,r,k\) 以及接下来 \(k\) 个正整数,
表示 \(a_l..a_{l+1}...a_{r-1}..a_r\) 里这 \(k\) 个数中的任意一个都比任意一个剩下的 \(r-l+1-k\) 个数大 (严格大于,即没有等号)。
分析
考虑约束条件形如\(a[x]+1<a[y]\),建边跑最长路即可,
现在问题是建边,考虑线段树优化建边,
由于它有已知值,所以要在已知值的基础上跑最长路,
如果约束条件有环那无解,最小答案超过已知值无解
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=1000011; struct node{int y,w,next;}e[N<<2];
int ls[N],rs[N],deg[N],dis[N],a[N],n,cnt,m,T,et,as[N],root,p[N],q[N],head=1,tail;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y,int w){
e[++et]=(node){y,w,as[x]},as[x]=et;
}
inline void build(int &k,int l,int r){
if (l==r) {k=l; return;}
if (!k) k=++cnt;
rr int mid=(l+r)>>1;
build(ls[k],l,mid);
build(rs[k],mid+1,r);
add(ls[k],k,0),add(rs[k],k,0);
}
inline void update(int k,int l,int r,int x,int y,int z){
if (l==x&&r==y) {add(k,z,0); return;}
rr int mid=(l+r)>>1;
if (y<=mid) update(ls[k],l,mid,x,y,z);
else if (x>mid) update(rs[k],mid+1,r,x,y,z);
else update(ls[k],l,mid,x,mid,z),update(rs[k],mid+1,r,mid+1,y,z);
}
signed main(){
cnt=n=iut(),T=iut(),m=iut();
for (rr int x;T;--T)
x=iut(),dis[x]=a[x]=iut();
build(root,1,n);
for (rr int i=1;i<=m;++i){
rr int l=iut(),r=iut(); p[0]=iut();
for (rr int j=1;j<=p[0];++j) add(cnt+i,p[j]=iut(),1);
for (rr int j=1;j<p[0];++j) if (p[j]+1<p[j+1])
update(root,1,n,p[j]+1,p[j+1]-1,cnt+i);
if (l<p[1]) update(root,1,n,l,p[1]-1,cnt+i);
if (p[p[0]]<r) update(root,1,n,p[p[0]]+1,r,cnt+i);
}
cnt+=m;
for (rr int i=1;i<=cnt;++i)
if (!deg[i]){
q[++tail]=i;
if (!dis[i]) dis[i]=1;
}
while (head<=tail){
rr int x=q[head++];
for (rr int i=as[x];i;i=e[i].next)
if (dis[e[i].y]<dis[x]+e[i].w){
dis[e[i].y]=dis[x]+e[i].w;
if (dis[e[i].y]>a[e[i].y]&&a[e[i].y])
return !printf("NIE");
if (--deg[e[i].y]==0) q[++tail]=e[i].y;
}
}
for (rr int i=1;i<=cnt;++i)
if (deg[i]>0||dis[i]>1e9)
return !printf("NIE");
printf("TAK");
for (rr int i=1;i<=n;++i) putchar(i==1?10:32),print(dis[i]);
return 0;
}
#差分约束系统,最长路,线段树优化建边#洛谷 3588 [POI2015] PUS的更多相关文章
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
- 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa
原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...
- 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...
- BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS
BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
随机推荐
- 用Taro写一个微信小程序——版本升级
一.升级 1.升级Taro CLI至最新版本 taro update self npm i -g @tarojs/cli 2.更新项目中 Taro 相关的依赖 taro update project ...
- Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本
前言 matlab的matio库需要使用到hdf5,编译hdf5的msvc2015x64版本. HDF5介绍 HDF(Hierarchical Data Format)是一种设计用于存储和组织 ...
- timeit测试函数执行时间
def list_append(): l = [] for i in range(5000): l.append(i) def list_insert(): l = [] for i in range ...
- 【开发工具】Linux 服务器 Shell 脚本简单入门
记录一下学习Shell编程的关键知识点,使用最通俗简洁的语句,让阅读者能快速上手Shell脚本的编写 1.什么是Shell? Shell是一种常用于服务器运维的脚本语言.众所周知,脚本语言不需要编译器 ...
- 51从零开始用Rust编写nginx,江湖救急,TLS证书快过期了
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...
- 【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令
问题描述 使用Azure Redis,是否可以开启慢日志来查看最近时间中执行比较耗时的指令呢? 同时,如何执行Redis的Config只能来修改配置呢? 根本原因 一:Azure Reids通过Red ...
- NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
知识点 1.NET普通源码&编译源码 2.DLL反编译&后缀文件&指向 3.代码审计-SQL注入&文件上传 ASPX文件 -> CS ASPX.CS DLL反编译 ...
- Java // 使用二维数组打印 10 行杨辉三角
1 // 使用二维数组打印 10 行杨辉三角 2 public static void main(String[] args) 3 { 4 //1.声明 并初始化二维数组 5 int[][]yangh ...
- C++ STL函数对象 仿函数
1 //STL函数对象 仿函数 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 7 8 / ...
- JS5-PC端网页特效
常见offset系列属性作用 常见client系列属性作用 常见scroll系列属性作用 封装简单动画函数 写出网页轮播图案例 offset 偏移量,使用offset相关属性可以动态的得到该元素的位置 ...