BZOJ4296 : [PA2015]Mistrzostwa

先不断将度数小于D的点都删去,再找到剩下的图里最大的连通块即可。

#include<cstdio>
#include<algorithm>
#define N 200010
int n,m,D,x,y,i,g[N],v[N<<1],nxt[N<<1],ed,d[N],h,t,q[N],del[N],ans,fin[N];
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
inline void add(int x,int y){d[x]++;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x){
  if(del[x])return;
  del[q[++t]=x]=1;
  for(int i=g[x];i;i=nxt[i])dfs(v[i]);
}
int main(){
  read(n),read(m),read(D);
  while(m--)read(x),read(y),add(x,y),add(y,x);
  for(i=h=1;i<=n;i++)if(d[i]<D)del[q[++t]=i]=1;
  while(h<=t)for(i=g[x=q[h++]];i;i=nxt[i]){
    d[v[i]]--;
    if(d[v[i]]<D&&!del[v[i]])del[q[++t]=v[i]]=1;
  }
  for(i=1;i<=n;i++)if(!del[i]){
    t=0,dfs(i);
    if(t>ans)for(ans=t,x=1;x<=t;x++)fin[x]=q[x];
  }
  if(!ans)return puts("NIE"),0;
  if(ans>1)std::sort(fin+1,fin+ans+1);
  for(printf("%d\n",ans),i=1;i<=ans;i++)printf("%d ",fin[i]);
  return 0;
}

  

时间: 2024-10-06 06:10:33

BZOJ4296 : [PA2015]Mistrzostwa的相关文章

BZOJ 4291: [PA2015]Kieszonkowe 水题

4291: [PA2015]Kieszonkowe Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=4291 Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和. Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=1000).

BZOJ4295 : [PA2015]Hazard

第i轮,a[i%n]+=b[i%m]. 枚举i,计算它变为0的次数,假设为t,那么有t=i+kn. 对于所有的i和k,(i+kn)%m形成了若干个总长度为m的环. 对于每个a[i],先在环中求出一轮最多可以减少多少,以及一轮的增量是多少,由此可以求出在几轮后变为0. 再在前缀后缀分类讨论一下即可求出具体是在哪一局变为0. 时间复杂度$O(n+m)$. #include<cstdio> #define N 1000010 typedef long long ll; const ll inf=20

BZOJ4292 : [PA2015]R&#243;wnanie

注意到f(n)不会超过1459,于是暴力枚举f(n),检验n=k*f(n)是否合法即可. #include<cstdio> long long k,a,b,t;int i,j,ans; int main(){ scanf("%lld%lld%lld",&k,&a,&b); for(i=1;i<=1459&&k<=b/i;i++){ t=k*i; if(a<=t&&t<=b){ for(j=0;t

bzoj 4291: [PA2015]Kieszonkowe

Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和. Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=1000). Output 输出一个正整数,即最大的总和,若无解则输出NIESTETY. Sample Input 5 2 4 3 3 3 Sample Output 12 解题:唔,总和减去最小的奇数 1 #include<iostream>

BZOJ4607 : [PA2015 Final]Edycja

显然做完操作$2$后再做操作$1$. 建立一个$26$个点的有向图,每个点只有一条出边,$i$->$j$表示$i$最终变成了$j$,边权为一开始是$i$,最后不是$j$的位置个数,如果$i\neq j$,则代价还要增加$c$. 对于每个点贪心选取最小的出边,如果没有环,那么此时就是最优解. 否则,对于一个连通块,如果它是环,那么需要多付出$c$点代价,而且如果所有连通块都是环或者孤立点,则不可能构造出这种图. 考虑重新决定每个点的出边,如果出现了原来贪心构造出的图中不存在的环,那么一定有一个点的

bzoj4292 PA2015 R&#243;wnanie 枚举

貌似应该是找出n后,带回去看看是不是对的. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 7 #define ll long long 8 using namespace std; 9 typedef long long LL; 10 const int MAXN=9*9*18; 11 ll

【BZOJ】4293: [PA2015]Siano 线段树上二分

[题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解]按照生长速度a[]排序后,容易发现数列永远单调. 在线段树上的区间维护以下值: 1.最后一棵草的高度a 2.上次收割日期b 3.总的草高和c 4.总的生长速度和d 5.收割标记D和B 上传的时候注意右区间收割晚于左区间时强制合并. 下传的时候注意标记D和B直接覆盖. 线段树上二分: 1.判断当前区间是否符合(

BZOJ4293: [PA2015]Siano

发现大小顺序不变,因为都是从0开始长,生长速度快的肯定不会落后 所以排下序,二分就可以找到一段连续的需要cov的区间 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #define INF 0x7f7f7f7f 6 #define MAXN 500010 7 #define rint register int 8 #define ll lon

过去的2015

过去的2015这一年,感觉非常漫长,发生了好多好多的事情. 1月,翻译某道POI的时候被lavendir发现不是BZOJ权限用户,结果他居然把权限免费送给了我!打开了新世界的大门. 2月,寒假写完作业无聊着没事干,随便切了几道水题,被家长发现,“离高考只有几个月了,要安心学习”,于是家长就开始监控我的提交记录. 3月,感受到了高三下生活的艰难,每天一考.同时听说了王主力ZJOI写暴力AC的故事. 4月,每天切两套理综题,结果有一天晚上梦里眼前全是理综题,然后吐了,被送进了医院.为何切算法题就没有