把环倍长,破环成链

设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的更多相关文章

  1. POI2014题解

    POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...

  2. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  3. BZOJ 3524: [Poi2014]Couriers

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1905  Solved: 691[Submit][St ...

  4. [BZOJ3872][Poi2014]Ant colony

    [BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...

  5. 【BZOJ】【3522】【POI2014】Hotel

    暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...

  6. 【BZOJ】【3831】【POI2014】Little Bird

    DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...

  7. Bzoj 3831 [Poi2014]Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...

  8. BZOJ3522: [Poi2014]Hotel

    3522: [Poi2014]Hotel Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 195  Solved: 85[Submit][Status] ...

  9. 3522: [Poi2014]Hotel( 树形dp )

    枚举中点x( 即选出的三个点 a , b , c 满足 dist( x , a ) = dist( x , b ) = dist( x , c ) ) , 然后以 x 为 root 做 dfs , 显 ...

随机推荐

  1. HDU-1159 Common Subsequence 最长上升子序列

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  2. c# 继承,多态,new /overrid 区别, 引用父类的方法

    好久没碰c#了,偶尔需要制作点小工具.为了一个灵活的架构设计,需要对继承/多态有比较深刻的理解. 不料忘得差不多了,好吧,再来回忆下.直接上代码了,如下: using System; using Sy ...

  3. django-cms 代码研究(四)CMS_TEMPLATE标签

    CMS_TEMPLATE 继承这个东东可以在实现很灵活的布局,如下:

  4. Meta Programming

    [本文链接] http://www.cnblogs.com/hellogiser/p/meta-programming.html [分析] Template Mataprogram,中文叫模板元编程. ...

  5. ListView滑动删除效果实现

    通过继承ListView然后结合PopupWindow实现 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" ...

  6. 编译预处理命令--define和ifdef的使用

    这里将对常用的预处理命令进行学习. 一.宏定义  ·defined 格式:`defined     宏名      数值 或者 `define      宏名 注意:后面没有‘;‘,和单片机不一样: ...

  7. kvm xxx.xml文件的位置

    /var/run/libvirt/qemu/xxx.xml /etc/libvirt/qemu/xxx.xml

  8. Linux运维操作

    http://www.it165.net/os/html/201204/1909.html https://i.cnblogs.com/EditPosts.aspx?opt=1 http://www. ...

  9. ubuntu下eclipse无法启动问题

    添加-vm和对应参数 -vm/jdk安装目录/bin/java-startupplugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.j ...

  10. poj 3253:Fence Repair(堆排序应用)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23913   Accepted: 7595 Des ...