好题


思路:线段树优化建图+拓扑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的更多相关文章

  1. P3588 [POI2015]PUS(拓扑排序+线段树)

    P3588 [POI2015]PUS 对于每个$(l,r,k)$,将$k$个位置向剩下$r-l-k+1$个位置连边,边权为$1$,这样就保证$k$个位置比剩下的大 先给所有位置填$1e9$保证最优 然 ...

  2. 洛谷P3588 [POI2015]PUS

    题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...

  3. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  4. P3588 【[POI2015]PUS】(线段树优化建边)

    P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...

  5. 洛谷P3588 - [POI2015]Pustynia

    Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...

  6. [POI2015]PUS

    嘟嘟嘟 这题只要往正确的方面想,就很简单. 首先,这是一道图论题! 想到这,这题就简单了.对于两个数\(i\)和\(j\),如果\(i\)比\(j\)大,就从\(i\)向\(j\)连边.然后如果图中存 ...

  7. luoguP3588_[POI2015]PUS

    题意 有一个\(n\)个数的序列,已知其中的\(k\)个数,然后有\(m\)个信息,每个信息给出区间\([l,r]\),和\(k\)个数,表示区间\([l,r]\)中这\(k\)个数大于剩下的\(r- ...

  8. [POI2015]PUS [线段树优化建图]

    problem 线段树优化建图,拓扑,没了. #include <bits/stdc++.h> #define ls(x) ch[x][0] #define rs(x) ch[x][1] ...

  9. Luogu P3783 [SDOI2017]天才黑客

    题目大意 一道码量直逼猪国杀的图论+数据结构题.我猪国杀也就一百来行 首先我们要看懂鬼畜的题意,发现其实就是在一个带权有向图上,每条边有一个字符串信息.让你找一个点出发到其它点的最短路径.听起来很简单 ...

随机推荐

  1. github.com连接超时

     https://blog.csdn.net/hanchao5272/article/details/79393393 1.错误信息 之前github都能用,但是今天git clone的时候居然连不上 ...

  2. JAVA线程中的发牌题

    发牌题主要考虑的就是线程的问题,一个buffer缓冲区的问题, 首先,发牌的优先级当然是最高的了,但是取牌不能有优先级,否则会一直有牌先取,因此需要一个信号量order,当order=线程的数字时,取 ...

  3. 使用mybatis完成增删改查

    插入 插入数据 <insert id="insertUser2" parameterType="UserEntity"> insert into u ...

  4. python3快速安装升级pip3

    一.下载地址: 获取get-pip.py安装文件: 官网链接:https://bootstrap.pypa.io/get-pip.py 百度云链接:https://pan.baidu.com/s/14 ...

  5. NOP法破解

    目录 步骤 步骤 OD载入目标软件,汇编窗口右键搜索字符串,发现错误类提示字符串,双击该字符串来到该段代码位置. 向上寻找到跳转到本段错误提示代码的跳转指令,用NOP指令填充跳转指令. 保存修改后的代 ...

  6. Oracle创建视图权限不足

    Oracle 在创建用户的时候如果直接给用户DBA权限,那么在B用户中可以直接查询A用户的表,但是在创建视图时就会报无权限,在这种情况下需要再在被访问的A用户里面去给予要访问该表的B用户授权. --创 ...

  7. Python之Flask

    一.Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask是一个轻 ...

  8. java模板模式项目中使用--封装一个http请求工具类

    需要调用http接口的代码继承FundHttpTemplate类,重写getParamData方法,在getParamDate里写调用逻辑. 模板: package com.crb.ocms.fund ...

  9. js同时获取多个共同class内容标签内容集合

    1.获取标签内容  标签如下:   <img image-code="#qq_1_gif#" class="emoji_icon" src="i ...

  10. ES6中 对字符串增强

    在曾经,我们只能用A.indexof(B)来判断A中是否含有B字符串: 现在在ES6中 有了: includes(), startswith(),endswith() reapt()重复次数: 输出 ...