ONTAK 2010 aut
Autostrady
https://szkopul.edu.pl/problemset/problem/f2dSBM7JteWHqtmVejMWe1bW/site/?key=statement
题意:
首先给定一棵树,除了n-1条树边以外,还有m条非树边。每次询问两个点的满足以下条件的路径条数。
- 不能走树上u到v的简单路径的边。
- 只能走一条非树边。
分析:
RMQ求LCA + 线段树合并。
问题转化为有多少边的一个端点在u的子树内,另一个在v的子树内。
每个询问只在深度大的询问加入深度小的。对每个节点建立一个权值线段树,dfs从叶子节点往上合并,每到一个节点询问一段区间的数。
如果询问一个是另一个的祖先,要特判。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define pa pair<int,int>
#define mp(a,b) make_pair(a,b)
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int deth[N], id[N], siz[N], ans[N * ], Time_Index, n; // ans[N * 5] !!!
vector<int> adj[N], ext[N];
vector< pa > q[N]; namespace LCA{
int ord[N << ], d[N << ], p[N], f[N << ][], Log[N << ], tot = ;
void dfs(int u,int fa,int dep) {
ord[++ tot] = u; d[tot] = dep;
p[u] = tot;
for (int i=,sz=adj[u].size(); i<sz; ++i) {
int v = adj[u][i];
if (v == fa) continue;
dfs(v, u, dep + );
ord[++tot] = u; d[tot] = dep;
}
}
void init() {
Log[] = -;
for (int i=; i<=tot; ++i)
f[i][] = i, Log[i] = Log[i >> ] + ; // i<<1 !!!
for (int j=; j<=Log[tot]; ++j) {
for (int i=; (i+(<<j)-)<=tot; ++i) {
int x = f[i][j - ], y = f[i+(<<(j-))][j - ]; // j-1 !!!
f[i][j] = d[x] < d[y] ? x : y;
}
}
}
int Lca(int u,int v) {
u = p[u], v = p[v];
if (u > v) swap(u, v);
int k = Log[v - u + ];
int x = f[u][k], y = f[v-(<<k)+][k];
return d[x] < d[y] ? ord[x] : ord[y];
}
void Main() {
tot = ; dfs(, , ); init();
}
} namespace SegmentTree{
queue<int> s;
int sum[N * ], ls[N * ], rs[N * ], tot;
int NewNode() {
int k;
if (!s.empty()) k = s.front(), s.pop();
else k = ++tot;
sum[k] = ls[k] = rs[k] = ;
return k;
}
void Insert(int l,int r,int &rt,int p) {
if (!rt) rt = NewNode();
if (l == r) {
sum[rt] ++; return ;
}
int mid = (l + r) >> ;
if (p <= mid) Insert(l, mid, ls[rt], p);
else Insert(mid + , r, rs[rt], p);
sum[rt] = sum[ls[rt]] + sum[rs[rt]];
}
int query(int l,int r,int rt,int L,int R) {
if (!rt) return ; // !!!
if (L <= l && r <= R) return sum[rt];
int mid = (l + r) >> , res = ;
if (L <= mid) res = query(l, mid, ls[rt], L, R);
if (R > mid) res += query(mid + , r, rs[rt], L, R);
return res;
}
int Merge(int x,int y) {
if (!x || !y) return x + y;
ls[x] = Merge(ls[x], ls[y]);
rs[x] = Merge(rs[x], rs[y]);
sum[x] = sum[x] + sum[y]; // sum[x] = sum[ls[x]] + sum[rs[x]]; !!!
s.push(y);
return x;
}
int solve(int u,int fa) {
int rt = NewNode();
for (int i=,sz=adj[u].size(); i<sz; ++i)
if (adj[u][i] != fa) rt = Merge(rt, solve(adj[u][i], u));
for (int i=,sz=ext[u].size(); i<sz; ++i)
Insert(, n, rt, id[ext[u][i]]);
for (int i=,sz=q[u].size(); i<sz; ++i) {
int v = q[u][i].first;
if (LCA::Lca(u, v) == v) {
for (int t,j=; j<adj[v].size(); ++j)
if ((t=adj[v][j]) == LCA::Lca(u, t) && deth[t] > deth[v]) {// deth[t] > deth[v] !!!
ans[q[u][i].second] = query(, n, rt, , n) - query(, n, rt, id[t], id[t] + siz[t] - );
break;
}
}
else ans[q[u][i].second] = query(, n, rt, id[v], id[v] + siz[v] - );
}
return rt;
}
}
void dfs(int u,int fa) {
deth[u] = deth[fa] + ;
siz[u] = ;
id[u] = ++Time_Index;
for (int i=,sz=adj[u].size(); i<sz; ++i) {
int v = adj[u][i];
if (v == fa) continue;
dfs(v, u);
siz[u] += siz[v];
}
} int main() {
n = read();
for (int i=; i<n; ++i) {
int u = read(), v = read();
adj[u].push_back(v), adj[v].push_back(u);
}
int m = read();
for (int i=; i<=m; ++i) {
int u = read(), v = read();
ext[u].push_back(v), ext[v].push_back(u);
}
dfs(, );
int Q = read();
for (int i=; i<=Q; ++i) {
int u = read(), v = read();
if (deth[u] > deth[v]) q[u].push_back(mp(v,i));
else q[v].push_back(mp(u, i));
}
LCA::Main();
SegmentTree::solve(, );
for (int i=; i<=Q; ++i)
printf("%d\n", ans[i] + );
return ;
}
ONTAK 2010 aut的更多相关文章
- 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树
sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...
- OI知识点/得分技巧的归纳总结
网络流 拆点/拆边技巧 题目来源 bzoj1070 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
- 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”
注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...
- How to accept Track changes in Microsoft Word 2010?
"Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)
[入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date 周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...
- c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9
今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...
- Sharepoint 2010、Sharepoint 2013浏览器打开CAD(.dwg)
客户端配置 1.安装FreeDWGViewer.exe,设置浏览器查看 2.检查ActiveX插件是否已安装成功 服务端配置 1.开启许可模式或者通过脚本将"application/acad ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
随机推荐
- 阅读HandlerInterceptor接口源码的理解
一.阅读接口类注释 我先理解的方法,方法都看懂了类注释自然而然明白了.所以此处略. 二.阅读preHandle()方法注释 Intercept the execution of a handler. ...
- 【剑指offer】数组中的逆序对
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27520535 转载请注明出处:http:// ...
- mysql中与 in 相反的语句 find_in_set('数据',字段名)
在 mysql 中,我们经常用 in 来查询众多数据中是否有数据表字段中的值: 如果我们在数据表的字段中添加了很多值,然后查询某个值是否是这个字段中众多值的一个时可以用 find_in_set('数据 ...
- 优化器,sgd,adam等
https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于 ...
- python查看微信消息撤回
准备环境 python语言环境 python解释器-pycharm itchat介绍 itchat是一个开源的微信个人号接口,通过itchat可以实现微信(好友或微信群)的信息处理,包括文本.图片.小 ...
- VC MFC工具栏(CToolBar)控件(转)
工具栏 工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建, ...
- 利用SQL模糊匹配来验证字段是否是日期格式
最近需要验证数据仓库某个字段是否转化成某种日期格式,比如时间戳格式 ‘2016-05-03 23:21:35.0‘, 但是DB2不支持REGEXP_LIKE(匹配)函数,所以需要重新想其他办法. 最后 ...
- DU1525 Euclid's Game 博弈
HDU1525 Euclid's Game 博弈 题意 给定两个数字 a, b. 每次只能用 较大的值 减去 较小的值的倍数, 两个人轮流进行操作, 第一个得到 0 的胜利. 分析 对于 a == b ...
- 微信小程序,搜索结果关键词高亮 wxml不能动态识别html标签
wxml中使用rich-text标签放置动态html标签 js:
- 编译问题: "ld: duplicate symbol _OBJC_METACLASS_$_XXX..."
在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in ...