本题BZOJ权限题,但在bzojch上可以看题面。

题意:

  N个点m条无向边,每个点有一个点权a。

  对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak)

  求所有三元环的贡献和。

  N<100000,m<250000

Solution:

  本题裸的三元环计数。

  无向图三元环计数的问题大致做法:

    统计每个点的度数,对于一条无向边$<u,v>$,若$deg[u]==deg[v]$则从编号小的点向编号大的点连有向边,否则从$deg$较大的向较小的点连有向边。

    这样无向图就变为了一个DAG模型,然后扫一下每个点$u$,对其出点$v$打标记$vis[v]=u$,再对每个出点$v$的出点$w$判断是否满足$vis[w]=u$即可。

  分析一波时间复杂度:

    不难发现对于每条边$u\rightarrow v$,我们需要统计的是出度个数$out_v$,那么总的贡献是$\sum_\limits{i=1}^{i\leq n}{out_i}$。

    假设$out_v\leq \sqrt m$,由于$u\rightarrow v$,则$deg_u\geq deg_v$,这样$u$最多$n$个,于是此时最坏复杂度为$O(n\sqrt m)$;

    假设$out_v>\sqrt m$,由于$u\rightarrow v$,则$deg_u\geq deg_v$,于是$deg_u>\sqrt m$,这样$u$最多$\sqrt m$个,于是此时最坏时间复杂度$O(m\sqrt m)$。

  综上所述,$n,m$同阶时,该算法时间复杂度$O(n\sqrt m)$。

  那么本题三元环计数时累加答案就好了。

代码:

/*Code by 520 -- 9.10*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,a[N],deg[N],vis[N];
int to[N],net[N],h[N],cnt;
struct node{
int u,v;
}e[N];
ll ans; int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=(a<<)+(a<<)+(x^),x=getchar();
return f?-a:a;
} il void add(int u,int v){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt;} int main(){
n=gi(),m=gi();
For(i,,n) a[i]=gi();
For(i,,m) e[i].u=gi(),e[i].v=gi(),++deg[e[i].u],++deg[e[i].v];
For(i,,m) {
RE int u=e[i].u,v=e[i].v;
if(deg[u]<deg[v]||deg[u]==deg[v]&&u>v) swap(u,v);
add(u,v);
}
For(u,,n){
for(RE int i=h[u];i;i=net[i]) vis[to[i]]=u;
for(RE int i=h[u];i;i=net[i]) {
RE int v=to[i];
for(RE int j=h[v];j;j=net[j]){
RE int w=to[j];
if(vis[w]==u)ans+=max(a[u],max(a[v],a[w]));
}
}
}
cout<<ans;
return ;
}

BZOJ 3498 PA2009 Cakes的更多相关文章

  1. BZOJ 3498: PA2009 Cakes 一类经典的三元环计数问题

    首先引入一个最常见的经典三元环问题. #include <bits/stdc++.h> using namespace std; const int maxn = 100005; vect ...

  2. BZOJ 3498 PA2009 Cakes(三元环处理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3498 [题目大意] N个点m条边,每个点有一个点权a. 对于任意一个三元环(j,j,k ...

  3. BZOJ.3498.[PA2009]Cakes(三元环 枚举)

    题目链接 感觉我可能学的假的(复杂度没问题,但是常数巨大). 一个比较真的说明见这儿:https://czyhe.me/blog/algorithm/3-mem-ring/3-mem-ring/. \ ...

  4. bzoj 3498: PA2009 Cakes【瞎搞】

    参考:https://www.cnblogs.com/spfa/p/7495438.html 为什么邻接表会TTTTTTTLE啊...只能用vector? 把点按照点权从大到小排序,把无向边变成排名靠 ...

  5. [BZOJ 3498] [PA 2009] Cakes

    Description \(n\) 个点 \(m\) 条边,每个点有一个点权 \(a_i\). 对于任意一个三元环 \((i,j,k)(i<j<k)\),它的贡献为 \(\max(a_i, ...

  6. Bzoj 3498 Cakes(三元环)

    题面(权限题就不放题面了) 题解 三元环模板题,按题意模拟即可. #include <cstdio> #include <cstring> #include <vecto ...

  7. bzoj 3498

    统计三元环 很多代码在bzoj都T诶 #include <iostream> #include <cstdio> #include <algorithm> #inc ...

  8. BZOJ3498 : PA2009 Cakes

    令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点 设d[x]表示从x连出的边的条数 从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i) 如果$d[x]\l ...

  9. BZOJ3498: PA2009 Cakes(三元环)

    题意 题目链接 Sol 按照套路把边转成无向图,我们采取的策略是从权值大的向权值小的连边 然后从按权值从小到大枚举每个点,再枚举他们连出去的点\(v\) 如果\(v\)的度数\(\leqslant M ...

随机推荐

  1. php+mysql 数据库分表分段备份程序--宋正河

    <?php //宋正河 转载请注明出处 set_time_limit(0); header('content-type:text/html;charset=utf-8'); mysql_conn ...

  2. kubenetes无法创建pod/创建RC时无法自动创建pod的问题

    一.问题概述 问题1: 虽然每次通过yaml创建rc都显示成功了,但是 kubectl get pod却没显示任何的pod. 问题2: 直接通过yaml创建pod提示apixxx 问题3: 通过.js ...

  3. Laya 1.x 按文件夹TS代码合并

    Laya 1.x 使用TS开发时,经常会碰到代码文件太多,加载index.html时时间太长的问题.Laya编辑器貌似没有自带JS代码合并的功能.基于Laya去实现JS合并需要修改编辑器源码,合并JS ...

  4. spring boot 使用及最佳实践

    第一部分,spring boot 文档 Spring boot的使用 使用maven进行构建 用户可以通过继承spring-boot-starter-parent来获取默认的依赖. l  默认java ...

  5. 可道云kodexplorer搭建私有云后的配置优化

    一.上传下载速度优化首先明确可道云没有对上传下载做任何限制,速度快慢和网络环境有关.可道云是基于http上传,所以和其他http上传速度基本一致:可以对比其他web系统或网站说附件上传速度.同其他例如 ...

  6. [Hanani]高数相关知识记录

    分部积分 \(\int uv'{\rm d}x=uv-\int u'v{\rm d}x\)

  7. Centos7 Jenkins

    代码上线 持续集成 随时随地将代码合并,这种方法叫做持续集成. 持续集成(CONTINUOUS INTEGRATION,简称CI)持续集成指的是,频繁地(一天多次)将代码集成到主干.它的好处主要有两个 ...

  8. Redis学习(一):CentOS下redis安装和部署

    1.基础知识  redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串.列表 ...

  9. Xcode中的文件类型

    文件类型 Xcode中的文件类型,总共4种类型: 1 普通文件(File) 2 Group(在Xcode中就是黄色的文件夹) 3 Folder(在Xcode中就是蓝色的文件夹) 4 Framework ...

  10. JS进阶系列之闭包

    刚刚总结完作用域链,我觉得很有必要马上对闭包总结一下,因为,之前也写过自己对闭包的理解,那时候只知道,闭包就是可以访问别的函数变量的函数,就是在函数里面的函数就叫做闭包,可是并没有深入探究,为什么,可 ...