zoukankan      html  css  js  c++  java
  • CF980E

    题面

    Panel 国将举办名为数字游戏的年度表演。每个省派出一名选手。

    国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连。第 i 个省出来的代表有 2^i 名粉丝。

    今年,主席打算削减开支,他想要踢掉 k 个选手。但是,被踢掉的选手的省将很 angry 并且不会让别的任何人从这个省经过。

    主席想确保所有剩下选手的省都互相可达,他也希望最大化参与表演的选手的粉丝数。

    主席该踢掉哪些选手呢?

    升序输出要踢掉的选手编号。

    因为是二进制表示权值,可知越大的数越要保留,因为所有比它小的数的和都比他要小

    因此要贪心从n-1~1枚举是否可以保留(当然是以n为根的树,n号节点一定要保留)

    #include <cstdio>
    #include <vector>
    #include <cctype>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 1000005
    inline int read()
    {
      int s=0,f=0; char ch;ch=getchar();
      while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
      while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
      return f?-s:s;
    }
    int n,m,k,in1[N],cnt=0,fa[N][25];
    bool bo[N];
    vector<int>G[N];
    inline void dfs(int x,int pre)
    {
      fa[x][0]=pre; int i; for(i=1;i<=23;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
      for(i=0;i<(int)G[x].size();i++)if(G[x][i]!=pre)dfs(G[x][i],x);
    }
    inline int get(int x)
    {
      int i,re=0;
      for(i=23;~i;i--)
      {
        if(!bo[fa[x][i]]){x=fa[x][i];re+=(1<<i);}
      }return re+1;
    }
    #define r(n) n=read()
    int main()
    {
        int i,x,y,j=0; r(n);r(m);
        for(i=1;i<n;i++)
      {
        r(x);r(y);G[x].push_back(y);G[y].push_back(x);
      }dfs(n,n); memset(bo,0,sizeof bo);bo[n]=1; k=n-1-m;
      for(i=n-1;i>=1;i--)
      {
        if(bo[i])continue; int le=get(i),f;
        if(le<=k)
        {
          f=i;k-=le;for(j=0;j<=le;j++){bo[f]=1;f=fa[f][0];}
        }
      }
      j=0;for(i=1;i<=n&&j<m;i++)if(!bo[i])printf("%d ",i),j++;printf("
    ");
    }
  • 相关阅读:
    汉文博士 0.5.6.2345 修订版发布
    汉文博士 0.5.6 正式版发布
    汉文博士 0.5.5 正式版发布
    汉文博士新测试版发布(0.5.4.2228)
    海盗(Haidao)网店系统最新官方版
    ZipMarket数字内容/素材交易网站源码项目
    windows phone 8 使用页面传对象的方式 实现页面间的多值传递
    仿win8磁贴界面以及功能
    三角形状的点阵模糊效果iOS源码
    Coding iOS客户端应用源码
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/9635390.html
Copyright © 2011-2022 走看看