CF833D Red-Black Cobweb
题面
题解
点分治大火题。。。
设白边数量为$a$,黑边为$b$,则$2min(a,b)\geq max(a,b)$
即$2a\geq b\;\&\&2b\geq a$
考虑点分治时如何统计答案:
$2(a_1 +a_2) \geq b_1 + b_2$
$\therefore 2a_1-b_1\geq b_2-2a_2$
另外一边同理
于是我们可以愉快地用$sort+BIT$统计答案了
但是路径有可能重复计算,可以套一个$CDQ$分治什么的来搞一下
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define clear(x, y) memset(x, y, sizeof(x));namespace IO
{const int BUFSIZE = 1 << 20;char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;inline char getchar() { if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin); return *is++; }
}inline int read()
{int data = 0, w = 1;char ch = IO::getchar();while(ch != '-' && (ch < '0' || ch > '9')) ch = IO::getchar();if(ch == '-') w = -1, ch = IO::getchar();while(ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::getchar();return data*w;
}const int maxn(1e5 + 10), Mod(1e9 + 7);
inline int fastpow(int x, int y)
{int ans = 1;while(y){if(y & 1) ans = 1ll * ans * x % Mod;x = 1ll * x * x % Mod, y >>= 1;}return ans;
}struct edge { int next, to, val, col; } e[maxn << 1];
int n, head[maxn], e_num, size[maxn], Size, min, root;
struct qry { int r, b, v, o; } stk[maxn], q[maxn << 2];
int top, cntq, cntup, csum[maxn << 2], cmul[maxn << 2], vis[maxn];
inline bool cmpr(const qry &a, const qry &b){ return a.r == b.r ? a.b < b.b : a.r < b.r; }void clean(int x)
{while(x <= (n << 2 | 1)) csum[x] = 0, cmul[x] = 1, x += x & -x;
}void add(int x, int v)
{while(x <= (n << 2 | 1))++csum[x], cmul[x] = 1ll * cmul[x] * v % Mod, x += x & -x;
}int query_sum(int x)
{int ans = 0;while(x) ans += csum[x], x -= x & -x;return ans;
}int query_mul(int x)
{int ans = 1;while(x) ans = 1ll * ans * cmul[x] % Mod, x -= x & -x;return ans;
}inline void add_edge(int from, int to, int val, int col)
{e[++e_num] = (edge) {head[from], to, val, col};head[from] = e_num;
}void getRoot(int x, int fa)
{size[x] = 1; int tot = 0;for(RG int i = head[x]; i; i = e[i].next){int to = e[i].to; if(vis[to] || to == fa) continue;getRoot(to, x); tot = std::max(tot, size[to]);size[x] += size[to];}tot = std::max(tot, Size - size[x]);if(tot < min) min = tot, root = x;
}void getVal(int x, int fa, int r, int b, int v)
{stk[++top] = (qry) {r, b, v, 0};for(RG int i = head[x]; i; i = e[i].next){int to = e[i].to; if(vis[to] || to == fa) continue;getVal(to, x, r + (!e[i].col), b + e[i].col, 1ll * v * e[i].val % Mod);}
}int ans = 1;
void CDQ(int l, int r)
{if(l >= r) return;int mid = (l + r) >> 1;CDQ(l, mid); CDQ(mid + 1, r);int j = l;for(RG int i = mid + 1; i <= r; i++){if(!q[i].o) continue;while(q[j].r <= q[i].r && j <= mid){if(!q[j].o) add(q[j].b, q[j].v);++j;}ans = 1ll * ans * query_mul(q[i].b) % Mod *fastpow(q[i].v, query_sum(q[i].b)) % Mod;}for(RG int i = l; i < j; i++) if(!q[i].o) clean(q[i].b);std::inplace_merge(q + l, q + mid + 1, q + r + 1, cmpr);
}void calc(int x)
{int PLUS = n << 1 | 1;cntq = cntup = 0;for(RG int i = head[x]; i; i = e[i].next){int to = e[i].to; if(vis[to]) continue;top = 0; getVal(to, x, !e[i].col, e[i].col, e[i].val);for(RG int j = 1; j <= top; j++){int a = stk[j].r, b = stk[j].b, c = 2 * a - b, d = 2 * b - a;q[++cntq] = (qry) {c + PLUS, d + PLUS, stk[j].v, 1};}for(RG int j = 1; j <= top; j++){int a = stk[j].r, b = stk[j].b, c = 2 * a - b, d = 2 * b - a;q[++cntq] = (qry) {-c + PLUS, -d + PLUS, stk[j].v, 0};if(2 * std::min(a, b) >= std::max(a, b))ans = 1ll * ans * stk[j].v % Mod;}}CDQ(1, cntq);
}void dfs(int x)
{vis[x] = 1; calc(x);for(RG int i = head[x]; i; i = e[i].next){int to = e[i].to; if(vis[to]) continue;Size = min = size[to]; getRoot(to, x); dfs(root);}
}int main()
{Size = min = n = read();for(int i = 1, a, b, c, d; i < n; i++)a = read(), b = read(), c = read(), d = read(),add_edge(a, b, c, d), add_edge(b, a, c, d);for(RG int i = 1; i <= (n << 2 | 1); i++) csum[i] = 0, cmul[i] = 1;getRoot(1, 0); dfs(root);printf("%d\n", ans);return 0;
}
转载于:https://www.cnblogs.com/cj-xxz/p/10167577.html
CF833D Red-Black Cobweb相关推荐
- 【CF833D】Red-Black Cobweb(点分治)
[CF833D]Red-Black Cobweb(点分治) 题面 CF 有一棵树,每条边有一个颜色(黑白)和一个权值,定义一条路径是好的,当且仅当这条路径上所有边的黑白颜色个数a,b满足2min(a, ...
- 【CF833D】Red-Black Cobweb
[CF833D]Red-Black Cobweb 题面 洛谷 题解 看到这种统计路径的题目当然是淀粉质啦. 考虑转化一下信息设一条路径上有红点\(a\)个,黑点\(b\)个 则\(2min(a,b)\ ...
- CF833D Red-Black Cobweb 点分治、树状数组
传送门 统计所有路径的边权乘积的乘积,不难想到点分治求解. 边权颜色比例在\([\frac{1}{2},2]\)之间,等价于\(2B \geq R , 2R \geq B\)(\(R,B\)表示红色和 ...
- elasticsearch 索引 red 状态恢复 green
ES集群状态.节点.索引及基本查询 一.elasticsearch 索引 red 状态恢复 green 错误原因 由于CPU占用过高或者有部分节点的分片不可用,未被分配: 解决: 重新分配未被分配的分 ...
- Red Hat Linux 安装教程
一.下载链接 链接:https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg 提取码:ture 二.安装步骤 1.打开虚拟机,单击"创建新的虚拟机&q ...
- 在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置
在Red Hat Linux5下构建LAMP网站服务平台之MySQL.PHP的安装与配置 2010-09-09 16:40:49 标签:PHP Linux mysql RedHat [推送到技术圈] ...
- oracle enterprise linux 5.7,Red Hat Enterprise Linux 5.7 安装Oracle数据库
环境:Red Hat Enterprise Linux 5.7 数据库:Oracle 11g 1.Linux操作系统安装组建选择: GNOME Desktop Environment Editors ...
- UCL葡萄酒(red white wine quality)数据集字段解释、数据导入实战
UCL葡萄酒(red white wine quality)数据集字段解释.数据导入实战 目录 UCL葡萄酒(red white wine quality)数据集字段解释.数据导入实战 #数据字段说明 ...
- beatsx三闪红灯是什么意思_周迅感情亮红灯?真离了!?亮红灯英文是red light ?red 对了,但不用 light!...
文末有福利哦,看完不要跑 ? 今天点进来学英语顺带吃瓜的朋友可能是3个状态:什么?周迅结婚了?是的,周迅在2014年和华裔明星高圣远结婚.什么?周迅不是早离了吗?关于周迅的婚姻状态一直有人在猜测,但是 ...
最新文章
- OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)
- Oracle分区表基础知识培训
- Mysql数据库的打开和关闭
- C语言库函数(Q类字母)
- VS2017报错头文件unistd.h
- 三相滤波器怎么接线_单相电机和三相电机怎么接线?为什么三相电机有3或6个接线柱?...
- mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)
- Linux:VMware Tools安装方法及共享文件夹设置方法
- 用python画图代码-【Matplotlib】利用Python进行绘图
- python3安装scapy_centos 7 安装python3.7 和scapy
- Python语言应该加上块标识(开始、结束)的特性
- PC连Moto V180上网
- 关于联想键盘,如何去除fn 键 联想官方解决方法
- Coin3D三维可视化教程7
- 获取当前时间戳的方法
- 这次要讲不清前后端分离,我都怎么地!
- Jmeter---脚本录制
- 出入库单据小票移动打印,盘点机PDA连接蓝牙打印机打印单据小票
- webpack基础知识
- win10 内存清理
热门文章
- 微信小程序接入富文本编辑
- 淘宝被列入黑名单,确有其事还是另有原因
- vue slot具名插槽
- office 2003也能编辑.docx文档
- ESP32 CAM与服务器(python)UDP视频传输
- JMeter录制不到接口(踩坑记录)
- js对象、数字深拷贝方式(转)
- A. Equalize Prices Again(水题) Codeforces Round #590 (Div. 3)
- 6、学习大数据笔记-hdfs读写代码
- Android root环境下设置ro.debuggable = 1