Codeforces-786C-Till I Collapse(二分剪枝)

来源:互联网 发布:mars java 编辑:程序博客网 时间:2024/05/21 06:46

题目链接:Codeforces-786C-Till I Collapse

经过观察发现答案数组是非严格递减的,那么可以知道如果对于一个区间 [l,r] 中,如果 ans[l]==ans[r] 那么整个区间 ans 应该是一样的。所以把这种情况剪枝一下,然后就过了。。。。。。。
明显E比C,D简单,一脸懵逼。

#include<bits/stdc++.h>using namespace std;int c[100007];int vis[100007];int ans[100007];int n;int get_cnt(int k){    int res=0,cnt=0;    memset(vis,-1,sizeof(vis));    for(int i=1;i<=n;i++)    {        if(vis[c[i]]==res) continue;        vis[c[i]]=res;        cnt++;        if(cnt>k)        {            res++;            cnt=1;            vis[c[i]]=res;        }    }    return res+1;}void solve(int l,int r){    if(l>r) return ;    int cntl=get_cnt(l);    int cntr=get_cnt(r);    if(cntl==cntr)    {        for(int i=l;i<=r;i++)            ans[i]=cntl;        return ;    }    ans[l]=cntl;ans[r]=cntr;    int mid=(l+r)>>1;    solve(l+1,mid);    solve(mid+1,r-1);}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%d",&c[i]);    solve(1,n);    for(int i=1;i<=n;i++)        printf("%d ",ans[i]);    return 0;}
0 0