解题:POI 2015 PUS
还以为是差分约束,原来拓扑排序也能解决这样的问题=。=
类似差分约束的建图方式,我们把大小关系看做有向边。这样一来图上是不允许存在环的,于是我们可以做拓扑排序。然后问题来了,边数非常大,根本建不出图来=。=
不过我们有一个套路的做法,为每个区间配一个虚点,然后连边时先连到虚点再连到各个目标点。然后问题又来了,这样连边其实是$O(len^2)$的,$len$为区间长度,如果有个很大的区间这就萎了=。=
那什么东西解决区间问题好用呢?线段树— —我们用线段树优化建图,每次直接从虚点连到区间上,这样最多会连出来$k+klog$ $n$条边(点向虚点连的+虚点向区间连的),然后线段树内还有$4*n$条边,总共大概有不到570万条边,还可以接受。再之后做拓扑排序就可以了
注意数值的最大值和连边时的边权
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,maxx=1e9;
int num[N],ls[N],rs[N];
int vis[N],ins[N],dp[N],mem[N],que[N];
int p[N],noww[M],goal[M],val[M],deg[N];
int n,s,m,l,r,k,f,b,rd,t1,t2,t3,tn,cnt,tot,pos;
void GG(){printf("NIE"),exit();}
void link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v,deg[t]++;
}
void Create(int nde,int l,int r)
{
if(l==r) num[l]=nde;
else
{
int mid=(l+r)/;
ls[nde]=++tot,rs[nde]=++tot;
link(nde,ls[nde],),link(nde,rs[nde],);
Create(ls[nde],l,mid),Create(rs[nde],mid+,r);
}
}
void Change(int nde,int l,int r,int nl,int nr,int task)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
link(task,nde,);
else
{
int mid=(l+r)/;
Change(ls[nde],l,mid,nl,nr,task);
Change(rs[nde],mid+,r,nl,nr,task);
}
}
bool DFS(int nde)
{
vis[nde]=ins[nde]=true;
for(int i=p[nde];i;i=noww[i])
{
if(ins[goal[i]]) return false;
if(!vis[goal[i]]&&!DFS(goal[i])) return false;
}
ins[nde]=false; return true;
}
int main ()
{
scanf("%d%d%d",&n,&s,&m);
Create(tot=,,n),b=-;
for(int i=;i<=s;i++)
{
scanf("%d%d",&pos,&rd);
mem[num[pos]]=rd;
}
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
int last=t1; tot++;
for(int j=;j<=t3;j++)
{
scanf("%d",&rd); link(num[rd],tot,);
if(last<rd) Change(,,n,last,rd-,tot);
last=rd+;
}
if(last<=t2) Change(,,n,last,t2,tot);
}
for(int i=;i<=tot;i++)
dp[i]=mem[i]?mem[i]:maxx;
for(int i=;i<=tot;i++)
{
if(!vis[i]&&!DFS(i)) GG();
if(!deg[i]) que[++b]=i;
}
while(f<=b)
{
if(dp[tn=que[f++]]<) GG();
for(int i=p[tn];i;i=noww[i])
{
if(dp[tn]-val[i]<mem[goal[i]]) GG();
dp[goal[i]]=min(dp[goal[i]],dp[tn]-val[i]);
if(!(--deg[goal[i]])) que[++b]=goal[i];
}
}
printf("TAK\n");
for(int i=;i<=n;i++) printf("%d ",dp[num[i]]);
return ;
}
解题:POI 2015 PUS的更多相关文章
- 解题:POI 2015 Pieczęć
题面 发现好像没有什么好做法,那就模拟么=.= 以印章左上角的'x'为基准,记录印章上'x'的相对位置模拟.记录相对位置是因为可能有这种情况↓ 直接模拟是会漏掉的=.= #include<cst ...
- 解题:POI 2015 Kinoman
题面 发现每种电影只在两场之间产生贡献(只有$pos$的一场的就在$[pos,n]$产生贡献).那么我们针对每个位置$i$求出这场电影下一次出现的位置$nxt[i]$,然后每次更新一下,求整个区间的最 ...
- [BZOJ 3747] [POI 2015] Kinoman【线段树】
Problem Link : BZOJ 3747 题解:ZYF-ZYF 神犇的题解 解题的大致思路是,当区间的右端点向右移动一格时,只有两个区间的左端点对应的答案发生了变化. 从 f[i] + 1 到 ...
- Odwiedziny[POI 2015]
题目描述 给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i]. Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并 ...
- [POI 2015]Kinoman
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- 2015 German Collegiate Programming Contest (GCPC 15) + POI 10-T3(12/13)
$$2015\ German\ Collegiate\ Programming\ Contest\ (GCPC 15) + POI 10-T3$$ \(A.\ Journey\ to\ Greece\ ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
随机推荐
- prometheus-operator 监控 Rabbitmq集群
首先我们监控服务需要知道prometheus-operator是如何去工作的,才好去写相关的yaml配置,这里我划分成了5个部分,如果容器服务本身就以k8s来编排的,那就只需要三步,这里因为我的rab ...
- codeforces 1133E K Balanced Teams
题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的 ...
- TensorFlow --- 01初识
由于博客园对Markdown支持不够友好,阅读此文请前往云栖社区:TensorFlow --- 01初识
- Hyperledger Fabric(v1.2.0)代码分析1——channel创建
Hyperledger Fabric(v1.2.0)代码分析1--channel创建 0. e2e_cli Hyperledger Fabric提供了一个e2e的例子,该例中创建了一个基础的区块链网络 ...
- linux go环境安装
方法一 这次将源码包安装的目录是是/root下. 1.官网下载源码包. 官网链接:https://golang.org/dl/ wget https://storage.googleapis.co ...
- AbstractQueuedSynchronizer 原理分析 - 独占/共享模式(转)
1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作.AQS 是很多同步器的基础框架,比如 ...
- 分布式日志收集收集系统:Flume(转)
Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力.Fl ...
- 利用cocoapods创建基于git的私有库Spec Repo
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- Daily Scrum (2015/11/5)
这天晚上我们对爬虫进行了一些测试,发现仍然存在一些不小的BUG.现在我们的爬虫已经能完成基本的功能,焉域政同学也正在把他之前写的分类功能继续完善.在BUG的测试中,我们发现如果要求爬虫爬取特定的文件类 ...
- First Blood
自我介绍 大家好!我的名字是戴俊涵,代号211606359,喜欢看电影和古风音乐,也是一个资深漫迷(让世界感受痛楚吧),喜欢的美食是牛排. 回想初衷 (1)回想一下你初入大学时对本专业的畅想 当初你是 ...