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;
}
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\)表示红色和 ...
- 题解 CF833D Red-Black Cobweb
题目传送门 题目大意 给出一个 \(n\) 个点的树,每条边有边权和颜色 \(0,1\) ,定义一条链合法当且仅当 \(0,1\) 颜色的边数之比小于等于 \(2\) ,求所有合法的链的边权之积的积. ...
- Codeforces 833D Red-black Cobweb【树分治】
D. Red-black Cobweb time limit per test:6 seconds memory limit per test:256 megabytes input:standard ...
- 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步
Sql Data Compare 是比较两个数据库的数据是否相同.生成同步sql的工具. 这一款工具由Red Gate公司出品,我们熟悉的.NET Reflector就是这个公司推出的,它的SQLTo ...
- 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步
将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1. ...
- 新年抢红包效果(New Year Red Packet)
新年抢红包效果(New Year Red Packet) 晓娜的文章(微信公众号:migufe) 2016即将过去,我们将迎来新的一年2017,这里小编提前祝大家新年快乐!万事如意!那我们新年最开心的 ...
- KALI Linux problems & Study Red Hat | Ubuntu
Problem When you ask some website with https head.you may met the problem secure connection failed ...
随机推荐
- 利用TLE数据确定卫星轨道(2)-SGP4模型实现
1.TLE轨道报: 接上一篇,TLE轨道报各项内容所代表的意义如下: 2.SGP4模型: TLE轨道报计算卫星轨道需要用到 NORAD 开 发 的 SGP4/SDP4 模 型 ,SGP4模型是由 Ke ...
- 3.2 Spark内置RPC框架
实现的HttpFileServer,但在Spark 2.0.0版本中它也被废弃了,现在使用的是基于Spark内置RPC框架的NettyStreamManager.节点间的Shuffle过程和Block ...
- robotframework接口测试(二)—post request
第5行:发起post请求.因为我写了好多的参数,所以这样写的. 也可以这样写 其他行:可见[robotframework接口测试(二)—get request json]
- HTML小记
1.页面内跳转 当<a>元素用于页面内的锚点跳转时,应该先为该页面设置一些锚点,而定义锚点有两种办法: 通过<a>元素的name属性来定义,如:<a name=" ...
- 纯swift开发,弹幕,演唱会广告牌
最近去了次演唱会,看见有人在用这个,刚好没事,我自己也写了一个. 顺手练一练swift,第一个纯swift开发工程. 支持字体大小切换,滚动速度切换,字体切换,字体颜色切换 工程Git:https:/ ...
- koa2学习笔记01 - 创建项目 —— koa生成器一键生成koa项目
前言 从17年开始尝试学习搭建个人网站开始,就开始学习摸索node了,至今差不多快两年了. 说起来现在都9102年了,所以最近打算整体设计重构一下网站,索性node后台也重写一遍. 重温一下node, ...
- Windows10系统在VMware中安装CentOS7操作系统并实现图形化用户界面Gnome
由于操作系统课程需要,我尝试在windows10环境下安装linux虚拟机,最终采用centOS7和Gnome图形用户界面,在安装和使用过程中出现一些问题,在这里将其记录下来,以便后续查阅. 第一部分 ...
- ps基本认识
近来中意ui方面学习,从视频中总结了些许notses,希望能够帮到共同喜欢(❤ ω ❤)的友友 ·基础了解 位图:由像素组成的图片,把位图无限放大以后看到很多小方格,一个方格代表一个像素 矢量图:放大 ...
- koa中静态文件资源中间件实现
项目实践过程中,会使用非常多的静态资源,怎样可以直接在浏览器中访问到这些静态资源 const fs = require('fs'); const path = require('path'); mod ...
- jdbc之Statement和Preparement
Jdbc DML 操作 Statement:静态SQL操作 每次操作都会将sql语句提交到数据库执行一次,性能比较低 // 1.加载驱动程序 Class.forName(driverName); // ...