题目大意:
  一个$n(n\le5\times10^4)$个点,$m(m\le10^5)$条边的无向图。每条边有一个边权$w_i(w_i\le10^6)$和一个附加属性$t_i(t_i\in\{R,G,B\})$。定义一个三元环的价值为个条边权值之积,求所有满足每条边附加属性互不相同的三元环的价值和。

思路:
  对结点按照度数分为两组分块,度数$\ge\sqrt m$的算作重点,否则算轻点。对于三元环三个顶点都是重点的情况,直接暴力即可,复杂度$O(m\sqrt m)$。对于含有轻点的三元环,$O(m)$枚举第一个点及一条出边,$O(\sqrt m)$枚举第二条出边,复杂度还是$O(m\sqrt m)$。这里对于边权的查询应该是利用哈希实现的,但是用map也能过,复杂度$O(m\sqrt m\log m)$。

 #include<map>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline int gettype() {
register char ch;
while(!isalpha(ch=getchar()));
return ch!='R'?ch!='G'?::;
}
const int N=5e4+,M=2e5,mod=1e9+;
struct Edge {
int to,w,type,next;
};
Edge e[M];
int h[N],sz,deg[N],c[N];
struct Node {
int u,v,type;
bool operator < (const Node &another) const {
if(u!=another.u) return u<another.u;
if(v!=another.v) return v<another.v;
return type<another.type;
}
};
std::map<Node,int> map;
inline void add_edge(const int &u,const int &v,const int &w,const int &t) {
e[sz]=(Edge){v,w,t,h[u]};h[u]=sz++;deg[u]++;
(map[(Node){u,v,t}]+=w)%=mod;
}
int main() {
memset(h,-,sizeof h);
const int n=getint(),m=getint(),block=sqrt(m);
for(register int i=;i<m;i++) {
const int u=getint(),v=getint(),w=getint(),t=gettype();
add_edge(u,v,w,t);
add_edge(v,u,w,t);
}
for(register int i=;i<=n;i++) {
if(deg[i]>=block) c[++c[]]=i;
}
int ans=;
for(register int i=;i<=c[];i++) {
for(register int j=;j<=c[];j++) {
for(register int k=;k<=c[];k++) {
(ans+=(int64)map[(Node){c[i],c[j],}]*map[(Node){c[j],c[k],}]%mod*map[(Node){c[k],c[i],}]%mod)%=mod;
}
}
}
for(register int i=;i<=n;i++) {
if(deg[i]>=block) continue;
for(register int j=h[i];~j;j=e[j].next) {
if(deg[e[j].to]<block&&e[j].to<=i) continue;
for(register int k=e[j].next;~k;k=e[k].next) {
if(e[j].type==e[k].type||(deg[e[k].to]<block&&e[k].to<=i)) continue;
(ans+=(int64)map[(Node){e[j].to,e[k].to,-e[j].type-e[k].type}]*e[j].w%mod*e[k].w%mod)%=mod;
}
}
}
printf("%d\n",ans);
return ;
}

[JSOI2017]原力的更多相关文章

  1. BZOJ5206: [Jsoi2017]原力

    BZOJ5206: [Jsoi2017]原力 https://lydsy.com/JudgeOnline/problem.php?id=5206 分析: 比较厉害的三元环问题. 设立阈值,当点的度数大 ...

  2. 【bzoj5206】[Jsoi2017]原力 根号分治+STL-map

    题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上原力的类型.权值是一个正整数,代表这条边上的原力强度.原 ...

  3. [JSOI2017]原力(分块+map(hash))

    题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上 原力的类型.权值是一个正整数,代表这条边上的原力强度. ...

  4. bzoj 5206 [Jsoi2017]原力

    LINK:原力 一张无向图 这道题统计三元环的价值和.有重边但是无自环. 我曾经写过三元环计数 这个和那个题差不太多. 不过有很多额外操作 对于重边问题 我们把所有颜色相同的重边缩在一起 这样的话我们 ...

  5. BZOJ5206 JSOI2017原力(三元环计数)

    首先将完全相同的边的权值累加.考虑这样一种trick:给边确定一个方向,由度数小的连向度数大的,若度数相同则由编号小的连向编号大的.这样显然会得到一个DAG.那么原图的三元环中就一定有且仅有一个点有两 ...

  6. BZOJ5206 [Jsoi2017]原力[根号分治]

    这是一个三元环计数的裸题,只是多了一个颜色的区分和权值的计算罢了. 有一种根号分治的做法(by gxz) 这种复杂度的证明特别显然,思路非常简单,不过带一个log,可以用unordered_map或者 ...

  7. 报名 | 蚂蚁金服ATEC科技大会 · 上海:数字金融新原力

    小蚂蚁说: 2019年1月4日,蚂蚁金服ATEC城市峰会将以“数字金融新原力(The New Force of Digital Finance)”为主题,在中国上海举办.蚂蚁金服ATEC(Ant Te ...

  8. ​第3届云原生技术实践峰会(CNBPS 2020)重磅开启,“原”力蓄势待发!

    CNBPS 2020将在11月19-21日全新启动!作为国内最有影响力的云原生盛会之一,云原生技术实践峰会(CNBPS)至今已举办三届. 在2019年的CNBPS上,灵雀云CTO陈恺喊出"云 ...

  9. CSDN 原力(声望,影响力) -- 设计草案

    目标 CSDN 希望成为开发者学习,成长和成就的平台.我们已经有很多功能来支持开发者的职业成长了, 如何衡量成就呢?我们希望用 原力 (以前也叫 影响力,声望) 来体现用户的成就, 并希望用原力来帮助 ...

随机推荐

  1. Oracle 遇到的问题:IMP-00041: 警告: 创建的对象带有编译警告解决办法

    出现IMP-00041: 警告: 创建的对象带有编译警告:以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候.用户的环境是这样的,在库里有三个oracle的用户,其中一个用户中有 ...

  2. shell之进程

    ps     System V 风格  -         -elF         -ef         -eF     BSD            a所有跟终端有关的进程           ...

  3. JAVA并发-线程协作

    这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧. ExecutorService 线程池,用于创造和复用线程,他有几种模式. 我举一个自定义线程池数量的例子如下 Exe ...

  4. nyoj 题目61 传纸条

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  5. SVN基本介绍

    SVN是一种项目合作开发的软件,参与项目的人员可以在不同的地方实现文件和目录的超时空共享. 两个重要的概念: 1.配置库(Repository) SVN的核心是配置库,储存所有的数据,配置库按照文件树 ...

  6. 根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统

    最近打算从头开始制作根文件系统,下面是开发过程. 一.根文件系统的制作 0.FHS(Filesystem Hierarchy Standard)标准介绍 该标准规定了根目录下各个子目录的名称及其存放的 ...

  7. PHP面向对象练习

    练习内容:随机生成一个字符串 代码: <?phpclass randstring{ private $length; private $type; private $one = array(0, ...

  8. nodejs & docker

    nodejs & docker https://github.com/xgqfrms-GitHub/Node.js/blob/master/Docker-Nodejs/translation. ...

  9. hdu 1195 Open the Lock (BFS)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. hdu 2829 斜率DP

    思路:dp[i][x]=dp[j][x-1]+val[i]-val[j]-sum[j]*sum[i]+sum[j]*sum[j]; 其中val[i]表示1~~i是一段的权值. 然后就是普通斜率dp做法 ...