求最小值最大显然是要二分

二分之后转换成了判定性问题

我们考虑哪些点一定不能选

显然是将所有可选点选中之后依然不满足条件的点不能选

那么我们不妨维护一个堆,每次取出堆顶看看是否满足条件

不满足条件就pop掉,并进行松弛

最后判定堆是否为空即可

另外,其实这道题思考到这里我们会发现二分并没有什么卵用,可以去掉二分省掉一个log

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
using namespace std; const int maxn=100010;
int n,m,k,x,u,v,tot;
bool vis[maxn];
bool check[maxn];
int deg[maxn];
int sum[maxn];
int ans[maxn];
int h[maxn],cnt=0;
struct edge{
int to,next;
}G[maxn<<1]; struct pos{
double k;//����
int now;//��ǰ��
pos(double k=0,int now=0):k(k),now(now){}
bool operator <(const pos &A)const{
return k>A.k;
}
}; priority_queue<pos>Q; void add(int x,int y){++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;} bool Get_check(double k){
memset(check,0,sizeof(check));
memset(deg,0,sizeof(deg));
while(!Q.empty())Q.pop();
for(int u=1;u<=n;++u){
if(vis[u])continue;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v])continue;
deg[v]++;
}
}
for(int i=1;i<=n;++i){
if(vis[i])continue;
Q.push(pos((double)(deg[i])/sum[i],i));
}
while(!Q.empty()){
while(!Q.empty()&&check[Q.top().now])Q.pop();
if(Q.empty())break;
pos tmp=Q.top();
if(tmp.k>=k)break;
int u=tmp.now;check[u]=true;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(check[v]||vis[v])continue;
deg[v]--;
Q.push(pos((double)(deg[v])/sum[v],v));
}
}
if(Q.empty())return false;
return true;
} int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;++i){
scanf("%d",&x);
vis[x]=true;
}
for(int i=1;i<=m;++i){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
sum[u]++;sum[v]++;
}
double L=0,R=1;
for(int i=1;i<=50;++i){
double mid=(L+R)/2;
if(Get_check(mid))L=mid;
else R=mid;
}
Get_check(L);tot=0;
for(int i=1;i<=n;++i){
if(check[i]||vis[i])continue;
ans[++tot]=i;
}
printf("%d\n",tot);
for(int i=1;i<=tot;++i)printf("%d ",ans[i]);
return 0;
}

  

codeforces #309 div1 D的更多相关文章

  1. codeforces #309 div1 C

    首先我们会发现所有的人构成了一个图 定义相爱为 在一个集合里 定义相恨为 不在一个集合里 很容易发现满足条件的图一定是一个二分图 那么分类讨论如下: 1.如果出现不合法 答案为0 2.如果不是一个二分 ...

  2. codeforces #309 div1 B

    题目啰里啰嗦说了一大堆(耐心读完题目就可以秒题了) 首先我们考虑当前置换的开头的循环节的开头 1.如果是1 1->1形成循环节 问题变成i-1的子问题 2.如果是2 1->2->1形 ...

  3. codeforces #309 div1 A

    先说我的解法吧 首先设f(i,j)表示选了前i个球且j种颜色都已经选完了的方案数 这显然是可以随便转移的 #include<cstdio> #include<cstring> ...

  4. codeforces 407 div1 B题(Weird journey)

    codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...

  5. codeforces 407 div1 A题(Functions again)

    codeforces 407 div1 A题(Functions again) Something happened in Uzhlyandia again... There are riots on ...

  6. codeforces #305 div1 done

    总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...

  7. codeforces #309 DIV2

    这场并没有做,做的赛后的,太晚了时间,中午做了两题,稍微贴一下,剩余的题目本周争取补完 A题: 链接:http://codeforces.com/contest/554/problem/A #incl ...

  8. Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞

    B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...

  9. codeforces #313 div1 E

    首先我们要注意到一个事情 如果一个灯塔向左覆盖,那么比他小的某个灯塔如果向左覆盖的端点大于当前塔向左覆盖的端点,他一定向右覆盖 对于当前灯塔向右覆盖也是同理 那么我们只需要记录当前覆盖到的端点就可以完 ...

随机推荐

  1. Android类库打包方法探究

    原文地址: http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html 开发Android应用的时候,对于可用 ...

  2. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...

  3. java进阶一之jdk8新特性

    1.官方发布的jdk8新特性 2.51CTO相关专题

  4. Linux C SMTP POP3 极简陋邮件客户端

    以前以为协议非常高神,但做了这个之后发现还好,没想象的那么艰难. 先要了解邮件的原理 再者就是上面2协议 可以先用telnet测试一下,以初步了解那2协议:http://hi.baidu.com/34 ...

  5. 终于解决了我的DISCUZ 无法连接到您的服务器,可能您的服务器处于防火墙后端 论坛云平台的问题~

    事由:由于前几天折腾备份,将论坛源文件误删了大部分,于是我重新下载了源码,传到了空间. 然后问题来了,我关闭纵横搜索提示“无法连接到您的服务器,可能您的服务器处于防火墙后端”,设置纵横搜索页一直显示“ ...

  6. Kail安装Parallels tools

    今天在安装虚拟机里面安装kail,在安装虚拟机提供的tools时候提示没有权限,如图: 后面经过自己证实首先tools是挂载的cdrom,在这样挂载下是没有写权限的(类似于windows下面读取光盘光 ...

  7. event事件:

    onabort: 图像的加载被中断onblur: 元素失去焦点onchange: 域的内容被改变onclick: 当用户点击某个对象时调用的事件句柄ondblclick: 当用户双击某个对象时调用的事 ...

  8. Oracle 动态视图1 V$LOCK

    v$lock显示数据库当前持有锁情况 Column Datatype Description SID NUMBER 会话ID TYPE VARCHAR2(2) 表示锁的类型.值包括TM,TX,等 ID ...

  9. cwm-recovery自动生成工具

    android发展迅速,刷机已经成了一种习惯,cwm-recovery是必不可少的工具,下面我把自己用的自动生成cwm-recovery的工具发布出来,供友友们交流和学习,欢迎拍砖 已经公开发布在gi ...

  10. uva401 - Palindromes结题报告

    题目地址 :  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...