BZOJ3827 : [Poi2014]Around the world
把环倍长,破环成链
设f[i]表示i一次性能飞达的最右边的点,因为f[]单调递增,所以可以$O(n)$求出
这样就形成了一个树结构,对于每个节点,在其到根节点路径上二分出深度最大的点,使得其飞过一圈
常数优化:
注意到答案只有两种,所以可以进行最优性剪枝
内存优化:
只需要开3个200W的数组即可,分别表示相邻两站的距离、f[i]、存该点到根节点路径上所有点的栈
对于树结构的存储,注意到f[]单调递增,所以我们可以求出c[i]表示父亲为i的点的开始的位置
在DFS时,如果这个点第一次走到,那么它下一步就走向c[i],否则走向++c[i]
对于这个数组中的每个数,可以拆成两半,各11位,分别放进f[i]和b[i]的后11位中
#include<cstdio>
const int N=2000010,B=2097151;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int n,m,i,j,d,x,lim,ans,t,k,l,r,u,mid;unsigned int a[N],b[N],f[N];
inline void set(int x){(f[x]&=B)|=(i&2047)<<21,(b[x]&=B)|=i>>11<<21;}
inline void cal(int x){
if(!k){
l=1,r=t-1;
while(l<=r){
mid=(l+r)>>1;
if((b[mid]&B)>=x)l=(u=mid)+1;else r=mid-1;
}
ans=t-u,k=1;
}else{
if(t>ans&&(b[t-ans]&B)<x)k=2;
if(t+1>ans&&(b[t-ans+1]&B)>=x)ans--,k=2;
}
}
int main(){
read(n),read(m);
for(i=1;i<=n;i++){
read(x);a[i]=a[i+n]=x;
if(lim<x)lim=x;
}
while(m--){
read(d);
if(d<lim){puts("NIE");continue;}
for(j=i=1;i<=n*2;i++){
while(j<n*2&&d>=a[j])d-=a[j++];
f[i]=j;
d+=a[i];
b[i]=0;
}
k=f[b[t=1]=n*2]=0;
for(i=n*2-1;i;i--)set(f[i]&B);
while(t){
x=b[t]&B;
if((f[b[t+1]&B]&B)!=x){
if(x<=n)cal(x+n);
if(k==2)break;
i=(b[x]>>21<<11)|(f[x]>>21);
}else{
i=(b[t+1]&B)+1;
if((f[i]&B)!=x)i=0;
}
if(i)++t,b[t]=(b[t]>>21<<21)|i;else t--;
}
printf("%d\n",ans);
}
return 0;
}
BZOJ3827 : [Poi2014]Around the world的更多相关文章
- POI2014题解
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
- 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 , 显 ...
随机推荐
- unity3d 加密资源并缓存加载
原地址:http://www.cnblogs.com/88999660/archive/2013/04/10/3011912.html 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止 ...
- 当前标识(IIS APPPOOL\DefaultWebSite)没有对“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files“的写访问权限
将C#写的webservice发布到IIS后,通过浏览器访问测试,出现如下错误: 根据提示:对Tempory ASP.NET Files没有写访问权限,在资源管理其中定位到这个地址,发现没有这个文件夹 ...
- 2015安徽省赛 B.求和
题目描述 对于正整数n,k,我们定义这样一个函数f,它满足如下规律 现在给出n和k,你的任务就是要计算f(n,k)的值. 输入 首先是一个整数T,表示有T组数据 接下来每组数据是n和k(1<=n ...
- Merge Two Sorted Arrays
Merge two given sorted integer array A and B into a new sorted integer array. Example A=[1,2,3,4] B= ...
- 【leetcode】3Sum
3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find a ...
- Java构造方法的含义和使用
我们实例化对象时,一般使用"类名 对象名 = new 类名()"来实例化,其实这样并不是十分严谨,只是编译器帮我们自动补全了一个空的构造方法,当实例化对象时,构造方法会被自动调用, ...
- poj 3750 小孩报数问题 解题报告
题目链接:http://poj.org/problem?id=3750 约瑟夫问题,直接模拟即可. #include <iostream> #include <string> ...
- Android涉及到的设计模式
转载地址:http://blog.csdn.net/dengshengjin2234/article/details/8502097 1.适配器模式:ListView或GridView的Adapter ...
- 如何在Win8系统上建立WIFI热点
1.首先将鼠标移到桌面左下角,单击右键,在弹出的快捷菜单中找到“命令提示符(管理员)”,点击 2.点击后,系统就以管理员权限打开了命令提示符,在命令提示符中输入以下命令“netsh wlan set ...
- 小吃(codevs 3231)
3231 小吃 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 这里简直是吃货的天堂,小吃太多了. ...