【BZOJ4383】[POI2015]Pustynia 线段树优化建图

时间:2022-09-25 19:15:00

【BZOJ4383】[POI2015]Pustynia

Description

给定一个长度为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个数大(严格大于,即没有等号)。
请任意构造出一组满足条件的方案,或者判断无解。

Input

第一行包含三个正整数n,s,m(1<=s<=n<=100000,1<=m<=200000)。
接下来s行,每行包含两个正整数p[i],d[i](1<=p[i]<=n,1<=d[i]<=10^9),表示已知a[p[i]]=d[i],保证p[i]递增。
接下来m行,每行一开始为三个正整数l[i],r[i],k[i](1<=l[i]<r[i]<=n,1<=k[i]<=r[i]-l[i]),接下来k[i]个正整数x[1],x[2],...,x[k[i]](l[i]<=x[1]<x[2]<...<x[k[i]]<=r[i]),表示这k[i]个数中的任意一个都比任意一个剩下的r[i]-l[i]+1-k[i]个数大。Σk <= 300,000

Output

若无解,则输出NIE。
否则第一行输出TAK,第二行输出n个正整数,依次输出序列a中每个数。

Sample Input

5 2 2
2 7
5 3
1 4 2 2 3
4 5 1 4

Sample Output

TAK
6 7 1000000000 6 3

题解:这种类型的题还真是熟能生巧啊~

我们令一条边权为1的有向边(a,b)表示Va<Vb,边权为0的有向边表示Va<=Vb。然后对于题中给出的限制条件:[l,r]中的{a1,a2,..ak}比其他数都大,我们可以从一个新建的节点u向a1,a2,...ak连边,从剩余的节点向u连边。但是剩余的节点可能很多,我们可以将它们视为k+1个区间,用线段树优化建图。

连完边后跑一边拓扑排序就知道有没有环了,在拓扑排序的同时顺便就能求出可行方案了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define lson (x<<1)
#define rson (x<<1|1)
using namespace std;
const int maxn=1000010;
int n,N,m,S,cnt,now;
int to[3000000],next[3000000],val[3000000],head[maxn],v[maxn],s[maxn],p[maxn],d[maxn];
queue<int> q;
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
//printf("*%d %d %d\n",a,b,c);
}
void build(int l,int r,int x)
{
if(l==r)
{
now=max(now,x+n),v[x+n]=v[l],add(l,x+n,0);
return ;
}
int mid=l+r>>1;
add(lson+n,x+n,0),add(rson+n,x+n,0);
build(l,mid,lson),build(mid+1,r,rson);
}
void updata(int l,int r,int x,int a,int b)
{
if(a>b) return ;
if(a<=l&&r<=b)
{
add(x+n,now,0);
return ;
}
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b);
if(b>mid) updata(mid+1,r,rson,a,b);
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
//freopen("bz4383.in","r",stdin);
//freopen("bz4383.out","w",stdout);
n=rd(),S=rd(),m=rd();
int i,j,u,a,b,c;
memset(head,-1,sizeof(head));
for(i=1;i<=S;i++) a=rd(),b=rd(),v[a]=b;
build(1,n,1);
for(i=1;i<=m;i++)
{
now++,a=rd(),b=rd(),c=rd();
p[0]=a-1,p[c+1]=b+1;
for(j=1;j<=c;j++) p[j]=rd(),add(now,p[j],1);
for(j=1;j<=c+1;j++) updata(1,n,1,p[j-1]+1,p[j]-1);
}
for(i=1;i<=now;i++) for(j=head[i];j!=-1;j=next[j]) d[to[j]]++;
for(i=1;i<=now;i++) if(!d[i]) q.push(i);
while(!q.empty())
{
u=q.front(),q.pop();
if(v[u])
{
if(s[u]<=v[u]) s[u]=v[u];
else
{
printf("NIE");
return 0;
}
}
else if(u<=n) s[u]=max(s[u],1);
if(s[u]>1000000000)
{
printf("NIE");
return 0;
}
for(i=head[u];i!=-1;i=next[i])
{
s[to[i]]=max(s[to[i]],s[u]+val[i]),d[to[i]]--;
if(!d[to[i]]) q.push(to[i]);
}
}
for(i=1;i<=now;i++) if(d[i])
{
printf("NIE");
return 0;
}
printf("TAK\n");
for(i=1;i<n;i++) printf("%d ",s[i]);
printf("%d",s[n]);
return 0;
}

【BZOJ4383】[POI2015]Pustynia 线段树优化建图的更多相关文章

  1. bzoj4383 &lbrack;POI2015&rsqb;Pustynia 拓扑排序&plus;差分约束&plus;线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  2. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  3. loj&num;2255&period; 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  4. bzoj3073&colon; &lbrack;Pa2011&rsqb;Journeys 线段树优化建图

    bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...

  5. BZOJ 3073&colon; &lbrack;Pa2011&rsqb;Journeys Dijkstra&plus;线段树优化建图

    复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...

  6. 【bzoj4383】&lbrack;POI2015&rsqb;Pustynia 线段树优化建图&plus;差分约束系统&plus;拓扑排序

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

  7. BZOJ 4276 &lbrack;ONTAK2015&rsqb;Bajtman i Okr&aogon;g&lstrok;y Robin 费用流&plus;线段树优化建图

    Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...

  8. codeforces 787D - Legacy 线段树优化建图&comma;最短路

    题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...

  9. Codeforces 1045A Last chance 网络流&comma;线段树&comma;线段树优化建图

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...

随机推荐

  1. Android Butterknife 8&period;4&period;0 使用方法总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6016341.html 本文出自[赵彦军的博客] 前言 ButterKnife 简介 ButterKnife是 ...

  2. ios常用的第三方库

    ios开发中有可能用到的第三方库进行记录一下: 注:资料信息来源于网络 自己整理  https://developer.apple.com/reference(苹果官方文档) https://gith ...

  3. Socket编程注意接收缓冲区大小

    转自:http://www.cnblogs.com/ITBread/p/3900254.html 最近在做一个udp升级程序,因文件有点大,需要将程序分成多个包发送,每次发送一个包,收到回复后发送下一 ...

  4. MVC如何配置才能访问静态页面

    默认在Views文件外的静态页面可以访问,若要访问Views里的静态页面则需要修改View文件夹中的web.config: <system.webServer> <handlers& ...

  5. JQuery Mobile页面的载入方式

    1.JQM页面结构 jQuery Mobile是通过data-role属性来区分渲染界面样式的,JQM里面提供的data-role如下表: 参数 说明 page 页面容器,其内部的mobile元素将会 ...

  6. C&num;中如何只保留小数点后面两位?

    string.format("%.4f",1/3) 1.Math.Round(0.333333,2);//按照四舍五入的国际标准2. double dbdata=0.335333; ...

  7. AIX常用命令略记

    ■ 初始化端末时可能需要确认服务器端和端末时间是否匹配 ●cal 显示日历 ●date 显示服务前当前时间 ■    显示当前目录,即显示当前所在目录的adress ●pwd(print workin ...

  8. Linq 透明标识符

    IEnumerable<Person> list = new List<Person> { , Id = }, , Id = }, , Id = }, , Id = }, , ...

  9. 使用google搜索时的10个小技巧!

    为大家分享一些google的技巧,很多工作了好几年的同学还不知道如何高效的利用这些技巧,希望同学们掌握!此为google的技巧,百度现在也基本上都实现了这些功能.   使用搜索引擎的10个搜索技巧   ...

  10. python 基础 ------字符串的调用详解(1)

    Python 字符串的的调用方法~~~ 废话不多说直接奔主题 >>>>>>>>>>>>>>>>> ...