POI2014
...一个shabi和一堆神题的故事
今天只写了两道
之后随缘更吧
啊 顺便 snake我是不会更的
bzoj3829 POI2014 Farmcraft
当先走$u$再走$v$的时候时间是$f[u] + 1 + 2 \times size[u] + f[v] + 1$
当先走$u$再走$v$的时候时间是$f[v] + 1 + 2 \times size[v] + f[u] + 1$
#include<bits/stdc++.h>
using namespace std; inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
int n;
const int maxn = ;
int first[maxn],to[maxn << ],nx[maxn << ],cnt;
int val[maxn],size[maxn],fa[maxn];
int f[maxn];
int sons[maxn];
inline void add(int u,int v){to[++cnt] = v;nx[cnt] = first[u];first[u] = cnt;}
inline bool cmp(int u,int v){return max(f[u], * size[u] + f[v]) < max(f[v], * size[v] + f[u]);}
inline void dfs(int x)
{
size[x] = ;
for(int i=first[x];i;i=nx[i])
{
if(to[i] == fa[x])continue;
fa[to[i]] = x;dfs(to[i]);size[x] += size[to[i]];
}
int nt = ,tmp = ;
f[x] = val[x];
for(int i=first[x];i;i=nx[i]){if(to[i] == fa[x])continue;sons[++nt] = to[i];}
sort(sons + ,sons + nt + ,cmp);
for(int i=;i<=nt;++i)f[x]=max(f[x],tmp*+f[sons[i]]+),tmp+=size[sons[i]];
}
int main()
{
n = read();
for(int i=;i<=n;i++)val[i] = read();
for(int i=;i<n;i++)
{
int u = read(),v = read();
add(u,v);add(v,u);
}
dfs();
cout<<max(f[],(n-)*+val[]);
}
bzoj3832 Rally
一个DAG,每条边长度都是$1$,求删掉一个点之后最长路的最小值
输出最小值和那个点
$n \leq 500000$
$m \leq 2 \times n$
sol:神题
首先我们建超级源$S$,超级汇$T$,每个点向源汇连边$(S -> X -> T)$
这样图上最长链就变成了$S$到$T$最长链
我们可以拓扑序$dp$出每个点到$S$到$T$的最长链$f[x]$和$g[x]$
这样就是对一个割集内的每条边$(x,y)$求$f[x] + g[y]$的最大值
我们另所有点都在$T$集,$S$在$S$集
每次从$T$删一个点加入$S$
删除的时候删掉它的入边 记录答案 然后加入它的出边
具体 我们要加入一个元素 删除一个元素 查询最大值
这个用堆或者线段树都可以
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
int n,m;
const int maxn = ;
struct Graph
{
int first[maxn],to[maxn << ],nx[maxn << ],cnt;
int ind[maxn],indd[maxn];
inline void add(int u,int v){to[++cnt] = v;nx[cnt] = first[u];first[u] = cnt;ind[v]++;indd[v]++;}
}G,rev;
priority_queue<int> q1,q2;
queue<int> q;
int dp[maxn],f[maxn];
inline void push(int x){q1.push(x);}
inline void del(int x){q2.push(x);while(!q1.empty() && !q2.empty() && (q1.top() == q2.top()))q1.pop(),q2.pop();}
inline int top(){if(q1.empty())return ;return q1.top();}
void toposort()
{
for(int i=;i<=n;i++)
if(G.ind[i] == )q.push(i);
while(!q.empty())
{
int now = q.front();q.pop();
for(int i=G.first[now];i;i=G.nx[i])
{
G.ind[G.to[i]]--;
dp[G.to[i]] = max(dp[G.to[i]],dp[now] + );
if(G.ind[G.to[i]] == )q.push(G.to[i]);
}
}
while(!q.empty())q.pop();
for(int i=;i<=n;i++)
if(rev.ind[i] == )q.push(i);
while(!q.empty())
{
int now = q.front();q.pop();
for(int i=rev.first[now];i;i=rev.nx[i])
{
rev.ind[rev.to[i]]--;
f[rev.to[i]] = max(f[rev.to[i]],f[now] + );
if(rev.ind[rev.to[i]] == )q.push(rev.to[i]);
}
}
}
void solve()
{
int ans = (n << ),id;
while(!q.empty())q.pop();
for(int i=;i<=n;i++)
if(G.indd[i] == )q.push(i);
while(!q.empty())
{
int now = q.front();q.pop();
del(f[now]);
for(int i=rev.first[now];i;i=rev.nx[i])del(dp[rev.to[i]] + f[now] + );
if(top() < ans)
{
ans = top();
id = now;
}
for(int i=G.first[now];i;i=G.nx[i])
{
push(f[G.to[i]] + dp[now] + );
G.indd[G.to[i]]--;
if(G.indd[G.to[i]] == )q.push(G.to[i]);
}
push(dp[now]);
}
printf("%d %d",id,ans);
}
int main()
{
n = read();m = read();
for(int i=;i<=m;i++){int u = read(),v = read();G.add(u,v);rev.add(v,u);}
toposort();
for(int i=;i<=n;i++)push(f[i]);
solve(); }
POI2014的更多相关文章
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- 【BZOJ】【3522】【POI2014】Hotel
暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...
- 【BZOJ】【3831】【POI2014】Little Bird
DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...
- Bzoj 3831 [Poi2014]Little Bird
3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...
- BZOJ3522: [Poi2014]Hotel
3522: [Poi2014]Hotel Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 195 Solved: 85[Submit][Status] ...
- 3522: [Poi2014]Hotel( 树形dp )
枚举中点x( 即选出的三个点 a , b , c 满足 dist( x , a ) = dist( x , b ) = dist( x , c ) ) , 然后以 x 为 root 做 dfs , 显 ...
- 【BZOJ3524/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- 3522: [Poi2014]Hotel
3522: [Poi2014]Hotel Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 253 Solved: 117[Submit][Status ...
随机推荐
- window.close关闭当前页面
浏览器处于安全策略考虑,只允许Javascript关闭由javascript打开的页面,为了用js关闭当前窗口,我们可以这么考虑,这也是最常用的做法. <a href="javascr ...
- TimeSpan时间间隔
一个TimeSpan对象都表示一个时间间隔 (持续时间的时间或时间),单位为正数或负数的天数. 小时. 分钟. 秒和小数部分的第二个数字.TimeSpan结构还可以用于表示一天时间,但仅,如果与某一特 ...
- deeplearning.net 0.1 document - Multilayer Perceptron
Multilayer Perceptron 以下我们使用Theano来介绍一下单隐藏层的多层感知机(MLP).MLP能够看成一个logistic回归分类器,它使用一个已经学习的非线性转换器处理输入.这 ...
- ReactiveCocoa入门教程——第一部分【转载】
作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...
- 机器学习实战之SVM
一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要进行相关的代码编写和测试,二者想和结合,才能更好的帮助我们理解SVM这一非常优秀的分类算法 支持向量机是一种二类分类算法,假 ...
- Spark源码分析之五:Task调度(一)
在前四篇博文中,我们分析了Job提交运行总流程的第一阶段Stage划分与提交,它又被细化为三个分阶段: 1.Job的调度模型与运行反馈: 2.Stage划分: 3.Stage提交:对应TaskSet的 ...
- CPI
CPI (Consumer Price Index 物价指数) 是政府用来衡量通货膨胀的其中一个数据.通俗的讲,CPI就是市场上的货物价格增长百分比.一般市场经济国家认为CPI在2-3%属于可接受范围 ...
- liunx 安装工具总结
1 下载相关文件,比如hadoop 2 解压文件 tar -zxcf xxx.tar.gz 3 mv xxx 到指定目录:通常安装到/usr/local 或者自己建个目录 /usr/develo ...
- CF459C Pashmak and Buses 打印全排列
这题假设将终于的结果竖着看,每一列构成的数能够看成是k进制的数.一共同拥有d列,随意两列都不同样,所以这就是一个d位k进制数全排列的问题,一共同拥有k ^ d个排列.假设k ^ d < n,则打 ...
- HashMap与 HashTable, Treemap的区别
(一)HashMap 1.HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null; 2.HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数 ...