BZOJ3498: PA2009 Cakes(三元环)
题意
Sol
按照套路把边转成无向图,我们采取的策略是从权值大的向权值小的连边
然后从按权值从小到大枚举每个点,再枚举他们连出去的点\(v\)
如果\(v\)的度数\(\leqslant M\),那么就再暴力枚举\(v\)连出去的点\(t\),看\(u\)与\(t\)是否联通(打标记)
否则暴力枚举\(u\)连出去的点\(t\),看\(v\)与\(t\)是否联通(直接hash表)
复杂度为\(O(M \sqrt{M})\)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 100001;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, a[MAXN], block, siz[MAXN], flag[MAXN], rak[MAXN], tp[MAXN];
vector<int> v[MAXN];
set<int> s[MAXN];
int comp(const int &x, const int &y) {
return a[x] == a[y] ? x < y : a[x] < a[y];
}
int main() {
N = read(); M = read(); block = sqrt(M);
for(int i = 1; i <= N; i++) a[i] = read(), tp[i] = i;
sort(tp + 1, tp + N + 1, comp);
for(int i = 1; i <= N; i++) rak[tp[i]] = i;
for(int i = 1; i <= M; i++) {
int x = read(), y = read();
if(rak[x] > rak[y]) v[x].push_back(y), siz[x]++;
else v[y].push_back(x), siz[y]++;
}
LL ans = 0;
for(int i = 3; i <= N; i++) {
int x = tp[i];
for(int j = 0, to; j < v[x].size(); j++) flag[to = v[x][j]] = i;
for(int j = 0, to; j < v[x].size(); j++) {
if(siz[to = v[x][j]] <= block) {
for(int k = 0; k < v[to].size(); k++)
if(flag[v[to][k]] == i) ans += a[x];
} else {
for(int k = 0; k < v[x].size(); k++)
if(s[to].count(v[x][k])) ans += a[x];
}
s[x].insert(to);
}
}
cout << ans;
return 0;
}
/*
2 1
13 17
2 1
*/
BZOJ3498: PA2009 Cakes(三元环)的更多相关文章
- BZOJ.3498.[PA2009]Cakes(三元环 枚举)
题目链接 感觉我可能学的假的(复杂度没问题,但是常数巨大). 一个比较真的说明见这儿:https://czyhe.me/blog/algorithm/3-mem-ring/3-mem-ring/. \ ...
- BZOJ3498PA2009 Cakes——三元环
题目描述 N个点m条边,每个点有一个点权a.对于任意一个三元环(j,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 求所有三元环的贡献和.N<100000,,m< ...
- 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 Cakes(三元环)
题面(权限题就不放题面了) 题解 三元环模板题,按题意模拟即可. #include <cstdio> #include <cstring> #include <vecto ...
- Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset
Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- Codeforces Gym 100342J Problem J. Triatrip 三元环
题目链接: http://codeforces.com/gym/100342 题意: 求三元环的个数 题解: 用bitset分别统计每个点的出度的边和入度的边. 枚举每一条边(a,b),计算以b为出度 ...
- Codeforces Gym 100342J Problem J. Triatrip bitset 求三元环的数量
Problem J. TriatripTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/att ...
随机推荐
- 5104 I-country
5104 I-country 在 N*M 的矩阵中,每个格子有一个权值,要求寻找一个包含 K 个格子的凸连通块(连通块中间没有空缺,并且轮廓是凸的,如书中图片所示),使这个连通块中的格子的权值和最大. ...
- anaconda安装出现failed to create anacoda menue
1.卸载Anaconda后重新安装Anaconda出现各种问题,粗暴解决方式:直接将安装目录放在C盘主路径下,完美解决. 2.然后无选择忽略,忽略,忽略,提示安装成功,依旧没有 菜单 进入 cmd,找 ...
- JVM理解
在阅读本文之前,先向大家强烈推荐一下周志明的<深入理解Java虚拟机>这本书. 前些天面试了阿里的实习生,问到关于Dalvik虚拟机能不能执行class文件,我当时的回答是不能,但是它执行 ...
- springcloud(三)-Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- Yii2 PHPExcel在linux环境下导出报500错误
断点调试后发现是因为这句报错 header('Content-Type : application/vnd.ms-excel');删除后正常输出下载
- cordova 更改app的图标
写在前面:cordova 使一个前端开发者成为一个“假”的android开发人员,不得不说提供给我们巨大的方便~,cordova打包生成的apk的默认样式和启动的名字真的是需要我们字更改的:本文将记录 ...
- Ubuntu禁用Compiz
环境: Ubuntu 16.04 什么是Compiz: https://zh.wikipedia.org/wiki/Compiz ,简单理解是实现了Ubuntu的3D效果 禁用的好处: 节省内存和CP ...
- Centos 7搭建Gitlab服务器(一),搭配文章(二)一起使用,效果更好
一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装ss ...
- SpringBoot + Quartz定时任务示例
程序文件结构,如下图,后面详细列出各文件的代码: 1. maven的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4 ...
- Java基础29-子父类中的成员变量
/* 成员: 1.成员变量 2.函数 3.构造函数 变量: this 代表当前对象的引用 this.变量 首先在本类中找所需要的变量,如果没有找到再父类中找. super 用于访问当前对象的父类成员, ...