codechef: BINARY, Binary Movements

模擬題c++

把每堆 0 搞成一塊丟進雙端隊列,每次出現 1 就 XJB 亂搞模擬就行了(可能想一想仍是很麻煩的?尤爲對於我這種懶癌晚期?)git

複雜度均攤 O nspa

//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int M=1e6+3;
typedef int arr[M<<1];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline bool cmax(int& a,int b){return a<b?a=b,1:0;}
inline bool cmin(int& a,int b){return a>b?a=b,1:0;}
inline int read(){ int x=0,f=1; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int C=-1,Z;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
int n,m,r,top,tot; arr vis,pre,ans;
int main(){
    fp(i,1,read()){
        n=read(),m=read();
        r=top=M,tot=0;
        fp(i,M-n-1,M) pre[i]=i-1;
        Rg int cnt=0,x=0;
        fp(i,1,n){
            x=read();
            if(x){
                if(++top-m>0)
                    tot-=vis[top-m];
                if(cnt){
                    while(--cnt)
                        tot+=(r>top-m),
                        vis[r]=1,r=pre[r];
                    vis[top]=1,++tot;
                } else pre[top]=r,r=top;
                ans[i-tot]=1;
            } else ++cnt;
        }
        fp(i,1,n) sr[++C]=48+ans[i],sr[++C]=' ';
        sr[C]='\n';
        memset(vis+M-n,0,(n+2)<<2);
        memset(pre+M-n,0,(n+2)<<2);
        memset(vis+M,0,(n+2)<<2);
        memset(pre+M,0,(n+2)<<2);
        memset(ans,0,sizeof ans);
    } return Ot(),0;
}
相關文章
相關標籤/搜索