BZOJ_4383_[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,然后拓扑排序,给每个点分配一个合法且尽可能小的权值。
最后看是否有点没更新到,以及最大的权值是否超过上限。
现在的问题相当于区间连边,用一棵线段树维护一下即可。
 
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200050
int head[N<<3],to[N*12],nxt[N*12],val[N*12],cnt,in[N<<3],dis[N<<3],Q[N<<3],l,r,vis[N<<3];
int tot,ls[N<<2],rs[N<<2],root,a[N],idx[N],n,m;
void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w; in[v]++;
}
void build(int l,int r,int &p) {
p=++tot;
if(l==r) {idx[l]=p;return ;}
int mid=(l+r)>>1;
build(l,mid,ls[p]); build(mid+1,r,rs[p]);
add(ls[p],p,0); add(rs[p],p,0);
}
void update(int l,int r,int x,int y,int p) {
if(x<=l&&y>=r) {
add(p,tot,0); return ;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,ls[p]);
if(y>mid) update(mid+1,r,x,y,rs[p]);
}
int main() {
int s;
scanf("%d%d%d",&n,&s,&m);
build(1,n,root);
int i,x,y,k,j;
for(i=1;i<=s;i++) {
scanf("%d%d",&x,&y);
dis[idx[x]]=y; vis[idx[x]]=1;
}
for(i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&k);
a[0]=x-1; tot++;
for(j=1;j<=k;j++) {
scanf("%d",&a[j]);
add(tot,idx[a[j]],1);
if(a[j-1]+1<=a[j]-1) update(1,n,a[j-1]+1,a[j]-1,root);
}
if(a[k]!=y) update(1,n,a[k]+1,y,root);
}
for(i=1;i<=tot;i++) {
if(!in[i]) {
Q[r++]=i;
dis[i]=max(dis[i],1);
}
}
while(l<r) {
x=Q[l++];
for(i=head[x];i;i=nxt[i]) {
if(vis[to[i]]&&dis[x]+val[i]>dis[to[i]]) {
puts("NIE"); return 0;
}
dis[to[i]]=max(dis[to[i]],dis[x]+val[i]);
in[to[i]]--;
if(in[to[i]]==0) Q[r++]=to[i];
}
}
for(i=1;i<=n;i++) {
if(!dis[idx[i]]||dis[idx[i]]>1000000000) {
puts("NIE"); return 0;
}
}
puts("TAK");
for(i=1;i<n;i++) printf("%d ",dis[idx[i]]);
printf("%d",dis[idx[n]]);
}

BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序的更多相关文章

  1. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

  2. BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]

    收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...

  3. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  4. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

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

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

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

  6. [bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑

    5017: [Snoi2017]炸弹 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 608  Solved: 190[Submit][Status][ ...

  7. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

  8. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  9. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

随机推荐

  1. python和linux的环境设置/PATH

    一.python的环境设置 1.输出path列表: pi@raspberrypi:~$ pythonPython 3.4.0 (default, Jul 1 2014, 09:37:01) [GCC ...

  2. JavaSE的static、final、abstract修饰符

    static :静态常量,静态方法,静态代码块     静态变量:  静态变量属于类的,使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问.           注意: ...

  3. 成长笔记 - mysql-5.5.25-winx64安装步骤(及密码修改问题)

    操作系统:Windows 7 64位 下载地址: http://download.mysql.cn/src/2012/0602/5611.html 1. 将mysql-5.5.25-winx64.zi ...

  4. IntelliJ IDEA删除项目

    删除项目一向比较奇葩,因为当你点击到该项目名称右键时,并没有delete选项,导致我们不知道怎么删除,查找多方文档,得到以下解决: 1.将鼠标移到要删除的项目名称上,单击并按“Delete”按钮删除项 ...

  5. gdb生成的core文件位置

    gdb可以生成core文件,记录堆栈信息,core文件名字是下面这种格式 :core.9488,其中9488是PID 文件位置是当前目录

  6. POJ 题目3450 Corporate Identity(KMP 暴力)

    Corporate Identity Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5493   Accepted: 201 ...

  7. jQuery -&gt; 获取后代元素的三种方法

    假设我们有内容例如以下的html文件,那么怎样选取包括在<p>元素内的<i>元素呢? 邪馬台国の謎と弥生時代 紀元前1000年ごろ.水稲工作の技術をもつ集団が大挙して日本に移住 ...

  8. 【转载】VS工具使用——代码图

    代码图:     心想,反正也调不出来,就试试这个东西吧,一打开,就认识到自己发现了一个新大陆:这个代码图可以让我们对一个工程文件有大体的了解,即函数的调用关系等.它是一个VS2013自带工具生成函数 ...

  9. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  10. 开源项目:单行日历(CalendarView)

    http://www.cnblogs.com/warnier-zhang/p/4750525.html CalendarView.zip