[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

时间: 2024-10-12 19:07:19

[JSOI2017]原力(分块+map(hash))的相关文章

poj 3320 Jessica&#39;s Reading Problem(尺取法+map/hash)

题目:http://poj.org/problem?id=3320 题意:给定N个元素的数组,找出最短的一段区间使得区间里面的元素种类等于整个数组的元素种类. 分析:暴力枚举区间的起点x,然后找到最小的y,使得区间[x,y]满足条件,x向有移位后变成x',现在的y'肯定不至于在y的左边.存状态的话map和hash都可以. map代码: #include <iostream> #include <set> #include <map> #include <cstdi

百度之星D map+hash

Problem D Accepts: 2806 Submissions: 8458 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字

算法将成为人工智能时代的“科技原力”

10月25日,"TEDx漕河泾--科技的原力"主题演讲在上海举行,腾讯公司副总裁姚星在演讲中回顾了中国互联网20年经历的三个阶段,并且展望了人工智能行业的发展趋势."算法,将成为人工智能时代的'科技原力'",姚星说. 过往的20年,是互联网飞速发展,并渗透到我们经济生活的每一个方面的20年.姚星将其划分为三个阶段:窄带时代.宽带时代和移动互联网时代. 诞生于1998年的Google,首页最初是一个极为简洁的搜索框,这个首页的传输大小是小于1024字节的,"

hdu5305 Friends(dfs+map/hash)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给定N个人和M条朋友关系,是朋友关系的两个人之间有两种联系方式online和offline.使每个人的online的数量和offline的数量相等,求方案数. 分析:由于M<=28,暴力枚举的话2^28很大,会超时.可以考虑把所有的状态平分成两半,即枚举前面M/2条关系,暴力求出前面的2^(M/2)种状态,然后枚举后面M/2条关系,暴力求出后面2^(M/2)种状态,再枚举后面一半的状态,对于

【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][Discuss] Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增

POJ 1840 Eqs 二分+map/hash

Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The coefficients are given integers from the interval [-50,50]. It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,

poj 2945 Find the Clones (map+string,hash思维)

Find the Clones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7498   Accepted: 2780 Description Doubleville, a small town in Texas, was attacked by the aliens. They have abducted some of the residents and taken them to the a spaceship

hdu 5172(线段树||HASH)

GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1379    Accepted Submission(s): 355 Problem Description GTY has n gay friends. To manage them conveniently, every morning he ord

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob