题目描述

一个原力网络可以看成是一个可能存在重边但没有自环的无向图。每条边有一种属性和一个权值。属性可能是R、G、B三种当中的一种,代表这条边上 原力的类型。权值是一个正整数,代表这条边上的原力强度。原力技术的核心在于将R、G、B三种不同的原力融合在一起产生单一的、便于利用的原力。为了评估 一个能源网络,JYY需要找到所有满足要求的三元环(首尾相接的三条边),其中R、G、B三种边各一条。一个三元环产生的能量是其中三条边的权值之积。
现在对于给出的原力网络,JYY想知道这个网络的总能量是多少。网络的总能量是所有满足要求三元环的能量之和。

输入

第一行包含两个正整数N、M。表示原力网络的总顶点个数和总边数。
接下来M行,每行包含三个正整数ui,vi,wi和一个字符ci。
表示编号ui和vi的顶点之间存在属性为ci权值为wi的一条边。
N≤50,000,M≤100,000,1≤?Wi≤10^6

输出

输出一行一个整数,表示这个原力网络的总能量模10^9+7的值

样例输入

4 6
1 2 2 R
2 4 3 G
4 3 5 R
3 1 7 G
1 4 11 B
2 3 13 B

样例输出

828

惯例的分块(第一次做实在想不到但这是一个套路,不仅在图上,在数学动规等处也有应用),度数比$\sqrt n$大的点成为大点,其余称为小点。

只有大点的三元环直接暴力即可,然后对于每个小点,枚举它的两条出边hash判断。枚举第一条边的复杂度与边数同阶,枚举第二条边的复杂度为边数成小点的度数,即不超过$O(m\sqrt n)$。

 1 #include<map>
 2 #include<cmath>
 3 #include<cstdio>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 typedef long long ll;
 6 using namespace std;
 7
 8 const int N=50100,mod=1000000007;
 9 struct data{
10     int x,y,z; data() {}
11     data(int a,int b,int c) {x=a,y=b,z=c;}
12     bool operator<(const data &a)const {return x == a.x ? y == a.y ? z < a.z : y < a.y : x < a.x;}
13 };
14 map<data,ll> mp;
15 int n,m,si,x,y,z,t,head[N],to[N << 2],val[N << 2],opt[N << 2],next[N << 2],cnt,d[N],id[350],tot;
16 char str[5];
17
18 void add(int x,int y,int v,int c){ to[++cnt]=y,val[cnt]=v,opt[cnt]=c,next[cnt]=head[x],head[x]=cnt; }
19
20 int main(){
21     ll ans=0; scanf("%d%d",&n,&m),si=(int)sqrt(m);
22     rep(i,1,m){
23         scanf("%d%d%d%s",&x,&y,&z,str);
24         t=(str[0] == 'R' ? 1 : str[0] == 'G' ? 2 : 3);
25         add(x,y,z,t),add(y,x,z,t),d[x] ++,d[y] ++ ;
26         (mp[data(x,y,t)] += z) %= mod,(mp[data(y,x,t)] += z) %= mod;
27     }
28     rep(i,1,n) if(d[i] >= si) id[++tot]=i;
29     rep(i,1,tot) rep(j,1,tot) rep(k,1,tot)
30         ans=(ans+mp[data(id[i],id[j],1)]*mp[data(id[i],id[k],2)]%mod*mp[data(id[j],id[k],3)])%mod;
31     rep(i,1,n) if(d[i] < si)
32         for(int j=head[i] ; j ; j=next[j])
33             if(d[to[j]] >= si || to[j] > i)
34                 for(int k=next[j]; k; k=next[k])
35                     if(opt[k]!=opt[j] && (d[to[k]]>=si || to[k]>i))
36                             ans=(ans+mp[data(to[j],to[k],6-opt[j]-opt[k])]*val[j]%mod*val[k])%mod;
37     printf("%lld\n",ans);
38     return 0;
39 }

转载于:https://www.cnblogs.com/HocRiser/p/8687753.html

[JSOI2017]原力(分块+map(hash))相关推荐

  1. Java 那些最常用的工具类库 | 原力计划

    作者 |  Java 识堂 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) Apache Commons Apache Commons有很多子项目,常用的项目如下: BeanUtils ...

  2. 美团BERT的探索和实践 | CSDN原力计划

    扫码参与CSDN"原力计划" 作者 | 杨扬 佳昊 金刚等 来源 | CSDN原力计划作品 *点击阅读原文,查看美团技术团队更多干货文章. 背景 2018年,自然语言处理(Natu ...

  3. 找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...

    作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程线程的概念,百度是这样解释的:线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际 ...

  4. 8 种架构设计模式优缺点大曝光 | 原力计划

    作者 | 程序员Tony 责编 | 王晓曼 出品 | CSDN博客 什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果,哈哈,我理解,架构就是骨架. 人类的身体的支撑 ...

  5. linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划

    作者 | 一得的跋涉责编 | 伍杏玲出品 | CSDN博客对于 Linux 磁盘满的问题,我们通常的处理思路是用 du 查找可清理的大文件,然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入 ...

  6. QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划

    作者 | 白家名 责编 | 王晓曼 出品 | CSDN博客 本文作者使用 QT 框架写了一个塔防游戏程序,该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射 ...

  7. 哪些人在听 60 亿流量《惊雷》?Python 告诉你 | 原力计划

    作者 | 听不来喊麦的C君 来源 | CSDN博客 惊雷/通天修为/天塌地陷紫金锤 紫电/玄真火焰/九天玄剑惊天变 这看起来不着边际的歌词,配上简单粗暴的蹦迪音乐. 最近,一首<惊雷>的喊 ...

  8. 2 万字长文详解 10 大多线程面试题|原力计划

    作者 | ZZZhonngger 责编 | 伍杏玲 出品 | CSDN博客 Volatile相关 1.请谈谈你对 volatile 的理解 答:volatile 是 Java 虚拟机提供的轻量级的同步 ...

  9. 20 道必看的 Vue 面试题 | 原力计划

    作者 | 红颜祸水nvn 责编 | 唐小引 出品 | CSDN 原力计划 1. 什么是 MVVM? MVVM 是 Model-View-ViewModel 的缩写,MVVM 是一种设计思想.Model ...

  10. 300 行代码带你秒懂 Java 多线程!| 原力计划

    作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程 线程的概念,百度是这样解释的: 线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的 ...

最新文章

  1. C/C++指向指针的指针
  2. Matab 读取修改 XML
  3. python 1 2 3怎么拼接所有可能的数_6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!...
  4. mysql 用户管理表_mysql用户管理
  5. 卸载Android虚拟机里的项目(cmd)
  6. Windows下安装Scala
  7. 环境在c盘_笔记本电脑常见故障--清理C盘空间
  8. PyCharm安装步骤
  9. 论文写不出来,导师放养,严重焦虑,怎么办?
  10. Linux网络嗅探器实验报告,C语言实现 Linux 网络嗅探器
  11. 矢志不渝,人生会慢慢露出轮廓。
  12. EventLog Analyzer应用程序日志管理
  13. 《古月ROS探索总结》学习笔记2
  14. 心脏出血(Heartbleed)漏洞浅析、复现
  15. 永恩上线服务器维护,LOL网友爆料:劫将推出至臻皮肤,卢锡安赛娜情侣皮肤即将上线?...
  16. 【Java】什么是二方库?
  17. 专业工具软件课程意见汇总及答复
  18. Java, 正则表达式之打折问题。
  19. windows10系统显示桌面电脑图标
  20. springboot中的pom文件 project报错问题

热门文章

  1. 博图中fb与多重背景数据块_STEP7中如何生成和更新多重背景?
  2. java为什么要用数据源_【Java】就配置了一个数据源,为什么提示 there is more than one bean of “DataSource” type...
  3. mysql5.7 gtid问题_MySQL 5.7.5: 新语法WAIT_FOR_EXECUTED_GTID_SET 及存在的问题-阿里云开发者社区...
  4. python 最小二乘法库_利用python搞机器学习——最小二乘法 | 学步园
  5. c++如何快速写出get set_如何快速写出产品文案?(4大核心方法)
  6. python加法运算符_python 入门之 – 基本运算符(七)
  7. PAT-A1053:Path of Equal Weight(普通树的遍历和非递减路径的输出)
  8. 安装blocksci mac出错_你的Mac与Big Sur兼容吗?
  9. Markdown 数学公式语法
  10. linux查找文件并显示修改时间,linux下find命令和文件的三种时间