[JSOI2017]原力(分块+map(hash))
题目描述
一个原力网络可以看成是一个可能存在重边但没有自环的无向图。每条边有一种属性和一个权值。属性可能是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))相关推荐
- Java 那些最常用的工具类库 | 原力计划
作者 | Java 识堂 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) Apache Commons Apache Commons有很多子项目,常用的项目如下: BeanUtils ...
- 美团BERT的探索和实践 | CSDN原力计划
扫码参与CSDN"原力计划" 作者 | 杨扬 佳昊 金刚等 来源 | CSDN原力计划作品 *点击阅读原文,查看美团技术团队更多干货文章. 背景 2018年,自然语言处理(Natu ...
- 找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...
作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程线程的概念,百度是这样解释的:线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际 ...
- 8 种架构设计模式优缺点大曝光 | 原力计划
作者 | 程序员Tony 责编 | 王晓曼 出品 | CSDN博客 什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果,哈哈,我理解,架构就是骨架. 人类的身体的支撑 ...
- linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划
作者 | 一得的跋涉责编 | 伍杏玲出品 | CSDN博客对于 Linux 磁盘满的问题,我们通常的处理思路是用 du 查找可清理的大文件,然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入 ...
- QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划
作者 | 白家名 责编 | 王晓曼 出品 | CSDN博客 本文作者使用 QT 框架写了一个塔防游戏程序,该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射 ...
- 哪些人在听 60 亿流量《惊雷》?Python 告诉你 | 原力计划
作者 | 听不来喊麦的C君 来源 | CSDN博客 惊雷/通天修为/天塌地陷紫金锤 紫电/玄真火焰/九天玄剑惊天变 这看起来不着边际的歌词,配上简单粗暴的蹦迪音乐. 最近,一首<惊雷>的喊 ...
- 2 万字长文详解 10 大多线程面试题|原力计划
作者 | ZZZhonngger 责编 | 伍杏玲 出品 | CSDN博客 Volatile相关 1.请谈谈你对 volatile 的理解 答:volatile 是 Java 虚拟机提供的轻量级的同步 ...
- 20 道必看的 Vue 面试题 | 原力计划
作者 | 红颜祸水nvn 责编 | 唐小引 出品 | CSDN 原力计划 1. 什么是 MVVM? MVVM 是 Model-View-ViewModel 的缩写,MVVM 是一种设计思想.Model ...
- 300 行代码带你秒懂 Java 多线程!| 原力计划
作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程 线程的概念,百度是这样解释的: 线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的 ...
最新文章
- C/C++指向指针的指针
- Matab 读取修改 XML
- python 1 2 3怎么拼接所有可能的数_6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!...
- mysql 用户管理表_mysql用户管理
- 卸载Android虚拟机里的项目(cmd)
- Windows下安装Scala
- 环境在c盘_笔记本电脑常见故障--清理C盘空间
- PyCharm安装步骤
- 论文写不出来,导师放养,严重焦虑,怎么办?
- Linux网络嗅探器实验报告,C语言实现 Linux 网络嗅探器
- 矢志不渝,人生会慢慢露出轮廓。
- EventLog Analyzer应用程序日志管理
- 《古月ROS探索总结》学习笔记2
- 心脏出血(Heartbleed)漏洞浅析、复现
- 永恩上线服务器维护,LOL网友爆料:劫将推出至臻皮肤,卢锡安赛娜情侣皮肤即将上线?...
- 【Java】什么是二方库?
- 专业工具软件课程意见汇总及答复
- Java, 正则表达式之打折问题。
- windows10系统显示桌面电脑图标
- springboot中的pom文件 project报错问题
热门文章
- 博图中fb与多重背景数据块_STEP7中如何生成和更新多重背景?
- java为什么要用数据源_【Java】就配置了一个数据源,为什么提示 there is more than one bean of “DataSource” type...
- mysql5.7 gtid问题_MySQL 5.7.5: 新语法WAIT_FOR_EXECUTED_GTID_SET 及存在的问题-阿里云开发者社区...
- python 最小二乘法库_利用python搞机器学习——最小二乘法 | 学步园
- c++如何快速写出get set_如何快速写出产品文案?(4大核心方法)
- python加法运算符_python 入门之 – 基本运算符(七)
- PAT-A1053:Path of Equal Weight(普通树的遍历和非递减路径的输出)
- 安装blocksci mac出错_你的Mac与Big Sur兼容吗?
- Markdown 数学公式语法
- linux查找文件并显示修改时间,linux下find命令和文件的三种时间