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

#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. Azure登陆的两种常见方式(user 和 service principal登陆)

    通过Powershell 登陆Azure(Azure MoonCake为例)一般常见的有两种方式 1. 用户交互式登陆 前提条件:有一个AAD account 此种登陆方式会弹出一个登陆框,让你输入一 ...

  2. A1083. List Grades

    Given a list of N student records with name, ID and grade. You are supposed to sort the records with ...

  3. Mac下Vim编辑快捷键小结(移动光标)

    Mac下Vim编辑快捷键小结(移动光标) 1.移动到行尾"$",移动到行首"0"(数字),移动到行首第一个字符处"^" 2.移动到段首&qu ...

  4. SQL Server利用XML找字符串相同部分

    DECLARE @a NVARCHAR(100)= '01,02,04,05,07'; DECLARE @b NVARCHAR(100)= '01,03,04,05,06'; WITH    a1   ...

  5. python爬虫 bs4_4select()教程

    http://www.w3.org/TR/CSS2/selector.html 5 Selectors Contents 5.1 Pattern matching 5.2 Selector synta ...

  6. pandas使用

    一.pd.cut()与pd.qcut()的区别 假设有一组人员数据,而你希望将它们划分为不同的年龄组 ages = [18,20,22,25,27,21,23,37,31,61,45,32] bins ...

  7. Python Machine Learning-Chapter3

    Chapter 3:A Tour of Machine Learning Classifiers Using Scikit-learn 3.1:Training a perceptron via sc ...

  8. Hive记录-单机impala配置

    1.先决条件配置了hadoop.hive等 2.官网查看版本信息下载相应的安装包 http://archive.cloudera.com/cdh5/redhat/5/x86_64/cdh/5.10/R ...

  9. 基于vue-cli的改造的多页面开发脚手架

    项目的GitHub地址:https://github.com/hellobajie/vue-cli-multipage 该脚手架同时支持vux,scss,less 目录结构 vue-cli-multi ...

  10. CentOS6.x网易163yum源配置

    一.备份原yum源 [root@yancy ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.$(d ...