[JSOI2017]原力
题目大意:
一个$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]原力的更多相关文章
- BZOJ5206: [Jsoi2017]原力
BZOJ5206: [Jsoi2017]原力 https://lydsy.com/JudgeOnline/problem.php?id=5206 分析: 比较厉害的三元环问题. 设立阈值,当点的度数大 ...
- 【bzoj5206】[Jsoi2017]原力 根号分治+STL-map
题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上原力的类型.权值是一个正整数,代表这条边上的原力强度.原 ...
- [JSOI2017]原力(分块+map(hash))
题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上 原力的类型.权值是一个正整数,代表这条边上的原力强度. ...
- bzoj 5206 [Jsoi2017]原力
LINK:原力 一张无向图 这道题统计三元环的价值和.有重边但是无自环. 我曾经写过三元环计数 这个和那个题差不太多. 不过有很多额外操作 对于重边问题 我们把所有颜色相同的重边缩在一起 这样的话我们 ...
- BZOJ5206 JSOI2017原力(三元环计数)
首先将完全相同的边的权值累加.考虑这样一种trick:给边确定一个方向,由度数小的连向度数大的,若度数相同则由编号小的连向编号大的.这样显然会得到一个DAG.那么原图的三元环中就一定有且仅有一个点有两 ...
- BZOJ5206 [Jsoi2017]原力[根号分治]
这是一个三元环计数的裸题,只是多了一个颜色的区分和权值的计算罢了. 有一种根号分治的做法(by gxz) 这种复杂度的证明特别显然,思路非常简单,不过带一个log,可以用unordered_map或者 ...
- 报名 | 蚂蚁金服ATEC科技大会 · 上海:数字金融新原力
小蚂蚁说: 2019年1月4日,蚂蚁金服ATEC城市峰会将以“数字金融新原力(The New Force of Digital Finance)”为主题,在中国上海举办.蚂蚁金服ATEC(Ant Te ...
- 第3届云原生技术实践峰会(CNBPS 2020)重磅开启,“原”力蓄势待发!
CNBPS 2020将在11月19-21日全新启动!作为国内最有影响力的云原生盛会之一,云原生技术实践峰会(CNBPS)至今已举办三届. 在2019年的CNBPS上,灵雀云CTO陈恺喊出"云 ...
- CSDN 原力(声望,影响力) -- 设计草案
目标 CSDN 希望成为开发者学习,成长和成就的平台.我们已经有很多功能来支持开发者的职业成长了, 如何衡量成就呢?我们希望用 原力 (以前也叫 影响力,声望) 来体现用户的成就, 并希望用原力来帮助 ...
随机推荐
- 参加2018之江杯全球人工智能大赛
:视频识别&问答
学习了一段时间的AI,用天池大赛来检验一下自己的学习成果. 题目:参赛者需对给定的短视频进行内容识别和分析,并回答每一个视频对应的问题.细节请到阿里天池搜索. 两种思路 1 将视频截成一帧一帧的图片, ...
- Python 黑魔法(持续收录)
Python 黑魔法(持续收录) zip 对矩阵进行转置 a = [[1, 2, 3], [4, 5, 6]] print(list(map(list, zip(*a)))) zip 反转字典 a = ...
- 重现ssd遇到的问题
首先是create_list.sh和create_data.sh中的data_dir的路径得修改. 然后是在create_data.sh文件调用$caffe_root下的scripts目录中的crea ...
- webpack + less
使用less需要安装 'style-loader','css-loader','less-loader' 三个loader. 安装之后在webpack.config.js配置 const path = ...
- UVALive 6324 Archery (求射箭覆盖的期望)
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> const d ...
- 软考——(5)计算机系统之CPU组成
其实我们很早就接触过计算机系统方面的知识,但是还是出现印象不深,理解不清楚的现象,丢分很严重.这部分的知识需要我们花功夫去理解,因为很多东西我们接触不到,比如校验码.码制等,如果你不去理解而是去记,就 ...
- jquery radio 行选中 操作
想实现点击一行中任意位置 此行的 radio 选中. function rowClick(t) { var id = $(t).attr("id").substr(3, 1); / ...
- DataBase -- Count & Group by
SQL Count()函数: SQL COUNT(column_name)语法:COUNT(column_name)函数返回指定列的值得数目(NULL不计入) select count(column_ ...
- DP———7.导弹拦截(emmm冷静分析一波也不叫DP吧,不过有一种DP的方法写)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hibernate用配置文件的方式实现orm
本文主要讲用配置文件的方式讲如何把一个对象和数据库中的表关联起来,其实用配置文件本质是和用注解的方式是一样的. 思路:1.写一个domain对象(如Person.java) 2.写这个domain对象 ...