令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点

设d[x]表示从x连出的边的条数

从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i)

如果$d[x]\leq\sqrt{m}$,则依次判断与x相连的边(x,y)(y<x)中的y是否与i相连

否则,依次判断与i相连的边(i,y)(y<x)中的y是否与x相连

用Hash表支持$O(1)$询问

时间复杂度$O(m\sqrt{m})$

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010,M=250010,B=(1<<23)-1,BUF=5000000;
struct edge{int v;edge*nxt;}epool[M],*ecur=epool,*g[N],*j,*k;
struct Edge{int x,y;Edge*nxt;}Epool[M],*Ecur=Epool,*G[B+1],*l;
int n,m,i,a[N],d[N],x,y,lim,hash;long long ans;char Buf[BUF],*buf=Buf;pair<int,int>e[M];
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline int vis(int x,int y){for(l=G[(x<<8|y)&B];l;l=l->nxt)if(l->x==x&&l->y==y)return 1;return 0;}
int main(){
fread(Buf,1,BUF,stdin),read(n),read(m);
while(lim*lim<m)lim++;
for(i=1;i<=n;i++)read(a[i]);
for(i=0;i<m;i++){
read(x),read(y);
if(x<y)swap(x,y);
e[i].first=x,e[i].second=y;
}
for(sort(e,e+m),i=0;i<m;i++){
d[x=e[i].first]++;
ecur->v=y=e[i].second;ecur->nxt=g[x];g[x]=ecur++;
Ecur->x=x;Ecur->y=y;Ecur->nxt=G[hash=(x<<8|y)&B];G[hash]=Ecur++;
}
for(i=3;i<=n;i++)for(j=g[i];j;j=j->nxt){
y=a[i]>a[x=j->v]?a[i]:a[x];
if(d[x]<=lim){for(k=g[x];k;k=k->nxt)if(vis(i,k->v))ans+=y>a[k->v]?y:a[k->v];}
else for(k=j->nxt;k;k=k->nxt)if(vis(x,k->v))ans+=y>a[k->v]?y:a[k->v];
}
return printf("%lld",ans),0;
}

  

BZOJ3498 : PA2009 Cakes的更多相关文章

  1. BZOJ3498: PA2009 Cakes(三元环)

    题意 题目链接 Sol 按照套路把边转成无向图,我们采取的策略是从权值大的向权值小的连边 然后从按权值从小到大枚举每个点,再枚举他们连出去的点\(v\) 如果\(v\)的度数\(\leqslant M ...

  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 一类经典的三元环计数问题

    首先引入一个最常见的经典三元环问题. #include <bits/stdc++.h> using namespace std; const int maxn = 100005; vect ...

  4. BZOJ 3498 PA2009 Cakes

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

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

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

  6. bzoj 3498: PA2009 Cakes【瞎搞】

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

  7. Luogu P6815 [PA2009]Cakes

    题意 给定一个 \(n\) 个点 \(m\) 条边的图,点 \(i\) 有权值 \(a_i\),一个三元环 \((i,j,k)\) 的贡献为 \(\max(a_i,a_j,a_k)\),求所有三元环的 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. hdu 5997 rausen loves cakes(线段数合并+启发式修改)

    题目链接:hdu 5997 rausen loves cakes 题意: 给你n个点,每个点有一个颜色,现在有两个操作,第一个操作,将颜色x改为颜色y,第二个操作,询问[x,y]区间有多少颜色段(颜色 ...

随机推荐

  1. CUDA中的Toolkit

    CUDA Toolkit是什么? 对于使用 C 语言和 C++ 来开发 GPU 加速应用程序的开发者来说,NVIDIA CUDA Toolkit 可提供一个综合的开发环境.CUDA Toolkit 包 ...

  2. linux 如何清理僵尸进程

    今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova- ...

  3. delphi 枚举类型

    枚举类型定义了一系列有序值的集合.枚举变量就是从这个既定的集合中取某个值.集合中的有序值可以称为元素,元素一般从0开始索引(也就是元素的顺序号). 定义一个枚举类型,采用以下的格式: type typ ...

  4. python string与list互转

    因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得转换成string. >>&g ...

  5. pip 直接安装tar.gz zip文件包 (windows linux mac 可用)

    在不能连接外网的机器上安装python的各种包,解压安装要人工输入多条命令: tar -zxvf Flask-WTF-0.10.0.tar.gz cd Flask-WTF-0.10.0 python ...

  6. 【OpenStack】OpenStack系列3之Swift详解

    Swift安装部署(与keystone依赖包有冲突,需要安装不同版本eventlet) 参考:http://www.server110.com/openstack/201402/6662.html h ...

  7. Android 和iOS 中关于View 的一点知识

    View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充. 先转载一部分资料,感谢原作者! 原链接为:http://b ...

  8. iOS 的UIWindow 类研究

    今日发现如果想做出漂亮的界面效果,就需要仔细研究一下UIWindow这个类.现在还不清楚为什么要有这么一个UIWindow类,它跟UIView的根本区别是什么?和Android中的什么类比较相像.先做 ...

  9. php字符串处理总结

    php字符串处理是php基础中重要的一部分,总结并整理了一下 1.最简单的,字符串输出单引号和双引号的区别(定义字符串用单引号和双引号都可以) $str='hello'; echo "str ...

  10. August 6th, 2016, Week 32nd, Saturday

    It is not the mountain we conquer, but ourselvess. 我们征服的不是高山,而是我们自己. Difficulties and obstacles, jus ...