P3588 [POI2015]PUS
好题
思路:线段树优化建图+拓扑DP or 差分约束(都差不多);
提交:3次
错因:眼瞎没看题,Inf写的0x3f3f3f3f
题解:
类似差分约束的模型,\(a<b\rightarrow a\leq b-1 \rightarrow b\) 向 \(a\) 连一条权值为 \(-1\) 的边,跑类似最短路的DP。
还是想一下之前的总结,我们发现,边权是非正的,并且0边没有形成环,所以一旦有环一定是负环,原问题无解,所以我们可以用拓扑排序去DP解这道题。
\(d[v]=min(d[v],d[u]+w[i])\),我们将所有没有确定的值均设成 \(1e9\) (题目中要求的上界),按照DP的式子,我们跑出来的是每个点的最大值(经过最少的边),若我们发现确定的值被更新的更小了,也是无解。否则有解,直接输出 \(d\) 数组即可。
代码:
#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
inline ll g() { register ll x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=500010,Y=6,F=20,Inf=1e9;
int n,m,s,rt[2],tot,cnt;
int ls[N*Y],rs[N*Y]; bool flg[N*Y];
int vr[N*F],nxt[N*F],fir[N*Y],in[N*Y],w[N*F],d[N*Y];
inline void add(int u,int v,int ww)
{vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,w[cnt]=ww,++in[v];}
inline void build(int& tr,int l,int r,const int& op) {
if(l==r) return void(tr=l); tr=++tot; R md=l+r>>1;
build(ls[tr],l,md,op),build(rs[tr],md+1,r,op);
(op)?(add(ls[tr],tr,0),add(rs[tr],tr,0))
:(add(tr,ls[tr],0),add(tr,rs[tr],0));
}
inline void change(int tr,int l,int r,int LL,int RR,const int& op) {
if(LL<=l&&r<=RR) return void((op)?(add(tr,tot,0)):(add(tot,tr,-1)));
R md=l+r>>1; if(LL<=md) change(ls[tr],l,md,LL,RR,op);
if(RR>md) change(rs[tr],md+1,r,LL,RR,op);
}
inline void topo() { queue<int> q;
for(R i=1;i<=tot;++i) if(!flg[i]) d[i]=Inf;
for(R i=1;i<=tot;++i) if(!in[i]) q.push(i);
while(q.size()) { R u=q.front(); q.pop();
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(d[v]>d[u]+w[i]) {
if(flg[v]) {return void(puts("NIE"));}
d[v]=d[u]+w[i];
} if(!--in[v]) q.push(v);
}
} for(R i=1;i<=n;++i) if(in[i]||d[i]<=0) return void(puts("NIE"));
puts("TAK"); for(R i=1;i<=n;++i) printf("%lld ",d[i]);
}
inline void main() {
n=g(),s=g(),m=g(); tot=n;
for(R i=1,u,w;i<=s;++i) u=g(),d[u]=g(),flg[u]=true;
build(rt[0],1,n,0),build(rt[1],1,n,1);
for(R i=1,l,r,k,p;i<=m;++i) {
p=l=g(),r=g(),k=g(); ++tot;
for(R j=1,q;j<=k;++j) {
q=g(); if(q>l) change(rt[0],1,n,p,q-1,0);
p=q+1,change(rt[1],1,n,q,q,1);
} if(p<=r) change(rt[0],1,n,p,r,0);
} topo();
}
} signed main() {Luitaryi::main(); return 0;}
2019.10.17
29
P3588 [POI2015]PUS的更多相关文章
- P3588 [POI2015]PUS(拓扑排序+线段树)
P3588 [POI2015]PUS 对于每个$(l,r,k)$,将$k$个位置向剩下$r-l-k+1$个位置连边,边权为$1$,这样就保证$k$个位置比剩下的大 先给所有位置填$1e9$保证最优 然 ...
- 洛谷P3588 [POI2015]PUS
题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...
- 洛谷P3588 [POI2015]PUS(线段树优化建图)
题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...
- P3588 【[POI2015]PUS】(线段树优化建边)
P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...
- 洛谷P3588 - [POI2015]Pustynia
Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...
- [POI2015]PUS
嘟嘟嘟 这题只要往正确的方面想,就很简单. 首先,这是一道图论题! 想到这,这题就简单了.对于两个数\(i\)和\(j\),如果\(i\)比\(j\)大,就从\(i\)向\(j\)连边.然后如果图中存 ...
- luoguP3588_[POI2015]PUS
题意 有一个\(n\)个数的序列,已知其中的\(k\)个数,然后有\(m\)个信息,每个信息给出区间\([l,r]\),和\(k\)个数,表示区间\([l,r]\)中这\(k\)个数大于剩下的\(r- ...
- [POI2015]PUS [线段树优化建图]
problem 线段树优化建图,拓扑,没了. #include <bits/stdc++.h> #define ls(x) ch[x][0] #define rs(x) ch[x][1] ...
- Luogu P3783 [SDOI2017]天才黑客
题目大意 一道码量直逼猪国杀的图论+数据结构题.我猪国杀也就一百来行 首先我们要看懂鬼畜的题意,发现其实就是在一个带权有向图上,每条边有一个字符串信息.让你找一个点出发到其它点的最短路径.听起来很简单 ...
随机推荐
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...
- 使用scrapy框架做赶集网爬虫
使用scrapy框架做赶集网爬虫 一.安装 首先scrapy的安装之前需要安装这个模块:wheel.lxml.Twisted.pywin32,最后在安装scrapy pip install wheel ...
- C++利用权重方法将二进制正数转换为十进制数
#include <iostream> #include <Windows.h> #include <string> using namespace std; in ...
- 嵌入式Linux学习笔记之第二阶段---文件I/O
1.文件IO的四个函数 一些术语: 不带缓冲的I/O: 每个read和write都调用内核中的一个系统调用. 文件描述符: 一个非负整数,对内核而言,所以打开的文件都通过文件描述符引用. ①打开或创建 ...
- redis有序集合数据类型---sortedset
一.概述 redis有序集合和集合一样,也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数. redis正式通过分数来为集合中的重圆进行从小到大的 ...
- 微信小程序DEMO——面包旅行的代码
API 集合在一起写了一个页面,并导出, const apiURL = 'http://xxx.xxxx.com'; const trip = { hot(data,callback){ wx.req ...
- ip地址 与子网掩码 的计算
ip地址 与子网掩码 的计算 128.0.0.0=1 192.0.0.0=2224.0.0.0=3 240.0.0.0=4 248.0.0.0=5 252.0.0.0=6 254.0.0.0=7 25 ...
- Java 之 缓冲流
一.缓冲流概述 缓冲流,也叫高效流,是对四个 FileXXX 流的增强,所有也有四个流,按照类型分类: 字节缓冲流:BufferedInputStream,BufferedOutputStream 字 ...
- git推送代码Gogs报401错误
1.git push 报错:RPC failed; HTTP 401 curl 22 The requested URL returned error: 401 The remote end hung ...
- MySQL常见问题集锦及注意事项
一.表设计上的坑 1.字段设计 1.1 字段类型设计 尽量使用整型表示字符串: `INET_ATON(str)`,address to number `INET_NTOA(number)`,numbe ...