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

#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. hdu3072 Intelligence System (最小树形图?)

    题意:给一个有向图,问要从0号点能到达所有点所需要经过路径的最小权值和是多少,然而,若两点强联通,则这两点互相到达不需要花费.保证0号点能到达所有点 tarjan缩点以后直接取每个点入边中花费最小的即 ...

  2. 【codeforces 768F】 Barrels and boxes

    http://codeforces.com/problemset/problem/768/F (题目链接) 题意 A,B两种物品可以装到栈中,每个栈只能存放一种物品,容量没有限制.现在讲所有栈排成一列 ...

  3. 调用系统命令之subprocess模块

    除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令. 这个库用起来其实很简单,按照惯例先贴一下官文关键点: The subprocess modul ...

  4. eclipse index 不工作 F3 不能找到头文件

    To add paths containing code to parse, follow these steps :1. Right click on the project2. Select Pr ...

  5. JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各 ...

  6. 将文件转换为base64字符串,然后还原

    package com.um.banks.xinlian.utils; import java.io.File; import java.io.FileInputStream; import java ...

  7. Apache Shiro 用户信息保存在session方案

    描述 在使用shiro的时候,经常会有一种需求: 把登录成功后的用户对象存放到session中,方面其他地方调用.存放到session这个步骤到底应该在哪里去做,有几个地方比较合适: 调用 Subje ...

  8. 创建 elasticsearch 用户

    创建 elasticsearch 用户 groupadd -g 3048 elasticsearch useradd -s /sbin/nologin -u 3048 -g elasticsearch ...

  9. js的各种验证

    验证手机号格式是否正确 // 判断是否为手机号 isPoneAvailable: function (pone) { var myreg = /^[1][3,4,5,7,8][0-9]{9}$/; i ...

  10. JAVA锁的优化和膨胀过程

    转自:https://www.cnblogs.com/dsj2016/p/5714921.html https://cloud.tencent.com/developer/article/103675 ...