首先引入一个最常见的经典三元环问题。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
vector <int> g[maxn], low, high;
map <int, int> mp[maxn];
int n, m, in[maxn], vis[maxn]; int main()
{
scanf("%d %d", &n,&m);
for(int i=1; i<=m; i++){
int x,y;
scanf("%d %d", &x,&y);
g[x].push_back(y);
g[y].push_back(x);
mp[x][y] = 1;
mp[y][x] = 1;
in[x]++;
in[y]++;
}
for(int i=1; i<=n; i++){
if(in[i]<=sqrt(m)) low.push_back(i);
else high.push_back(i);
}
int ans = 0;
memset(vis, false, sizeof(vis));
for(int i=0; i<low.size(); i++){
int x = low[i];
vis[x] = 1;
for(int j=0; j<g[x].size(); j++){
int y = g[x][j];
if(vis[y]) continue;
for(int k=j+1; k<g[x].size(); k++){
int z = g[x][k];
if(vis[z]) continue;
if(mp[y].count(z)) ans++;
}
}
}
for(int i=0; i<high.size(); i++){
for(int j=i+1; j<high.size(); j++){
int x, y, z;
x = high[i];
y = high[j];
if(mp[x].count(y)==0) continue;
for(int k=j+1; k<high.size(); k++){
z = high[k];
if(mp[y].count(z)&&mp[x].count(z)) ans++;
}
}
}
printf("%d\n", ans);
return 0;
}

BZOJ 3948

//BZOJ 3498
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
typedef long long LL;
struct node{
int val,id;
node(){}
node(int val,int id):val(val),id(id){}
bool operator<(const node &rhs)const{
return val>rhs.val;
}
}a[maxn];
vector <int> G[maxn];
map <int, int> mp[maxn];
int Rank[maxn], out[maxn], linker[maxn];
int n, m; int main()
{
scanf("%d %d", &n,&m);
for(int i=1; i<=n; i++){
scanf("%d", &a[i].val);
a[i].id = i;
}
sort(a+1, a+n+1);
for(int i=1; i<=n; i++) Rank[a[i].id] = i;
for(int i=1; i<=m; i++){
int x, y;
scanf("%d %d", &x,&y);
if(Rank[x]<Rank[y]){
G[x].push_back(y), out[x]++, mp[x][y]=1;
}else{
G[y].push_back(x), out[y]++, mp[y][x]=1;
}
}
LL ans = 0;
for(int i=1; i<=n; i++){
int x = a[i].id, y;
for(int j=0; j<G[x].size(); j++){
linker[G[x][j]] = x;
}
for(int j=0; j<G[x].size(); j++){
y = G[x][j];
if(out[y]>sqrt(m)+1){
for(int k=0; k<G[x].size(); k++){
int z = G[x][k];
if(mp[y].count(z)) ans += a[i].val;
}
}else{
for(int k=0; k<G[y].size(); k++){
int z = G[y][k];
if(linker[z] == x) ans += a[i].val;
}
}
}
}
printf("%lld\n", ans);
return 0;
}

BZOJ 3498: PA2009 Cakes 一类经典的三元环计数问题的更多相关文章

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

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

  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

    本题BZOJ权限题,但在bzojch上可以看题面. 题意: N个点m条无向边,每个点有一个点权a. 对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 求 ...

  4. bzoj 3498: PA2009 Cakes【瞎搞】

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

  5. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  6. FJWC2019 子图 (三元环计数、四元环计数)

    给定 n 个点和 m 条边的一张图和一个值 k ,求图中边数为 k 的联通子图个数 mod 1e9+7. \(n \le 10^5, m \le 2 \times 10^5, 1 \le k \le ...

  7. Bzoj 3498 Cakes(三元环)

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

  8. [BZOJ 3498] [PA 2009] Cakes

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

  9. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2473  Solved: 1211[Submit][Statu ...

随机推荐

  1. KMP 模式串匹配 失去匹配的瞬间你还有什么

    KMP: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键 ...

  2. CF 468B Two Sets

    题意: 给定n个正整数与a,b两个集合,求一种方案使得这n个数恰好被分在这两个集合中且集合中无多余的数且若x在a中则A-x在a中,若x在b中则B-x在b中. 题意理解了我好半天... 解法1:并查集. ...

  3. 收藏:SQL Server 数据库改名

    SQL SERVER 2005以前通常使用sp_renameDB存储过程. EXEC sp_renameDB 'oldDB','newDB'   或者:数据库先分离,然后再附加也可以改名. SQL S ...

  4. Machine Learning Netsite

    Google:  Machine Learning

  5. (compareTo) How Many Fibs hdu1316 && ZOJ1962

    How Many Fibs? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. Makefile ------ 在Makefile中进行宏定义-D

    在Makefile中我们可以通过宏定义来控制源程序的编译.只要在Makefile中的CFLAGS(变量名随意)中通过选项-D来指定你于定义的宏即可. 如:CFLAGS += -D _YUQIANG在编 ...

  7. Hibernate_事务管理

    今天学习Hibernate,发现当我在执行下面操作时,不会对数据库产生任何效果,就是说Customer对象并不会保存到数据库中 Session session = HibernateUtils.ope ...

  8. Jenkins插件安装实战篇

    Jenkins插件安装实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上篇博客我介绍了Jenkins是啥,以及持续集成,持续交付,持续部署的概念,那么问题来了:你知道CI和C ...

  9. Nginx核心配置文件常用参数详解

    Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...

  10. 修改tomcat启动窗口的名称

    场景:我们在启动tomcat的时候,一般会出现tomcat窗口,默认窗口名字是tomcat,如果我们想知道这个tomcat的端口号,我们需要查看配置文件,很麻烦有木有.如果我们可以直接把端口号设置在窗 ...