解题: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 年,人类进入了宇宙纪元. ...
随机推荐
- BugPhobia开发篇章:Scurm Meeting-更新至0x03
0x01 :目录与摘要 If you weeped for the missing sunset, you would miss all the shining stars 索引 提纲 整理与更新记录 ...
- Trick and Magic(OO博客第二弹)
代码是设计,不是简单的陈述.而设计不仅要求功能的正确性,更注重设计风格和模式. 真正可以投入应用的程序设计,不是那种无脑的“黑箱”,超巨大的数组,多重循环暴力搜索,成吨全局变量……事实上,在实际应用中 ...
- 20162328蔡文琛 大二week07
20162328 2017-2018-1 <程序设计与数据结构>第7周学习总结 教材学习内容总结 树是非线性结构,其元素组织为一个层次结构. 树的度表示树种任意节点的最大子节点数. 有m个 ...
- sprint站立会议
索引卡: 工作认领: 时间 ...
- 《Spring2之站立会议7》
<Spring2之站立会议7> 昨天,查相关资料解决debug:: 今天,解决了debug: 遇到问题,一些问题是得到解决了,但是一些还未被解决.
- ASP.NET MVC5 学习系列之初探MVC
一.由问题看本质 (一)什么是MVC? MVC是Model-View-Controller的简称.它是在1970年引入的软件设计模式.MVC 模式强迫关注分离 — 域模型和控制器逻辑与UI是松耦合关系 ...
- quartz任务管理
导入quartz相关jar包后,要执行任务的类须实现Job接口 package quartz; import org.quartz.Job; import org.quartz.JobExecutio ...
- Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
由于最近比较忙,一直到假期才有空,因此将自己学到的知识进行分享.如果有不对的地方,请指出,谢谢!目前深度学习越来越火,学习.使用tensorflow的相关工作者也越来越多.最近在研究tensorflo ...
- 学术诚信与职业道德——《构建之法》P384~391读后感
程序本身没有伦理和职业道德, 但是程序员和软件企业要有,因为程序员明白伦理道德的存在. 对于刚刚经历被不负责队友抛下的经历,对此很有感触,软件工程师除了遵守任务做事,也要考虑道德上.责任上的事情. 就 ...
- HDU 2061 Treasure the new start, freshmen!
http://acm.hdu.edu.cn/showproblem.php?pid=2061 Problem Description background:A new semester comes , ...