• p2619 [国家集训队2]Tree I [wqs二分学习]


    分析

    https://www.cnblogs.com/CreeperLKF/p/9045491.html

    反正这个博客看起来很nb就对了

    但是不知道他在说啥

    实际上wqs二分就是原来的值dp[x]表示选x个的最优解满足是一个凸包

    然后就可以二分一个数

    让有限制的一类数全部给权值加上这个二分的数

    然后判断即可

    这个题就是典型的模板题

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int inf = 1e9+7;
    int n,m,sum,res,cnt,tot,fa[100100];
    struct node {
        int x,y,z,col;
    };
    node d[100100],d1[100100];
    inline int sf(int x){return fa[x]==x?x:fa[x]=sf(fa[x]);}
    inline bool cmp(const node x,const node y){return x.z==y.z?x.col<y.col:x.z<y.z;}
    inline int ck(int mid){
        int i,j,k;
        for(i=1;i<=m;i++)d[i]=d1[i];
        for(i=1;i<=m;i++)if(!d[i].col)d[i].z+=mid;
        res=tot=cnt=0;
        for(i=1;i<=n;i++)fa[i]=i;
        sort(d+1,d+m+1,cmp);
        for(i=1;i<=m;i++){
          int x=d[i].x,y=d[i].y;
          if(sf(x)!=sf(y)){
              fa[sf(x)]=sf(y);
              cnt++;
              res+=d[i].z;
              if(!d[i].col)tot++;
          }
          if(cnt==n-1)break;
        }
        return tot;
    }
    int main(){
        int i,j,k,le=-200,ri=200;
        scanf("%d%d%d",&n,&m,&sum);
        for(i=1;i<=m;i++)scanf("%d%d%d%d",&d1[i].x,&d1[i].y,&d1[i].z,&d1[i].col),d1[i].x++,d1[i].y++;
        while(ri-le>1){
          int mid=(le+ri)>>1;
          if(ck(mid)>=sum)le=mid;
            else ri=mid;
        }
        ck(le);
        printf("%d
    ",res-sum*le);
        return 0;
    } 
  • 相关阅读:
    CSP2020 T1儒略日 暴力模拟90pts代码
    CSP-S 2019 D1T2括号树
    P3593 [POI2015]TAB
    P5145 漂浮的鸭子
    CH0503 奇数码问题
    [NOIP2012]国王游戏 -高精度-贪心-
    费解的开关
    P1040 加分二叉树
    初步学习线段树
    P2758 编辑距离 简单DP
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/11669406.html
Copyright © 2020-2023  润新知