bzoj 5206
$n$ 点 $m$ 边图的有限制三元环个数
首先将所有左右端点并且属性相同的边的权值相加,合并为一条边
在这只之前得先排序
排序之前得先判断是否需要交换左右端点的位置 T_T
然后统计三元环
补充说明按照上一篇博客的做法统计的正确性
考虑一个三元环 $(u, v), (v, v_2), (u, v_2)$
建边之后一定存在且只存在一个点的出度为2,这也就是改图成为 $DAG$ 的原因
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; #define gc getchar()
inline int read() {int x = ; char c = gc; while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
#undef gc const int N = 5e4 + , M = 1e5 + , Mod = 1e9 + ; int n, m;
int A[M], B[M], W[M], C[M], Id[M];
int du[N];
int vis[N][], cost[N][]; inline int Get_() {
char c = getchar();
return c == 'R' ? : (c == 'G' ? : );
} inline bool Cmp(const int &a, const int &b) {
if(A[a] != A[b]) return A[a] < A[b];
if(B[a] != B[b]) return B[a] < B[b];
return C[a] < C[b];
} int cnt, head[N];
struct Node {int v, w, nxt, col;} G[M]; inline void Add(int u, int v, int w, int col) {
G[++ cnt].v = v;
G[cnt].w = w;
G[cnt].col = col;
G[cnt].nxt = head[u];
head[u] = cnt;
} int main() {
n = read(), m = read();
for(int i = ; i <= m; i ++) {
A[i] = read(), B[i] = read(), W[i] = read(), C[i] = Get_(), Id[i] = i;
if(A[i] > B[i]) swap(A[i], B[i]);
}
sort(Id + , Id + m + , Cmp);
int t = ;
for(int i = ; i <= m; i ++) {
if(A[Id[i]] == A[Id[t]] && B[Id[i]] == B[Id[t]] && C[Id[i]] == C[Id[t]]) W[Id[t]] = (W[Id[t]] + W[Id[i]]) % Mod;
else t ++, Id[t] = Id[i];
}
m = t;
for(int i = ; i <= m; i ++) du[A[Id[i]]] ++, du[B[Id[i]]] ++;
for(int i = ; i <= n; i ++) head[i] = -;
for(int i = ; i <= m; i ++) {
if(du[A[Id[i]]] > du[B[Id[i]]] || (du[A[Id[i]]] == du[B[Id[i]]] && A[Id[i]] > B[Id[i]]))
Add(B[Id[i]], A[Id[i]], W[Id[i]], C[Id[i]]);
else Add(A[Id[i]], B[Id[i]], W[Id[i]], C[Id[i]]);
}
long long Answer();
for(int k = ; k <= m; k ++) {
for(int i = head[A[Id[k]]]; ~ i; i = G[i].nxt)
if(G[i].col != C[Id[k]]) vis[G[i].v][G[i].col] = k, cost[G[i].v][G[i].col] = G[i].w;
long long tot();
for(int i = head[B[Id[k]]]; ~ i; i = G[i].nxt) {
if(G[i].col != C[Id[k]]) {
int need_col = - C[Id[k]] - G[i].col;
if(vis[G[i].v][need_col] == k) tot = (tot + 1LL * cost[G[i].v][need_col] * G[i].w) % Mod;
}
}
Answer = (Answer + (tot * W[Id[k]]) % Mod) % Mod;
}
cout << Answer << "\n";
return ;
}
bzoj 5206的更多相关文章
- bzoj 5206 [Jsoi2017]原力
LINK:原力 一张无向图 这道题统计三元环的价值和.有重边但是无自环. 我曾经写过三元环计数 这个和那个题差不太多. 不过有很多额外操作 对于重边问题 我们把所有颜色相同的重边缩在一起 这样的话我们 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【splay】文艺平衡树 BZOJ 3223
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
随机推荐
- Golang的安装与环境配置(包括Go lint、Go imports、Go fmt)
Golang安装 下载地址:https://studygolang.com/dl Go语言中文网 下载后安装,win10系统中会自动配置大部分设置,linux系统请参照网上教程 GO环境变量配置: $ ...
- dotnet Core学习之旅(二):安装IDE
[重要:文中所有外链不能确保永久有效] >开发工具 高效的开发必然需要一个优秀的集成开发环境(IDE) 对于.NET Core 2.x可以使用包括但不限于以下IDE来进行开发. Visual S ...
- SpringBoot学习(五)—— springboot快速整合Druid
Druid连接池 简介 由阿里巴巴开源的druid连接池是目前综合实力最突出的数据库连接池,而且还提供了监控日志功能,能够分析SQL执行情况. 引入druid连接池 pom.xml中加入 <de ...
- Python-demo(抖音)
# -*- coding:utf-8 -*- from mitmproxy import ctx import json import requests import time import os p ...
- C# async 和 await 理解
C# async 和 await 理解 先假设如下场景: 主函数 Main,循环等待用户输入: 计算函数 Cal,耗时计算大量数据: class Test { static int Main(stri ...
- .NET Core 使用swagger进行分组显示
其实,和swagger版本管理类似;只是平时接口太多;不好供前端人员进行筛选. 下面进入主题: 首先: //注册Swagger生成器,定义一个和多个Swagger 文档 services.AddSwa ...
- 【转载】C#指定文件夹下面的所有内容复制到目标文件夹下面
在涉及到文件夹操作的过程中,有时候需要将文件夹下的所有内容复制拷贝到另一个文件夹,在C#的开发中有时候会遇到这个功能需求将指定文件夹下所有的内容复制到另一个文件夹,这个过程需要遍历所有的文件和目录.此 ...
- css 层叠 比较特殊性
css 层叠: 多个相同的css声明(属性),应用到同一个元素上.当一个标签声明冲突时,浏览器会自动出发层叠机制 1:比较优先级 2:比较特殊性 3:比较源次序 依次经过上面的1,2,3的比较后,最终 ...
- vue组件间的数据传递
父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...
- nginx 默认配置语法和日志的format
nginx 默认配置 查看有nginx哪些默认配置文件,打开/etc/nginx/nginx.conf文件,查看尾行部分 会默认将/etc/nginx/conf.d/文件下其他以.conf结尾的配置文 ...