BZOJ4383 : [POI2015]Pustynia
设$a$到$b$的边权为$c$的有向边的含义为$b\geq a+c$,则可以根据题意构造出一张有向图。
设$f[x]$为$x$点可行的最小值,$a[x]$为$x$位置已知的值,则$f[x]=\max(f[j]+w(j,i),a[x])$,其中$j$有边连向$i$。
通过拓扑排序+DP可以在$O(n)$时间内求出所有$f$,如果存在环或者与题意不符则无解。
用线段树优化这个连边的过程,点数$O(n+m)$,边数$O(k\log n)$。
#include<cstdio>
const int N=100010,M=400010,E=2000000;
int n,s,m,i,x,y,z,tot,l[N<<1],r[N<<1],pos[N];
int a[M],d[M],g[M],v[E],nxt[E],ed;char w[E];
int h,t,q[M],f[M];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y,char z){d[y]++;v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
int build(int a,int b){
int x=++tot;
if(a==b)return pos[a]=x;
int mid=(a+b)>>1;
add(l[x]=build(a,mid),x,0);
add(r[x]=build(mid+1,b),x,0);
return x;
}
void ask(int x,int a,int b,int c,int d){
if(c>d)return;
if(c<=a&&b<=d){add(x,tot,1);return;}
int mid=(a+b)>>1;
if(c<=mid)ask(l[x],a,mid,c,d);
if(d>mid)ask(r[x],mid+1,b,c,d);
}
inline void up(int&a,int b){if(a<b)a=b;}
int main(){
read(n),read(s),read(m);
build(1,n);
while(s--)read(x),read(y),a[pos[x]]=y;
while(m--){
read(x),read(y),read(z);
tot++;
for(i=1;i<=z;i++)read(q[i]),add(tot,pos[q[i]],0);
ask(1,1,n,x,q[1]-1);
ask(1,1,n,q[z]+1,y);
for(i=1;i<z;i++)ask(1,1,n,q[i]+1,q[i+1]-1);
}
for(h=i=1;i<=tot;i++)if(!d[i])f[q[++t]=i]=1;
while(h<=t){
x=q[h++];
if(f[x]>1000000000)return puts("NIE"),0;
if(a[x]){
if(a[x]<f[x])return puts("NIE"),0;
if(a[x]>f[x])f[x]=a[x];
}
for(i=g[x];i;i=nxt[i]){
up(f[v[i]],f[x]+w[i]);
if(!(--d[v[i]]))q[++t]=v[i];
}
}
if(t<tot)return puts("NIE"),0;
for(puts("TAK"),i=1;i<=n;i++)printf("%d ",f[pos[i]]);
return 0;
}
BZOJ4383 : [POI2015]Pustynia的更多相关文章
- BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]
收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- [POI2015]Pustynia
[POI2015]Pustynia 题目大意: 给定一个长度为\(n(n\le10^5)\)的正整数序列\(a\),每个数都在\(1\)到\(10^9\)范围内,告诉你其中\(s\)个数,并给出\(m ...
- 洛谷P3588 - [POI2015]Pustynia
Portal Description 给定一个长度为\(n(n\leq10^5)\)的正整数序列\(\{a_n\}\),每个数都在\([1,10^9]\)范围内,告诉你其中\(s\)个数,并给出\(m ...
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
- 【BZOJ4383】[POI2015]pustynia
题意: 建议Alt+F4百度一下 题解: 差分约束+线段树优化建图,直接按照拓扑序跑就行了 代码: #include<iostream> #include<cstring> # ...
- bzoj 4383: [POI2015]Pustynia
复习了一下线段树优化建图的姿势,在线段树上连边跑拓扑排序 这题竟然卡vector……丧病 #include <bits/stdc++.h> #define N 1810000 using ...
- [BZOJ4383][POI2015] Pustynia-[线段树+dp+拓扑排序]
Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],. ...
随机推荐
- EasyUi – 4.datagrid
测试的时候用Json来测试就好啦. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> ...
- 与你相遇好幸运,Sail.js创建.sailsrc文件
在项目根目录下创建.sailsrc文件 { "generators": { "modules": {} }, "hooks": ...
- 【Javascript】IE8兼容 背景图片与a标签的onclick事件
先说几句牢骚话. 虽然IE8比之IE6.7有很大的进步,但是在执行效率.兼容性上仍然有很多问题.被广大开发者喜爱的平台才是好平台. 可惜多亏当年盗版XP打开中国的计算机市场,IE作为一款捆绑软件仍然在 ...
- mysql基础一
一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Serve ...
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...
- Spell checker
Spell checker Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU5489 Removed Interval(动态规划)
一个长度为n的序列,删除任意长度为l的连续子序列后,求剩下的序列的最长公共子序列. 先求出以第i个元素为开始的LIS的长度,再一次循环,对所要求的结果更新 #include<iostream&g ...
- Implementing Navigation with UINavigationController
Implementing Navigation with UINavigationController Problem You would like to allow your users to mo ...
- 求数组的长度 C
对于数组array,计算其占用内存大小和元素个数的方法如下: C/C++ code ? 1 2 3 4 5 //计算占用内存大小 sizeof(array) //计算数组元素个数 sizeof(a ...
- pythonchallenge之C++学习篇-01
字符处理时每个语言都具备的一种功能,其中还有一些语言因此出名,比如perl,shell,还有一些函数式的编程语言 C语言中的字符串与数组和指针联系的比较紧密,因此可以这样生命字符串*p="h ...