[Usaco2011 Dec]Grass Planting
Description
ne path between any two pastures. Bessie, a cow who loves her grazing time, often complains about ho
w there is no grass on the roads between pastures. Farmer John loves Bessie very much, and today he
is finally going to plant grass on the roads. He will do so using a procedure consisting of M steps
.
At each step one of two things will happen:
- FJ will choose two pastures, and plant a patch of grass along each road in between the two pastures, or,
- Bessie will ask about how many patches of grass on a particular road, and Farmer John must answer her question.
Farmer John is a very poor counter -- help him answer Bessie's questions!
大致题意: 维护一棵树,支持两种操作:
P x y x到y路径上的每条边的值+1;
Q x y 询问x到y路径上所有边的值的和。
Input
Lines 2..N: Two space-separated integers describing the endpoints of a road.
Lines N+1..N+M: Line i+1 describes step i. The first character of the line is either P or Q, which d
escribes whether or not FJ is planting grass or simply querying. This is followed by two space-separ
ated integers A_i and B_i (1 ≤A_i, B_i ≤N) which describe FJ's action or query.
第一行两个正整数,N,M表示点数和操作数;
接下来N-1行每行两个数表示一条边;
接下来M行表示M个操作,每行形如P x y或Q x y。
2≤N≤100,000,1≤M≤100,000。
Output
M行,对应相应询问的答案。
Sample Input
4 6
1 4
2 4
3 4
P 2 3
P 1 3
Q 3 4
P 1 4
Q 2 4
Q 1 4
Sample Output
2
1
2
来写此题的一定都是学过树剖的了吧。
这道题用到了线段树的区间修改,难道真的只要在单点修改的情况下在线段树中使用lazy标记来进行区间修改就行了么
答案是否定的!!
你或许能过样例,但是肯定是红色的wa
我们知道树剖要不断的去跳重链,如果你要修改的区间不在一条重链上,那就会出错哦(样例很坑哦)
所以需要在加lazy标记的同时再不断地跳重链
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=;
int n,m,cnt,now,pre[N],f[N],nxt[N],h[N],top[N],id[N],size[N],dep[N],sum;
struct oo{int a,b,v,lazy;}s[N*];
char p[];
void dfs(int x)
{
size[x]=;
for(int i=h[x];i;i=nxt[i])
{
if(pre[i]==f[x])continue;
dep[pre[i]]=dep[x]+;
f[pre[i]]=x;
dfs(pre[i]);
size[x]+=size[pre[i]];
}
}
void dfs2(int x,int f)
{
int k=;
id[x]=++cnt;
top[x]=f;
for(int i=h[x];i;i=nxt[i])
if(size[pre[i]]>size[k]&&dep[pre[i]]>dep[x])k=pre[i];
if(!k)return ;
dfs2(k,f);
for(int i=h[x];i;i=nxt[i])
if(dep[pre[i]]>dep[x]&&pre[i]!=k)
dfs2(pre[i],pre[i]);
}
void ins(int x,int y)
{
pre[++now]=y;
nxt[now]=h[x];
h[x]=now;
}
void build(int x,int l,int r)
{
s[x].a=l,s[x].b=r;
if(l==r)return ;
build(x<<,l,l+r>>);
build(x<<|,(l+r>>)+,r);
}
void pushdown(int x)
{
int l=x<<,r=x<<|;
s[l].lazy+=s[x].lazy,s[r].lazy+=s[x].lazy;
s[l].v+=s[x].lazy*(s[l].b-s[l].a+);
s[r].v+=s[x].lazy*(s[r].b-s[r].a+);
s[x].lazy=;
}
void get(int x,int l,int r)
{
if(s[x].lazy)pushdown(x);
if(s[x].a>=l&&r>=s[x].b)
sum+=s[x].v;
else
{
int mid=s[x].a+s[x].b>>;
if(l<=mid)get(x<<,l,r);
if(r>mid)get(x<<|,l,r);
}
}
void qsum(int x,int y)
{
sum=;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
get(,id[top[x]],id[x]);
x=f[top[x]];
}
if(id[x]>id[y])swap(x,y);
get(,id[x]+,id[y]);
}
void change(int x,int l,int r)
{
if(s[x].lazy)pushdown(x);
if(l<=s[x].a&&r>=s[x].b)
{
s[x].v+=s[x].b-s[x].a+;
s[x].lazy++;
return ;
}
int mid=s[x].a+s[x].b>>;
if(l<=mid)change(x<<,l,r);
if(r>mid)change(x<<|,l,r);
s[x].v=s[x<<].v+s[x<<|].v;
}
void qchange(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(,id[top[x]],id[x]);
x=f[top[x]];
}
if(id[x]>id[y])swap(x,y);
change(,id[x]+,id[y]);
}
int main()
{
scanf("%d",&n);
scanf("%d",&m);
for(int i=,x,y;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
dfs();dfs2(,);
build(,,n);
for(int i=,x,y;i<=m;i++)
{
scanf("%s%d%d",p+,&x,&y);
if(p[]=='Q')
{
qsum(x,y);
printf("%d\n",sum);
}
if(p[]=='P')qchange(x,y);
}
}
[Usaco2011 Dec]Grass Planting的更多相关文章
- USACO Grass Planting
洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送 ...
- spoj - Grass Planting(树链剖分模板题)
Grass Planting 题意 给出一棵树,树有边权.每次给出节点 (u, v) ,有两种操作:1. 把 u 到 v 路径上所有边的权值加 1.2. 查询 u 到 v 的权值之和. 分析 如果这些 ...
- 洛谷P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- [USACO11DEC] Grass Planting (树链剖分)
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- AC日记——[USACO11DEC]牧草种植Grass Planting 洛谷 P3038
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)
54 种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...
- 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting(树链剖分)
题解:仍然是无脑树剖,要注意一下边权,然而这种没有初始边权的题目其实和点权也没什么区别了 代码如下: #include<cstdio> #include<vector> #in ...
随机推荐
- javascript JSON.parse和eval的区别
SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...
- Android Studio 模拟器无法打开 emulator: ERROR: x86 emulation currently requires hardware
首先要打开SDK的下载位置,找到以下陌路: android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe ...
- RobotFramework教程使用笔记——Selenium2Library库
selenium之前已经学习介绍过了,它是一个支持多语言.多平台.多浏览器的web自动化测试框架,在robotframework中也可以导入selenium库来进行web自动化测试.它使用seleni ...
- 自动化测试框架selenium+java+TestNG——配置篇
最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...
- html5--3.15 textarea元素
html5--3.15 textarea元素 学习要点 掌握textarea元素的使用 textarea元素 用来建立多行输入文本框 元素标签中的内容将一文本框默认值的形式呈现 不仅可以用在表单中,也 ...
- Rsync+Inotify同步
rsync服务安装与<rsync+sersync同步>环境一样! 安装inotify-tools 在源服务器10.10.2.191上操作: 1.查看服务器内核是否支持inotify ll ...
- ubuntu中使用gensim+word2vec[备忘]
python版本: 2.7.12 0. 安装python和pip 1. 用pip依次安装: numpy, cython,scipy,pattern,word2vec 五个工具包 2. 用pip安装ge ...
- java前三天
JDK :开发 JRE:运行 JVM:运行环境(跨平台) 注释:推荐使用第二种方式设置环境变量 nopad++ :设置 注释:1字节等于8位,也就等于2的8次方 2字节等于16位,也就等于2的16次方 ...
- hdu 3507 Print Article —— 斜率优化DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...
- 3.19 YARN HA架构及(RM/NM) Restart讲解
一.ResourceManager HA ResourceManager(RM)负责跟踪集群中的资源,以及调度应用程序(例如,MapReduce作业). 在Hadoop 2.4之前,ResourceM ...