zoukankan      html  css  js  c++  java
  • BZOJ4985 评分(二分答案+树形dp)

      首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1。再简化一下考虑没有已固定的位置怎么做。考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树。设f[i]为使得某位置为1其子树至少要放多少个1即可,转移显然。加上已固定位置也类似,修改dp初值即可。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define N 100010
    char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
    int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    int n,m,cnt,p[N<<1][3],a[N],b[N],c[N],f[N<<1],ans;
    void dfs(int k)
    {
        if (k<=n) {f[k]=c[k]>=0?(c[k]?0:N):1;return;}
        dfs(p[k][0]),dfs(p[k][1]),dfs(p[k][2]);
        f[k]=min(min(f[p[k][0]]+f[p[k][1]],f[p[k][0]]+f[p[k][2]]),f[p[k][1]]+f[p[k][2]]);
    }
    bool check(int k)
    {
        memset(f,42,sizeof(f));
        memset(c,255,sizeof(c));
        for (int i=1;i<=m;i++) c[b[i]]=a[i]>=k?1:0;
        int tot=0;
        for (int i=m+1;i<=n;i++) tot+=a[i]>=k;
        dfs(cnt);
        return f[cnt]<=tot;
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("bzoj4985.in","r",stdin);
        freopen("bzoj4985.out","w",stdout);
        const char LL[]="%I64d
    ";
    #else
        const char LL[]="%lld
    ";
    #endif
        n=read(),m=read();
        int l=1,r=0;
        for (int i=1;i<=m;i++) r=max(r,a[i]=read()),b[i]=read();
        for (int i=m+1;i<=n;i++) r=max(r,a[i]=read());
        cnt=n;
        for (int i=1;i<=(n-1>>1);i++) cnt++,p[cnt][0]=i*3-2,p[cnt][1]=i*3-1,p[cnt][2]=i*3;
        while (l<=r)
        {
            int mid=l+r>>1;
            if (check(mid)) ans=mid,l=mid+1;
            else r=mid-1;
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    [模板] 主席树
    [模板] 替罪羊树
    [模板] Treap
    [LUOGU] P4342 [IOI1998]Polygon
    [JOYOI] 1051 选课
    poj 1845 数论(唯一分解定理+分治法求等比数列前n项的和mod m的值)
    poj 2418 bst统计字符串
    hdu 3791 二叉排序树
    hdu 3999 二叉排序树
    toj 3711 水题
  • 原文地址:https://www.cnblogs.com/Gloid/p/10056051.html
Copyright © 2011-2022 走看看