博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1098: [POI2007]办公楼biu
阅读量:5170 次
发布时间:2019-06-13

本文共 1869 字,大约阅读时间需要 6 分钟。

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

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

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

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

1 #include
2 #include
3 //#include
4 #include
5 #include
6 //#include
7 using namespace std; 8 9 #define LL long long10 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 10001120 #define maxm 400001121 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\n",tot);48 for (int i=1;i<=tot;i++) printf("%d ",size[i]);49 return 0;50 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/8987062.html

你可能感兴趣的文章
类的组合 构造函数的用法
查看>>
ORACLE SQL:经典查询练手第三篇
查看>>
ubuntu 包管理
查看>>
java -io字符流FileWrite操作演示
查看>>
vue回到上一个位置
查看>>
UESTC_Infected Land 2015 UESTC Training for Search Algorithm & String<Problem G>
查看>>
.Net 之 RPC 框架之Hprose(远程调用对象)
查看>>
全球外贸客户资源网站总汇
查看>>
杂项-CORS:CORS(跨域资源共享)
查看>>
杨柳目-杨柳科:杨柳科
查看>>
Node.js:JXcore
查看>>
redis如何进行分库存储和选择模糊清除缓存
查看>>
spring security退出方法
查看>>
从获得字符串中获取数字
查看>>
传入一个月份获取该月的统计信息
查看>>
分组取出值最大的数据
查看>>
java判断为空的方法
查看>>
double类型的数值转为小数点2位
查看>>
java比较两个时间年月份的大小
查看>>
服务器上配置JDK
查看>>