【IOI2014】【BZOJ4367】holiday假期
2016-03-07 20:04
302 查看
Description
健佳正在制定下个假期去台湾的游玩计划。在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点。
在台湾共有n个城市,它们全部位于一条高速公路上。这些城市连续地编号为0到n-1。对于城市i(0 < i< n-1)而言,与其相邻的城市是i-1和i+1。但是对于城市 0,唯一与其相邻的是城市 1。而对于城市n-1,唯一与其相邻的是城市n-2。
每个城市都有若干景点。健佳有d天假期并且打算要参观尽量多的景点。健佳已经选择了假期开始要到访的第一个城市。在假期的每一天,健佳可以选择去一个相邻的城市,或者参观所在城市的所有景点,但是不能同时进行。即使健佳在同一个城市停留多次,他也不会去重复参观该城市的景点。请帮助健佳策划这个假期,以便能让他参观尽可能多的景点。
Input
第1行: n, start, d.
第2行: attraction[0], …, attraction[n-1].
n: 城市数。
start: 起点城市的编号。
d: 假期的天数。
attraction: 长度为n的数组;attraction[i] 表示城市i的景点数目,其中0≤i≤n-1。
Output
输出一个整数表示健佳最多可以参观的景点数。
Sample Input
5 2 7
10 2 20 30 1
Sample Output
60
HINT
假 设健佳有 7 天假期,有 5 个城市(参见下表),而且他由城市 2 开始。在第一天,健佳参观城市2的 20 个景点。第二天,健佳由城市 2 去往城市 3。而在第三天,健佳参观城市 3 的30 个景点。接下来的3天,健佳由城市 3 前往城市 0。而在第 7 天,健佳参观城市0的 10 个景点。这样健佳参观的景点总数是20+30+10=60,这是他由城市 2 开始、在 7 天假期内最多能参观的景点数目。
Source
鸣谢yts1999上传
fye选的胡策题有毒..
其实感觉跟3711 PA2014Drunzy的姿势很像
就是这题用来维护的数据结构更厉害,DP的思路也更厉害..
健佳正在制定下个假期去台湾的游玩计划。在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点。
在台湾共有n个城市,它们全部位于一条高速公路上。这些城市连续地编号为0到n-1。对于城市i(0 < i< n-1)而言,与其相邻的城市是i-1和i+1。但是对于城市 0,唯一与其相邻的是城市 1。而对于城市n-1,唯一与其相邻的是城市n-2。
每个城市都有若干景点。健佳有d天假期并且打算要参观尽量多的景点。健佳已经选择了假期开始要到访的第一个城市。在假期的每一天,健佳可以选择去一个相邻的城市,或者参观所在城市的所有景点,但是不能同时进行。即使健佳在同一个城市停留多次,他也不会去重复参观该城市的景点。请帮助健佳策划这个假期,以便能让他参观尽可能多的景点。
Input
第1行: n, start, d.
第2行: attraction[0], …, attraction[n-1].
n: 城市数。
start: 起点城市的编号。
d: 假期的天数。
attraction: 长度为n的数组;attraction[i] 表示城市i的景点数目,其中0≤i≤n-1。
Output
输出一个整数表示健佳最多可以参观的景点数。
Sample Input
5 2 7
10 2 20 30 1
Sample Output
60
HINT
假 设健佳有 7 天假期,有 5 个城市(参见下表),而且他由城市 2 开始。在第一天,健佳参观城市2的 20 个景点。第二天,健佳由城市 2 去往城市 3。而在第三天,健佳参观城市 3 的30 个景点。接下来的3天,健佳由城市 3 前往城市 0。而在第 7 天,健佳参观城市0的 10 个景点。这样健佳参观的景点总数是20+30+10=60,这是他由城市 2 开始、在 7 天假期内最多能参观的景点数目。
Source
鸣谢yts1999上传
fye选的胡策题有毒..
其实感觉跟3711 PA2014Drunzy的姿势很像
就是这题用来维护的数据结构更厉害,DP的思路也更厉害..
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 250010 #define LL long long #define GET (ch>='0'&&ch<='9') #define SIZE 1800000 using namespace std; int n,st,m,cnt; LL ret,ans; int root[MAXN]; int b[MAXN],sta[MAXN],c; int ls[SIZE],rs[SIZE],sz[SIZE]; LL sum[SIZE]; int fd[MAXN],gd[MAXN],f1d[MAXN],g1d[MAXN]; LL f[MAXN],g[MAXN],f1[MAXN],g1[MAXN]; inline void in(int &x) { char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar(); } void ins(int x,int &y,int l,int r,int val,LL Val) { sz[y=++cnt]=sz[x]+1;sum[y]=sum[x]+Val; ls[y]=ls[x];rs[y]=rs[x]; if (l==r) return; int mid=(l+r)>>1; if (val<=mid) ins(ls[x],ls[y],l,mid,val,Val); else ins(rs[x],rs[y],mid+1,r,val,Val); } void query(int x,int y,int l,int r,int k) { if (k<=0) return; if (l==r) { ret+=1ll*min(k,sz[y]-sz[x])*sta[l];return; } int mid=(l+r)>>1; //if (sz[ls[y]]-sz[ls[x]]>=k) query(ls[x],ls[y],l,mid,k); //else ret+=sum[rs[y]]-sum[rs[x]],query(rs[x],rs[y],mid+1,r,k-sz[ls[y]]+sz[ls[x]]); if (sz[rs[y]]-sz[rs[x]]>=k) query(rs[x],rs[y],mid+1,r,k); else ret+=sum[rs[y]]-sum[rs[x]],query(ls[x],ls[y],l,mid,k-sz[rs[y]]+sz[rs[x]]); } void solve1(int l,int r,int L,int R)//l,r status L,R decision { if (l>r) return; int mid=(l+r)>>1; for (int i=L;i<=R;i++) { ret=0;query(root[st-1],root[i],1,c,st-i+mid); if (ret>f[mid]||!fd[mid]) f[mid]=ret,fd[mid]=i; } solve1(l,mid-1,L,fd[mid]);solve1(mid+1,r,fd[mid],R); } void solve2(int l,int r,int L,int R) { if (l>r) return; int mid=(l+r)>>1; for (int i=R;i>=L;i--) { ret=0;query(root[i-1],root[st-1],1,c,i-st+mid); if (ret>g[mid]||!gd[mid]) g[mid]=ret,gd[mid]=i; } solve2(l,mid-1,gd[mid],R);solve2(mid+1,r,L,gd[mid]); } void solve3(int l,int r,int L,int R) { if (l>r) return; int mid=(l+r)>>1; for (int i=L;i<=R;i++) { ret=0;query(root[st-1],root[i],1,c,((st-i)<<1)+mid); if (ret>f1[mid]||!f1d[mid]) f1[mid]=ret,f1d[mid]=i; } solve3(l,mid-1,L,f1d[mid]);solve3(mid+1,r,f1d[mid],R); } void solve4(int l,int r,int L,int R) { if (l>r) return; int mid=(l+r)>>1; for (int i=R;i>=L;i--) { ret=0;query(root[i-1],root[st-1],1,c,((i-st)<<1)+mid); if (ret>g1[mid]||!g1d[mid]) g1[mid]=ret,g1d[mid]=i; } solve4(l,mid-1,g1d[mid],R);solve4(mid+1,r,L,g1d[mid]); } int main() { in(n);in(st);in(m);st++; for (int i=1;i<=n;i++) in(b[i]),sta[i]=b[i]; sort(sta+1,sta+n+1);c=unique(sta+1,sta+n+1)-sta-1; for (int i=1;i<=n;i++) b[i]=lower_bound(sta+1,sta+c+1,b[i])-sta, ins(root[i-1],root[i],1,c,b[i],sta[b[i]]); solve1(1,m,st,min(n,st+m));solve2(1,m,max(1,st-m),n); solve3(1,m,st,min(n,st+(m>>1)));solve4(1,m,max(1,st-(m>>1)),n); for (int i=0;i<=m;i++) ans=max(ans,g1[i]+f[m-i]); for (int i=0;i<=m;i++) ans=max(ans,f1[i]+g[m-i]); cout<<ans<<endl; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow