题面

题解

点分治大火题。。。

设白边数量为$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的更多相关文章

  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. 题解 CF833D Red-Black Cobweb

    题目传送门 题目大意 给出一个 \(n\) 个点的树,每条边有边权和颜色 \(0,1\) ,定义一条链合法当且仅当 \(0,1\) 颜色的边数之比小于等于 \(2\) ,求所有合法的链的边权之积的积. ...

  5. Codeforces 833D Red-black Cobweb【树分治】

    D. Red-black Cobweb time limit per test:6 seconds memory limit per test:256 megabytes input:standard ...

  6. 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步

    Sql Data Compare 是比较两个数据库的数据是否相同.生成同步sql的工具. 这一款工具由Red Gate公司出品,我们熟悉的.NET Reflector就是这个公司推出的,它的SQLTo ...

  7. 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步

    将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1. ...

  8. 新年抢红包效果(New Year Red Packet)

    新年抢红包效果(New Year Red Packet) 晓娜的文章(微信公众号:migufe) 2016即将过去,我们将迎来新的一年2017,这里小编提前祝大家新年快乐!万事如意!那我们新年最开心的 ...

  9. KALI Linux problems & Study Red Hat | Ubuntu

    Problem When you ask some website with https head.you may met the problem  secure connection failed ...

随机推荐

  1. Mac Sublime Text 3

    安装Package Control安装过程: 使用快捷键 control + ` 或者菜单栏选择View > Show Console安装Package Control参考官方页面.Sublim ...

  2. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  3. kubernetes 入门学习

    kubernetes 学习 kubernetes 简介 Kubernetes这个名字源自希腊语,意思是"舵手",也是"管理者","治理者"等 ...

  4. 1053. [HAOI2007]反素数ant【DFS+结论】

    Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数 ...

  5. [HNOI2010]公交线路

    题目 发现\(n\)比较大,但是\(k,p\)都很小,考虑矩乘使得复杂度倾斜一下 发现所有车的最大间隔都是\(p\),还保证\(k<p\),于是我们可以考虑压下最后\(p\)位的情况 于是设\( ...

  6. POJ3907 Build Your Home

    嘟嘟嘟 题意:按逆时针或顺时针给出一个多边形,求面积. 解法:直接套用公式:\(S = \frac{1}{2}|\sum _ {i = 1} ^ {n} {v_i \times v_{i + 1}}| ...

  7. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

    因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...

  8. ArcSDE 数据迁移 Exception from HRESULT: 0x80041538问题及解决方案

    一.问题描述 1.采用gdb模板文件,在ArcSDE(数据服务器)中批量创建数据库表(数据迁移)时,用到接口ESRI.ArcGIS.Geodatabase.IGeoDBDataTransfer的方法T ...

  9. mac系统 IDEA+JFinal+Tomcat+Maven搭建

    1.下载Maven(http://maven.apache.org/download.cgi) 2.下载Tomcat(http://tomcat.apache.org/download-90.cgi) ...

  10. 【星云测试】Wings-让单元测试智能全自动生成

    Wings-让单元测试智能全自动生成 前言 单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受UI影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发, ...