【BZOJ1103】大都市 解题报告
题目传送门
打算5分钟写完题解
题目大意
有一棵n个点的有根树, 初始时每条边均为红色,有两种操作:
- 把某条边染为蓝色
- 统计根到某一点路径上的红边数量
思路
- 用\(a_i\)表示根到点i路径上的红边数,修改边(u,v)时,不失一般性,设\(dep(u) < dep(v)\),那么以v为根的子树中,所有\(a_i\)都要减1。用线段树点查区改。
- 用黑科技欧拉序,不失一般性,设\(dep(u) < dep(v)\),把边(u,v)的颜色下放到点v,线段树/树状数组点改区查即可。
关于欧拉序:算法导论中的DFS序好像就叫欧拉序,它有一个优越的性质:根到任意一点的路径对应欧拉序上的一段前缀区间
易错点
- 树状数组维护的范围是\([1,2n]\),而不是\([1,n]\)
- 无向边数组开2倍
代码
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 250007;
int n, m, C[maxn << 1];
int stamp, dep[maxn], tid[maxn], tif[maxn];
bool vis[maxn];
int edgenum, head[maxn], Next[maxn << 1], vet[maxn << 1];
inline void addedge(int u, int v){
++edgenum;
vet[edgenum] = v;
Next[edgenum] = head[u];
head[u] = edgenum;
}
void DFS(int u, int D){
//printf("%d\n", u);
vis[u] = true; tid[u] = ++stamp; dep[u] = D;
for (int e = head[u]; e; e = Next[e]){
int v = vet[e];
if (!vis[v]) DFS(v, D+1);
}
tif[u] = ++stamp;
}
inline void add(int i, int val){
for (; i <= n+n; i += (i & (-i)))
C[i] += val;
}
inline int sum(int i){
int res = 0;
for (; i >= 1; i -= (i & (-i)))
res += C[i];
return res;
}
int main(){
scanf("%d", &n);
for (int i = 1; i < n; ++i){
int u, v;
scanf("%d%d", &u, &v);
addedge(u,v);
addedge(v,u);
}
DFS(1, 1);
for (int i = 2; i <= n; ++i){
add(tid[i], +1);
add(tif[i], -1);
}
scanf("%d", &m);
for (int i = 1; i <= n + m - 1; ++i){
char T[2];
scanf("%s", T);
if (T[0] == 'A'){
int u,v;
scanf("%d%d", &u, &v);
if (dep[u] > dep[v]) swap(u, v);
add(tid[v], -1); add(tif[v], +1);
}else{
int a;
scanf("%d", &a);
printf("%d\n", sum(tid[a]));
}
}
return 0;
}
【BZOJ1103】大都市 解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 存储与服务器的连接方式对比(DAS,NAS,SAN)
存储分类简介 磁盘存储市场上,存储分类根据服务器类型分为:封闭系统的存储和开放系统的存储,封闭系统主要指大型机,AS400等服务器,开放系统指基于包括Windows.UNIX.Linux等操作系统的服 ...
- python 爬虫之beautifulsoup(bs4)环境准备
环境准备: bs4安装方法:https://blog.csdn.net/Bibabu135766/article/details/81662981 requests安装方法:https://blog. ...
- cacti报警邮件的设置
众所周知,用Linux系统自带的sendmail发送邮件是有限制的,可能对有些邮箱无法正常发送,导致报警邮件不能够及时发送到,因此就可能会产生不必要的麻烦!对此,我们可以用其他方法来发送邮件,就是在c ...
- 机器学习 - 正则化L1 L2
L1 L2 Regularization 表示方式: $L_2\text{ regularization term} = ||\boldsymbol w||_2^2 = {w_1^2 + w_2^2 ...
- DirectX11 With Windows SDK--09 纹理映射与采样器状态
前言 在之前的DirectX SDK中,纹理的读取使用的是D3DX11CreateShaderResourceViewFromFile函数,现在在Windows SDK中已经没有这些函数,我们需要找到 ...
- 第十三节: EF的三种模式(三) 之 来自数据库的CodeFirst模式
一. 简介 [来自数据库的Code First模式]实质上并不是CodeFirst模式,而是DBFirst模式的轻量级版本,在该模式中取消了edmx模型和T4模板,直接生成了EF上下文和相应的类,该模 ...
- SpringBoot系列: Pebble模板引擎
===============================Java 模板引擎选择===============================SpringBoot Starter项目向导中可选的J ...
- Java部分概念理解
第1部分 方法 1.1 方法基本概念 1) 方法:用于封装一段特定功能代码,尽可能一个方法至只实现一个基本功能,相当于C语言中的函数: 2) 方法可以多次调用: 3) 避免代码冗余,便于维护,便于团队 ...
- 使用VS的生成事件命令行指令将生成的exe,dll文件复制到指定文件夹中
VS预生成事件命令行 和 生成后事件命令行 宏说明 $(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”). $(OutDir) ...
- [译]Ocelot - Claims Transformation
原文 用户授权后才能使用此功能. 用户获得授权后claims将被发送到claims transformation中间件.用户授权后,我们首先调用claims to headers middleware ...