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;
    }
  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/Gloid/p/10056051.html
Copyright © 2011-2022 走看看