zoukankan      html  css  js  c++  java
  • BZOJ1098: [POI2007]办公楼biu

    $n leq 100000$个点,$m leq 2000000$条边,给点分组,两个点能在不同组必须两点之间有边,问最多分多少组以及每组人数。

    条件翻译下变成两点之间没边必须在一个组,于是就可以$n^2alpha(n)$轻松过掉这题。

    好的严肃。把复杂度转到$m$上,想一种跟$m$有关的暴力:枚举一个点,把与他有连边的点都标记上,再枚举未删除的所有点看是否被标记,未被标记的话加入队列并删除之,然后撤销标记搜下一个。这样一来标记时的复杂度就是$m$,而枚举点判断是否标记的话,枚举那些标记了的点的复杂度也是$m$,而未标记的点入队对每个点只会发生一次,因此复杂度$n+m$。链表模拟之。

    于是这道题告诉我我不会链表。

     1 #include<stdio.h>
     2 #include<string.h>
     3 //#include<queue>
     4 #include<stdlib.h>
     5 #include<algorithm>
     6 //#include<iostream>
     7 using namespace std;
     8 
     9 #define LL long long
    10 int qread()
    11 {
    12     char c; int s=0,t=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (t=-1);
    13     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*t;
    14 }
    15 
    16 //Pay attention to LL and double of qread!!!!
    17 
    18 int n,m;
    19 #define maxn 100011
    20 #define maxm 4000011
    21 struct Edge{int to,next;}edge[maxm]; int first[maxn],le=2;
    22 void in(int x,int y) {Edge &e=edge[le]; e.to=y; e.next=first[x]; first[x]=le++;}
    23 void insert(int x,int y) {in(x,y); in(y,x);}
    24 
    25 int ll[maxn],rr[maxn],head,tail,que[maxn],size[maxn]; bool vis[maxn];
    26 void Del(int x) {ll[rr[x]]=ll[x]; rr[ll[x]]=rr[x];}
    27 int main()
    28 {
    29     n=qread(); m=qread();
    30     for (int i=1,x,y;i<=m;i++) {x=qread(); y=qread(); insert(x,y);}
    31     
    32     for (int i=0;i<=n+1;i++) ll[i]=i-1,rr[i]=i+1;
    33     int tot=0;
    34     while (rr[0]<=n)
    35     {
    36         head=tail=0; que[tail++]=rr[0]; Del(rr[0]);
    37         tot++; size[tot]=1;
    38         while (head!=tail)
    39         {
    40             int x=que[head++];
    41             for (int i=first[x];i;i=edge[i].next) vis[edge[i].to]=1;
    42             for (int j=rr[0];j<=n;j=rr[j]) if (!vis[j]) {que[tail++]=j; Del(j); size[tot]++;}
    43             for (int i=first[x];i;i=edge[i].next) vis[edge[i].to]=0;
    44         }
    45     }
    46     sort(size+1,size+1+tot);
    47     printf("%d
    ",tot);
    48     for (int i=1;i<=tot;i++) printf("%d ",size[i]);
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    16、springboot——错误处理原理+定制错误页面(1)
    15、springboot——CRUD-跳转到修改员工页面+员工修改和删除实现 ⑥
    14、springboot——CRUD-跳转到添加员工页面+员工添加实现⑤
    13、springboot——CRUD-thymeleaf公共页面元素抽取④
    12、springboot——CRUD登录和拦截③
    11、springboot——CRUD国际化②
    10、springboot——CRUD导入静态资源以及设置默认访问首页①
    9、springmvc的自动配置
    8、模板引擎thymeleaf(百里香叶)
    7、对静态资源映射的规则
  • 原文地址:https://www.cnblogs.com/Blue233333/p/8987062.html
Copyright © 2011-2022 走看看