传送门


统计所有路径的边权乘积的乘积,不难想到点分治求解。

边权颜色比例在\([\frac{1}{2},2]\)之间,等价于\(2B \geq R , 2R \geq B\)(\(R,B\)表示红色和黑色的边的条数)

所以我们可以在统计的时候,先把所有可能的路径全部乘进答案,然后除掉满足\(2B < R\)或者\(2R < B\)的路径的乘积。显然对于一条路径,这两个条件至多满足一个。

对于两条路径,它们红色、黑色的边数分别为\(B_1,R_1\)和\(B_2,R_2\),那么需要统计的就是\(R_1 - 2B_1 > 2B_2 - R_2\)或者\(B_1 - 2R_1 > 2R_2 - B_2\)的路径的信息。可以使用树状数组维护。

#include<iostream>
#include<cstdio>
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define PII pair < int , int >
#define st first
#define nd second
const int MAXN = 1e5 + 7 , MOD = 1e9 + 7; inline int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
} struct Edge{int end , upEd , w , col;}Ed[MAXN << 1];
int head[MAXN] , N , nowSz , minSz , minInd , sum , ans , cnt , cntEd;
bool vis[MAXN]; struct BIT{
#define lowbit(x) ((x) & -(x))
int BIT0[MAXN << 2] , BIT1[MAXN << 2];
BIT(){fill(BIT0 , BIT0 + (MAXN << 2) , 1);}
void add(int pos , int w , int tp){
pos += 2 * N + 1;
if(tp == -1) w = poww(w , MOD - 2);
while(pos <= (N + 1) << 2){
BIT0[pos] = 1ll * BIT0[pos] * w % MOD;
BIT1[pos] += tp;
pos += lowbit(pos);
}
}
PII get(int pos){
pos += 2 * N + 1;
int tms = 1 , sum = 0;
while(pos){
tms = 1ll * tms * BIT0[pos] % MOD;
sum += BIT1[pos];
pos -= lowbit(pos);
}
return PII(tms , sum);
}
}BIT1 , BIT2; inline void addEd(int a , int b , int c , int d){
Ed[++cntEd] = (Edge){b , head[a] , c , d};
head[a] = cntEd;
} void getSz(int x){
vis[x] = 1; ++nowSz;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end]) getSz(Ed[i].end);
vis[x] = 0;
} int getRt(int x){
vis[x] = 1;
int sz = 1 , maxSz = 0;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end]){
int t = getRt(Ed[i].end);
sz += t; maxSz = max(maxSz , t);
}
maxSz = max(maxSz , nowSz - sz);
if(minSz > maxSz){
minSz = maxSz;
minInd = x;
}
vis[x] = 0;
return sz;
} void addNd(int x , int w , int colR , int colB , int tp){
sum = 1ll * sum * w % MOD; ++cnt;
BIT1.add(2 * colR - colB , w , tp);
BIT2.add(2 * colB - colR , w , tp);
vis[x] = 1;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end])
addNd(Ed[i].end , 1ll * w * Ed[i].w % MOD , colR + Ed[i].col , colB + !Ed[i].col , tp);
vis[x] = 0;
} void qryNd(int x , int w , int colR , int colB){
if(2 * colB >= colR && 2 * colR >= colB)
ans = 1ll * ans * w % MOD;
ans = 1ll * ans * sum % MOD * poww(w , cnt) % MOD;
PII p = BIT1.get(colB - 2 * colR - 1) , q = BIT2.get(colR - 2 * colB - 1);
ans = 1ll * ans * poww(1ll * p.st * q.st % MOD * poww(w , p.nd + q.nd) % MOD , MOD - 2) % MOD;
vis[x] = 1;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end])
qryNd(Ed[i].end , 1ll * w * Ed[i].w % MOD , colR + Ed[i].col , colB + !Ed[i].col);
vis[x] = 0;
} void solve(int x){
nowSz = cnt = 0; sum = 1; minSz = 1e9;
getSz(x); getRt(x); x = minInd;
vis[x] = 1;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end]){
qryNd(Ed[i].end , Ed[i].w , Ed[i].col , !Ed[i].col);
addNd(Ed[i].end , Ed[i].w , Ed[i].col , !Ed[i].col , 1);
}
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end])
addNd(Ed[i].end , Ed[i].w , Ed[i].col , !Ed[i].col , -1);
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(!vis[Ed[i].end])
solve(Ed[i].end);
} int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
N = read();
for(int i = 1 ; i < N ; ++i){
int a = read() , b = read() , w = read() , col = read();
addEd(a , b , w , col); addEd(b , a , w , col);
}
ans = 1;
solve(1);
cout << ans;
return 0;
}

CF833D Red-Black Cobweb 点分治、树状数组的更多相关文章

  1. BZOJ_3262_陌上花开_CDQ分治+树状数组

    BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...

  2. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  3. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  4. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  5. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  6. BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组

    BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...

  7. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  8. BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组

    BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description        给定N个数对(xi, yi),求最长上升子 ...

  9. BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组

    BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...

  10. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

随机推荐

  1. 小程序实践(五):for循环绑定item的点击事件

    微信展示列表效果借助于 wx:for  简单写一个列表(wxml文件中): 对应的数据源(js文件中): 写一个点击监听: 效果: 以上.可以实现列表的item点击效果,但是无法到点击的item对应的 ...

  2. git 入门教程之忽略文件

    忽略文件 "并不是所有的牛奶都叫特仑苏",在版本控制系统中也有相似的表达,那就是"并不是所有的文件都需要提交". 有的是因为没必要提交,比如日志文件,系统缓存文 ...

  3. git 入门教程之变基合并

    git 鼓励大量使用分支---"早建分支!多用分支!",这是因为即便创建再多的分支也不会造成存储或内存开销,并且分支的作用有助于我们分解逻辑工作,这样一样其实比维护单一臃肿分支要简 ...

  4. sublime使用Package Control不能正常使用的解决办法

    标签: Sublime作为一款非常优秀的编辑器,套用中学语文课本里一篇讲梁启超的文章里形容梁启超的一句话,就是“短小精悍”.说它“短小”,是因为它的轻量级:说它“精悍”,则得益于它那包罗万象以适用于任 ...

  5. 如何在 Flickr 上找到又酷,又有趣,且版权自由的照片?

    [编者按]本文作者为 Alex Walker,主要介绍在 Flickr 上进行照片搜索时的一些技巧.本文系国内 ITOM 管理平台 OneAPM 编译呈现. 我们一直都在寻找新奇的,与众不同的设计.图 ...

  6. ORACLE获取SQL绑定变量值的方法总结

      本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法,在SQL优化调优过程中,经常会用到这方面的知识点.在此梳理.总结一下,方面日后查找.翻阅. 方法1:查询V$SQL V$SQL视图中 ...

  7. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

  8. adb错误处理

    C:\Users\****\source\****>adb connect 192.168.10.* adb server version () doesn't match this clien ...

  9. App分享之微信微博等各个社交平台的分享授权规则和常见问题

    一.新浪微博分享规则 新浪微博支持分享类型: 应用内分享也就是网页分享支持: 文字,文字+图片,要分享链接需要链接添加在text里分享 客户端分享支持:文字,图片,文字+图片,图片+文字+链接 参数说 ...

  10. Ubuntu下永久修改主机名和创建用户

    使用hostname 进行修改. 创建用户,修改密码