标签:简单 efi char har 通过 str == bzoj 并且
来自FallDream的博客,未经允许,请勿转载,谢谢
貌似是省队集训女队讲的题。。。
今天在bzoj找一道题无果,但是翻到了这道就顺便写了下。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MN 100000 using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n,m,p[MN+5],tms[MN+5],f[MN+5],From[MN+5],ans=0; inline int GetU(int x){return tms[x]<=0?1:-1;} inline int GetD(int x){return tms[x]>=0?1:-1;} void update(int x) { int l=x<<1,r=x<<1|1; if(p[x]) f[x]=0,From[x]=x; else { f[x]=1e9,From[x]=0; if(l<=n&&f[l]+GetD(l)<f[x]) f[x]=f[l]+GetD(l),From[x]=From[l]; if(r<=n&&f[r]+GetD(r)<f[x]) f[x]=f[r]+GetD(r),From[x]=From[r]; } } int main() { n=read();m=read(); for(int i=1;i<=n;++i) p[i]=read(); for(int i=n;i;--i) update(i); for(int i=1;i<=m;++i) { int x=read(),mn=f[x],Best=x,d=0; for(int t=x;t>1;t>>=1) if(f[t>>1]+(d+=GetU(t))<mn) mn=f[t>>1]+d,Best=t>>1; printf("%d ",ans+=mn);--p[From[Best]]; for(int i=From[Best];i>Best;i>>=1) ++tms[i],update(i); for(int i=x;i>Best;i>>=1) --tms[i],update(i); for(int i=Best;i;i>>=1) update(i); } return 0; }
[bzoj4849][Neerc2016]Mole Tunnels
标签:简单 efi char har 通过 str == bzoj 并且
原文地址:http://www.cnblogs.com/FallDream/p/bzoj4849.html