Luogu P6815 [PA2009]Cakes
题意
给定一个 \(n\) 个点 \(m\) 条边的图,点 \(i\) 有权值 \(a_i\),一个三元环 \((i,j,k)\) 的贡献为 \(\max(a_i,a_j,a_k)\),求所有三元环的贡献之和。
\(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 3\times 10^5\)
题解
所谓的三元环计数其实就是个优雅的暴力。
考虑将原图的边定向:度数大的连向度数小的,度数一样则编号大的连向编号小的。我们可以发现这个图有一些特殊性质:
由于严格规定了连边的方向,所以这个图是个 DAG。
如果一个点在原图中度数大于 \(\sqrt{m}\),注意到这个点只能向原图不小于它的点连边,而且原图中每个点的度数之和是 \(O(m)\),所以这个点在新图上的出度为 \(O(\sqrt{m})\)。
如果一个点在原图中度数不大于 \(\sqrt{m}\),由于新图中的出度不可能比原图还大,所以这个点在新图上的出度为 \(O(\sqrt{m})\)。
所以建完图之后暴力枚举即可,因为出度为 \(O(\sqrt{m})\) 所以我们可以通过打标记的方法快速查询一个点能不能直接到达另一个点,时间复杂度 \(O(m\sqrt{m})\)。
注意一下数三元环的时候用邻接表存新图由于内存访问不连续所以没 vector 存图跑得快,在这题的直接后果就是被卡常。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=3e5+51;
ll n,m;
li res;
vector<ll>g[MAXN];
ll vis[MAXN],deg[MAXN],from[MAXN],to[MAXN],w[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
int main()
{
n=read(),m=read();
for(register int i=1;i<=n;i++)
{
w[i]=read();
}
for(register int i=1;i<=m;i++)
{
deg[from[i]=read()]++,deg[to[i]=read()]++;
}
for(register int i=1;i<=m;i++)
{
if(deg[from[i]]>deg[to[i]]||(deg[from[i]]==deg[to[i]]&&from[i]>to[i]))
{
swap(from[i],to[i]);
}
g[from[i]].emplace_back(to[i]);
}
for(register int i=1;i<=m;i++)
{
for(register int j:g[i])
{
vis[j]=1;
}
for(register int j:g[i])
{
for(register int k:g[j])
{
res+=vis[k]*max(w[i],max(w[j],w[k]));
}
}
for(register int j:g[i])
{
vis[j]=0;
}
}
printf("%lld\n",res);
}
Luogu P6815 [PA2009]Cakes的更多相关文章
- BZOJ3498 : PA2009 Cakes
令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点 设d[x]表示从x连出的边的条数 从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i) 如果$d[x]\l ...
- BZOJ 3498 PA2009 Cakes(三元环处理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3498 [题目大意] N个点m条边,每个点有一个点权a. 对于任意一个三元环(j,j,k ...
- BZOJ 3498: PA2009 Cakes 一类经典的三元环计数问题
首先引入一个最常见的经典三元环问题. #include <bits/stdc++.h> using namespace std; const int maxn = 100005; vect ...
- BZOJ 3498 PA2009 Cakes
本题BZOJ权限题,但在bzojch上可以看题面. 题意: N个点m条无向边,每个点有一个点权a. 对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 求 ...
- BZOJ.3498.[PA2009]Cakes(三元环 枚举)
题目链接 感觉我可能学的假的(复杂度没问题,但是常数巨大). 一个比较真的说明见这儿:https://czyhe.me/blog/algorithm/3-mem-ring/3-mem-ring/. \ ...
- BZOJ3498: PA2009 Cakes(三元环)
题意 题目链接 Sol 按照套路把边转成无向图,我们采取的策略是从权值大的向权值小的连边 然后从按权值从小到大枚举每个点,再枚举他们连出去的点\(v\) 如果\(v\)的度数\(\leqslant M ...
- bzoj 3498: PA2009 Cakes【瞎搞】
参考:https://www.cnblogs.com/spfa/p/7495438.html 为什么邻接表会TTTTTTTLE啊...只能用vector? 把点按照点权从大到小排序,把无向边变成排名靠 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
随机推荐
- WPF启动流程-自己手写Main函数
WPF一般默认提供一个MainWindow窗体,并在App.Xaml中使用StartupUri标记启动该窗体.以下通过手写实现WPF的启动. 首先先介绍一下VS默认提供的App.Xaml的结构,如下图 ...
- Ribbon自定义负载均衡策略,在网关实现类似Ip_hash的负载均衡,ribbon给单个服务配置属性
背景: 我需要在网关实现一种功能,某个用户的请求永远打在后台指定的服务,也就是根据ip地址进行负载均衡 原理: 在ribbon的配置类下: 那我们自己创建一个IRule的实现类,模仿ZoneAvoid ...
- (转载)IO模型
本文转载自网络. 如有侵权,请联系处理! 简介 参考<UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] ...
- linux系统或centos7安装nginx
一.Linux下安装nginx 1.添加源 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cen ...
- 数字PLL,什么是数字PLL
来源:http://www.elecfans.com/baike/bandaoti/bandaotiqijian/20100323203306.html 数字PLL,什么是数字PLL 数字PLL PL ...
- 热力图 vue 项目中使用热力图插件 “heatmap.js”(保姆式教程)
我现在写的这项目是用CDN引入 heatmap.js, 可根据自己项目情况使用哪种方式引入插件. 官网地址 "https://www.patrick-wied.at/static/heatm ...
- 多测师讲解自动化测试 _RF分配id_高级讲师肖sir
1.Assign Id To Element.
- bootStrap小结3
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- 基于python实现单链表代码
1 """ 2 linklist.py 3 单链表的构建与功能操作 4 重点代码 5 """ 6 7 class Node: 8 " ...
- 【编程学习】浅谈哈希表及用C语言构建哈希表!
哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...