题面

题解

点分治大火题。。。

设白边数量为$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相关推荐

  1. 【CF833D】Red-Black Cobweb(点分治)

    [CF833D]Red-Black Cobweb(点分治) 题面 CF 有一棵树,每条边有一个颜色(黑白)和一个权值,定义一条路径是好的,当且仅当这条路径上所有边的黑白颜色个数a,b满足2min(a, ...

  2. 【CF833D】Red-Black Cobweb

    [CF833D]Red-Black Cobweb 题面 洛谷 题解 看到这种统计路径的题目当然是淀粉质啦. 考虑转化一下信息设一条路径上有红点\(a\)个,黑点\(b\)个 则\(2min(a,b)\ ...

  3. CF833D Red-Black Cobweb 点分治、树状数组

    传送门 统计所有路径的边权乘积的乘积,不难想到点分治求解. 边权颜色比例在\([\frac{1}{2},2]\)之间,等价于\(2B \geq R , 2R \geq B\)(\(R,B\)表示红色和 ...

  4. elasticsearch 索引 red 状态恢复 green

    ES集群状态.节点.索引及基本查询 一.elasticsearch 索引 red 状态恢复 green 错误原因 由于CPU占用过高或者有部分节点的分片不可用,未被分配: 解决: 重新分配未被分配的分 ...

  5. Red Hat Linux 安装教程

    一.下载链接 链接:https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg  提取码:ture 二.安装步骤 1.打开虚拟机,单击"创建新的虚拟机&q ...

  6. 在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置

    在Red Hat Linux5下构建LAMP网站服务平台之MySQL.PHP的安装与配置 2010-09-09 16:40:49 标签:PHP Linux mysql RedHat [推送到技术圈] ...

  7. 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 ...

  8. UCL葡萄酒(red white wine quality)数据集字段解释、数据导入实战

    UCL葡萄酒(red white wine quality)数据集字段解释.数据导入实战 目录 UCL葡萄酒(red white wine quality)数据集字段解释.数据导入实战 #数据字段说明 ...

  9. beatsx三闪红灯是什么意思_周迅感情亮红灯?真离了!?亮红灯英文是red light ?red 对了,但不用 light!...

    文末有福利哦,看完不要跑 ? 今天点进来学英语顺带吃瓜的朋友可能是3个状态:什么?周迅结婚了?是的,周迅在2014年和华裔明星高圣远结婚.什么?周迅不是早离了吗?关于周迅的婚姻状态一直有人在猜测,但是 ...

最新文章

  1. OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)
  2. Oracle分区表基础知识培训
  3. Mysql数据库的打开和关闭
  4. C语言库函数(Q类字母)
  5. VS2017报错头文件unistd.h
  6. 三相滤波器怎么接线_单相电机和三相电机怎么接线?为什么三相电机有3或6个接线柱?...
  7. mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)
  8. Linux:VMware Tools安装方法及共享文件夹设置方法
  9. 用python画图代码-【Matplotlib】利用Python进行绘图
  10. python3安装scapy_centos 7 安装python3.7 和scapy
  11. Python语言应该加上块标识(开始、结束)的特性
  12. PC连Moto V180上网
  13. 关于联想键盘,如何去除fn 键 联想官方解决方法
  14. Coin3D三维可视化教程7
  15. 获取当前时间戳的方法
  16. 这次要讲不清前后端分离,我都怎么地!
  17. Jmeter---脚本录制
  18. 出入库单据小票移动打印,盘点机PDA连接蓝牙打印机打印单据小票
  19. webpack基础知识
  20. win10 内存清理

热门文章

  1. 微信小程序接入富文本编辑
  2. 淘宝被列入黑名单,确有其事还是另有原因
  3. vue slot具名插槽
  4. office 2003也能编辑.docx文档
  5. ESP32 CAM与服务器(python)UDP视频传输
  6. JMeter录制不到接口(踩坑记录)
  7. js对象、数字深拷贝方式(转)
  8. A. Equalize Prices Again(水题) Codeforces Round #590 (Div. 3)
  9. 6、学习大数据笔记-hdfs读写代码
  10. Android root环境下设置ro.debuggable = 1