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]天才黑客
题目大意 一道码量直逼猪国杀的图论+数据结构题.我猪国杀也就一百来行 首先我们要看懂鬼畜的题意,发现其实就是在一个带权有向图上,每条边有一个字符串信息.让你找一个点出发到其它点的最短路径.听起来很简单 ...
随机推荐
- Python 容器用法整理
本文整理几种基本容器:列表.元组.字典和集合的用法和collections中几种已经预先实现的容器数据结构:namedtuple(),双向链表deque,ChainMap,Counter,Ordere ...
- 剑指offer66:机器人的运动范围
1 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器 ...
- linux命令行删除N天前的数据的命令
命令: find . -mtime +N -type f -name "*.log.*" -exec rm -f {} \; 简单解释: find .查询 ; -mtime 规 ...
- Liar CodeForces - 822E (dp,后缀数组)
大意: 给定串$s,t$, 给定整数$x$, 求判断$t$是否能划分为至多$x$段, 使这些段在$s$中按顺序,不交叉的出现. 设$dp_{i,j}$表示$s$匹配到$i$位, 划分了$j$段, 匹配 ...
- 如何录屏做GIF图
网上找了一下,ScreenToGif 这个神器 https://github.com/NickeManarin/ScreenToGif https://github.com/NickeManarin/ ...
- RabbitMQ的应用场景
进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完成才 ...
- ftl 列表弄成js数组
例子:ftl 列表:bannerViewUrls var arrayBanner=[<#list bannerViewUrls as list>"${list}"< ...
- CSS_引入方式
一 CSS的引入方式 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离 1.行内式 ...
- MonkeyRunner——Mac
1. MonkeyRunner介绍: Android的SDK中集成了三个可用来进行自动化测试的工具:Monkey.MonkeyRunner和Robotium.这三个测试工具都是基于黑盒测试. Monk ...
- 【已解决】极速迅雷win10闪退解决方案
[已解决]极速迅雷win10闪退解决方案 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Wed, 17 Jul 2019 18:01:00 +0800 在吾爱下载了个极速迅 ...