Codeforces 852I Dating 树上莫队
随便树上莫队搞一搞就好啦。
#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0); using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < ) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} const int B = ; int n, q, depth[N], f[N], pa[N][], gender[N];
int in[N], out[N], id[N], idx, op[N];
LL ans[N];
bool flag[N];
int cnt[][N]; vector<int> oo;
vector<int> G[N]; struct Qus {
int L, R, lca, id;
bool operator < (const Qus& rhs) const {
if(L / B == rhs.L / B) return R < rhs.R;
return L < rhs.L;
}
} qus[N]; int l, r; LL ret; inline void update(int x) {
ret += op[id[x]] * cnt[gender[id[x]] ^ ][f[id[x]]];
cnt[gender[id[x]]][f[id[x]]] += op[id[x]];
op[id[x]] = -op[id[x]];
} void dfs(int u, int fa) {
depth[u] = depth[fa] + ;
pa[u][] = fa;
for(int i = ; i < ; i++)
pa[u][i] = pa[pa[u][i - ]][i - ];
id[++idx] = u;
in[u] = idx;
for(auto& v : G[u]) {
if(v == fa) continue;
dfs(v, u);
}
id[++idx] = u;
out[u] = idx;
} int getLca(int u, int v) {
if(depth[u] < depth[v]) swap(u, v);
for(int i = ; ~i; i--)
if((depth[u] - depth[v]) >> i & )
u = pa[u][i];
if(u == v) return u;
for(int i = ; ~i; i--)
if(pa[u][i] != pa[v][i])
u = pa[u][i], v = pa[v][i];
return pa[u][];
} int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &gender[i]), op[i] = ;
for(int i = ; i <= n; i++) {
scanf("%d", &f[i]);
oo.push_back(f[i]);
}
for(int i = ; i < n; i++) {
int a, b; scanf("%d%d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
sort(ALL(oo));
oo.erase(unique(ALL(oo)), oo.end());
for(int i = ; i <= n; i++)
f[i] = lower_bound(ALL(oo), f[i]) - oo.begin();
dfs(, );
scanf("%d", &q);
for(int i = ; i <= q; i++) {
int a, b, lca;
scanf("%d%d", &a, &b);
lca = getLca(a, b);
if(lca == a || lca == b) {
if(a == lca) qus[i] = Qus{in[a], in[b], a, i};
else qus[i] = Qus{in[b], in[a], b, i};
} else {
if(in[a] < in[b]) qus[i] = Qus{out[a], in[b], lca, i};
else qus[i] = Qus{out[b], in[a], lca, i};
}
}
l = , r = , ret = ;
sort(qus + , qus + + q);
for(int o = ; o <= q; o++) {
int L = qus[o].L, R = qus[o].R, lca = qus[o].lca, who = qus[o].id;
while(r < R) update(++r);
while(l > L) update(--l);
while(r > R) update(r--);
while(l < L) update(l++);
if(lca != id[L] && lca != id[R]) ans[who] = ret + cnt[gender[lca] ^ ][f[lca]];
else ans[who] = ret;
}
for(int i = ; i <= q; i++) printf("%lld\n", ans[i]);
return ;
} /*
*/
Codeforces 852I Dating 树上莫队的更多相关文章
- spoj COT2 - Count on a tree II 树上莫队
题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的, 受益匪浅.. #include <iostream> #include < ...
- 「日常训练&知识学习」莫队算法(二):树上莫队(Count on a tree II,SPOJ COT2)
题意与分析 题意是这样的,给定一颗节点有权值的树,然后给若干个询问,每次询问让你找出一条链上有多少个不同权值. 写这题之前要参看我的三个blog:Codeforces Round #326 Div. ...
- 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)
2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...
- 【BZOJ-3757】苹果树 块状树 + 树上莫队
3757: 苹果树 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1305 Solved: 503[Submit][Status][Discuss] ...
- [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】
题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...
- 树上莫队 wowow
构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) f ...
- BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]
传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...
- 【WC2013】糖果公园 [树上莫队]
题意: 一棵树,修改一个点的颜色,询问两点路径上每种颜色的权值$val[c]$*出现次数的权值$cou[w[c]]$的和 sro VFK 树上莫队 按照王室联邦的方法分块,块的大小直径个数有保证,并不 ...
- [Codeforces]852I - Dating
题目大意:给定一棵n个点的树,每个点上有一个汉子或妹子,每人有一个权值,每次询问一条链上选出一对权值相等的男女有多少种选法.(n,q<=10^5) 做法:比较显然的树上莫队,熟悉序列莫队那套理论 ...
随机推荐
- mysql如何直接查出从1开始递增的数
比如我的一个sql语句 SELECT nick_name FROM t_user ; 得到的结果是:张三李四王五 而现在我想要的结果是:1 张三2 李四3 王五 应该如何写sql呀? 答案就是用 @r ...
- app升级注意事项version
1.每次升级生成apk前,修改versionName: 位置: 2.修改数据库表中对应version字段与之对应: 3.出现waiting for debugger,要重启手机: 5.解析包错误,是a ...
- 纯js Ajax 请求
var XMLHttpReq; function createXMLHttpRequest() { if(window.ActiveXObject ) { try { XMLHttpReq = new ...
- 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)
一. IIS部署 比如在MVC框架中集成了Quartz.Net定时调度,此时该调度系统会随着MVC框架被挂在IIS下,IIS会进程回收,所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用. ...
- CSS 水平垂直居中的几种实现方法
前言 项目中经常碰到需要实现水平垂直居中的样式.下面就总结几种常用的方法 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style> ...
- Latex "Error: Extra alignment tab has been changed to \cr. "
Latex 编译时出现 Error: Extra alignment tab has been changed to \cr. 是因为\begin{tabular}后面的参数指定为7列,而实际排了8 ...
- Java部分概念理解
第1部分 方法 1.1 方法基本概念 1) 方法:用于封装一段特定功能代码,尽可能一个方法至只实现一个基本功能,相当于C语言中的函数: 2) 方法可以多次调用: 3) 避免代码冗余,便于维护,便于团队 ...
- npm cnpm yarn
npm 如何下载指定版本的组件 先确保文件目录下含有 package.json 文件, 没有的话,可以通过 npm init 创建, 然后只需要在组件的后面加上 @2.8.1 版本号即可, 例如:re ...
- Web应用程序的敏感信息-隐藏目录和文件
Web应用程序的敏感信息-隐藏目录和文件 0x1.场景 Web应用程序根文件夹中可能存在大量隐藏信息:源代码版本系统文件夹和文件(.git,.gitignore,.svn),项目配置文件(.npmrc ...
- k64 datasheet学习笔记26--Oscillator (OSC)
1.前言 OSC模块是一个晶体振荡器. 该模块使用晶体或谐振器与外部连接,为MCU产生一个参考时钟. 主要为下图红色框住的部分 2.特性和模式 Supports 32 kHz crystals (Lo ...