题目

给定一个长度为\(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的更多相关文章

  1. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

  2. 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...

  3. 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

    题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...

  4. BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS

    BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...

  5. bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...

  6. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  7. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  8. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  9. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  10. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

随机推荐

  1. lock锁,Semaphore信号量,Event事件,进程队列Queue,生产者消费者模型,JoinableQueue---day31

    1.lock锁 # ### 锁 lock from multiprocessing import Process,Lock import json,time # (1) lock的基本语法 " ...

  2. 【LeetCode二叉树#15】二叉搜索树的最小绝对差(巩固迭代中序遍历#2)

    二叉搜索树的最小绝对差(迭代法中序遍历巩固) 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 提示:树中至 ...

  3. 【Java复健指南03】递归思想

    [递归] 递归重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响,比如n变量 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用 ...

  4. Linux的这些命令你需要掌握

    查看进程: 查看所有进程:ps -ef 查看指定的进程: ps -ef|grep pid(进程号) 查看前40个内存占用的进程: ps auxw|head -1;ps auxw|sort -rn -k ...

  5. 八: Mysql配置文件的使用

    # Mysql配置文件的使用 1. 配置文件格式 与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,丽个组有一个组名, 用中括号 [ ]扩起来,像这样: 像这个配置文件里就定义了 ...

  6. nginx判断是否手机访问

    if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle|MicroMessenger |iPad)" ) ...

  7. Redis集群Cluster

    Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好 ...

  8. Delete `␍`

    新电脑遇到的问题 Delete `␍`eslint(prettier/prettier) 网上一搜,一堆解决办法,没有一个说到点子上,都是表面上如何避免,如何设置VSCODE... 都知道是换行符的问 ...

  9. 调试分析 Linux 0.00 多任务切换

    当执行完 system_interrupt 函数,执行 153 行 iret 时,记录栈的变化情况. 任务0在刚进入system_interrupt函数时(调用中断int 0x80处理程序),栈空间为 ...

  10. APISIX的安装和简单使用

    APISIX 是一个云原生.高性能.可扩展的微服务 API 网关. 它是基于 Nginx 和 etcd 来实现,和传统 API 网关相比,APISIX 具备动态路由和插件热加载,特别适合微服务体系下的 ...