【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序
题面


100
注意到ban的只会是一个子树,所以我们把原树转化为dfs序列。
然后题目就转化为,询问一段ban的区间,之后的背包问题。
比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并,遂无果,爆零。
由于ban的是一段区间,所以肯定是将前缀和后缀合并。
我们预处理出前缀背包,和后缀背包。
然后合并两个背包就可以了。
具体的合并,Two pointers。
还要卡常。
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define ui unsigned int
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="plan.in";
const char* fout="plan.out";
const int maxn=1007,maxm=maxn*2,maxv=50007,maxt=2000;
int n,m,fi[maxn],la[maxm],ne[maxm],tot,mx,pre[maxn],suf[maxn],A,B;
int dfn[maxn],low[maxn],num,va[maxn],co[maxn],a[maxv],b[maxv];
ui f[maxn][maxv],g[maxn][maxv],inf;
void add_line(int a,int b){
tot++;
ne[tot]=fi[a];
la[tot]=b;
fi[a]=tot;
}
void dfs(int v,int from){
dfn[v]=++num;
for(int k=fi[v];k;k=ne[k])
if (la[k]!=from)
dfs(la[k],v);
low[v]=num;
}
void dp(ui *f,ui *g,int v){
fd(i,mx,0){
if (g[i]==inf) continue;
f[i+va[v]]=(f[i+va[v]]<g[i]+co[v]?f[i+va[v]]:g[i]+co[v]);
f[i]=(f[i]<g[i]?f[i]:g[i]);
mx=(mx>i+va[v]?mx:i+va[v]);
}
fd(i,mx-1,0) f[i]=(f[i+1]<f[i]?f[i+1]:f[i]);
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&n);
fo(i,1,n-1){
int j,k;
scanf("%d%d",&j,&k);
add_line(j,k);
add_line(k,j);
}
dfs(1,0);
fo(i,1,n) scanf("%d%d",&va[dfn[i]],&co[dfn[i]]);
inf=-1;
memset(f,255,sizeof f);
memset(g,255,sizeof g);
f[0][0]=0;
g[n+1][0]=0;
mx=pre[0]=0;
fo(i,1,n) dp(f[i],f[i-1],i),pre[i]=mx;
mx=suf[n+1]=0;
fd(i,n,1) dp(g[i],g[i+1],i),suf[i]=mx;
scanf("%d",&m);
fo(i,1,m){
int x;
ui lim;
scanf("%d%ud",&x,&lim);
A=dfn[x]-1;B=low[x]+1;
int k=suf[B],ans=0;
fo(j,0,pre[A]){
if (f[A][j]==inf) continue;
while (k>=0 && (g[B][k]==inf || f[A][j]+g[B][k]>lim))
k--;
if (k<0) break;
ans=max(j+k,ans);
}
printf("%d\n",ans);
}
return 0;
}
【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序的更多相关文章
- GDSOI2017第三轮模拟4.21 总结
1 第一题看着就觉得猎奇,于是就想着打暴力就跑. 但是很严重的问题就是... \(D\)和\(B\)打反了,都不知道当时在干什么??? 原本可以拿35. 2 第二题看着就觉得套路,于是想着今天就攻这题 ...
- 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)
题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...
- 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)
[BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- PAT1030 Travel Plan (30)---DFS
(一)题意 题目链接:https://www.patest.cn/contests/pat-a-practise/1030 1030. Travel Plan (30) A traveler's ma ...
- PAT 1030 Travel Plan[图论][难]
1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...
- 1030 Travel Plan (30 分)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...
- [图算法] 1030. Travel Plan (30)
1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...
- PAT_A1030#Travel Plan
Source: PAT A1030 Travel Plan (30 分) Description: A traveler's map gives the distances between citie ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
随机推荐
- 跟我一起在Win10中用VMware安装Ubuntu
VMware下安装Ubuntu 打开VMware,创建虚拟机: 点击运行虚拟机,报错为 解决办法为 大功告成,我们已经在Win10中用VMware安装Ubuntu了
- [转]WPF的Presenter(ContentPresenter)
这是2年前写了一篇文章 http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html 我们先来看M ...
- 延迟对象deferred
Twisted 官方称,“Twisted is event-based, asynchronous framework ”.这个“异步”功能的代表就是 deferred. deferred 的作用类似 ...
- 19-10-19-I
中午考试困够呛. T1 我想打矩阵快速幂,然后我咕了 T2 打T1了所以又咕了. T3 每一个黑点更新答案只有两种方式: 更新子树. 更新父链上的兄弟,叔伯,…… 于是: 把树拍在$DFS$序上. 更 ...
- MATLAB技巧—sort和sortrows函数
MATLAB技巧-sort和sortrows函数 1.sort函数 sort函数用于对数据进行排序,通过help sort命令,可以查找到sort函数的具体用法: Y = SORT(X,DIM,MOD ...
- jsonp 请求报Uncaught SyntaxError: Unexpected token :
$(document).ready(function() { jQuery.ajax({ type: 'GET', url: 'http://wncrunners.com/admin/colors.j ...
- Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】
初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...
- UVA11916 Emoogle Grid
Emoogle Grid You have to color an M × N (1 ≤ M, N ≤ 108 ) two dimensional grid. You will be provided ...
- Luogu P1979 华容道(bfs+最短路)
P1979 华容道 题意 题目描述 小B最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成, 最少需要多少时间. ...
- Luogu P1073 最优贸易(最短路)
P1073 最优贸易 题意 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有 ...