洛谷$P$3066 逃跑的$BarnRunning\ Away\ From…$ $[USACO12DEC]$ 主席树
正解:主席树
解题报告:
1551做$dp$实在是做不下去了,,,于是来水点儿别的题$QAQ$
然后这题,挺纸老虎的我$jio$得,,,看起来很难的样子然后仔细想下之后发现依然是个板子呢,,,$QwQ$
首先显然先树剖昂$QwQ$,然后子树内这个条件就变成了在某给定区间$[l,r]$内嘛
然后考虑这个所谓,距离$\leq x$怎么处理呢,不难想到先预处理出每个点距离根节点的$dis$,然后就变成了,求在$(dis_{u},dis_{u}+x]$这个范围内的数字有多少
欧克然后就成功板子掉辣$QwQ$
记得离散化,,,我之前没注意到$dis$和$l$的范围疯狂$MLE$调了半个小时才发现这个问题,,,被自己蠢到了$kk$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define int long long
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define lb(x) lower_bound(st+1,st+sum+1,x)-st
#define ub(x) upper_bound(st+1,st+sum+1,x)-st
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+,inf=1e18+;
int n,l,head[N],ed_cnt,dfn[N],low[N],rk[N],dfn_cnt,sum,dis[N],rt[N],nod_cnt,st[N];
struct ed{int to,nxt,wei;}edge[N];
struct node{int l,r,num;}tr[N<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;}
void dfs(ri x)
{
rk[dfn[x]=low[x]=++dfn_cnt]=x;
e(i,x)st[++sum]=dis[t(i)]=dis[x]+w(i),dfs(t(i)),low[x]=low[t(i)];
}
int modify(ri d,ri l,ri r,ri dat)
{
ri nw=++nod_cnt;tr[nw]=tr[d];if(l==r)return ++tr[nw].num,nw;
ri mid=(l+r)>>;mid>=dat?tr[nw].l=modify(tr[d].l,l,mid,dat):tr[nw].r=modify(tr[d].r,mid+,r,dat);
tr[nw].num=tr[tr[nw].l].num+tr[tr[nw].r].num;return nw;
}
int query(ri rt_l,ri rt_r,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return tr[rt_r].num-tr[rt_l].num;
ri mid=(l+r)>>,ret=;
if(mid>=to_l)ret+=query(tr[rt_l].l,tr[rt_r].l,l,mid,to_l,to_r);
if(mid<to_r)ret+=query(tr[rt_l].r,tr[rt_r].r,mid+,r,to_l,to_r);
return ret;
} signed main()
{
//freopen("3066.in","r",stdin);freopen("3066.out","w",stdout);
n=read();l=read();rp(i,,n){ri x=read(),len=read();ad(i,x,len);}
dfs();st[++sum]=inf;st[++sum]=;sort(st+,st++sum);sum=unique(st+,st++sum)-st-;
rp(i,,n)rt[i]=modify(rt[i-],,sum,lb(dis[rk[i]]));
rp(i,,n)printf("%lld\n",query(rt[dfn[i]-],rt[low[i]],,sum,lb(dis[i]),lb(dis[i]+l+)-));
return ;
}
随机推荐
- PHP笔试题(11道题)详解
题目一 <?php echo -10%3; ?> 答案:-1. 考查:优先级. 因为-的优先级比%求余的优先级低, 也就是-(10%3). 2 题目二: print (int)pow(2, ...
- 自定义View系列教程03--onLayout源码详尽分析
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- Python中json和eval的区别
>>> import json >>> s = '{"one":1,"two":2}' >>> json. ...
- 树状数组(Binary Index Tree)
一维BIT(单点更新,区间求和): Problem - 1166 #include <iostream> #include <algorithm> #include <c ...
- 2018-9-4-Roslyn-通过-nuget-统一管理信息
title author date CreateTime categories Roslyn 通过 nuget 统一管理信息 lindexi 2018-09-04 08:55:19 +0800 201 ...
- @topcoder - SRM697D1L3@ ConnectedStates
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有n个城市,每个城市有个权值wi,任意两个城市i,j之间的道路数 ...
- springmvc 返回json数据给前台jsp页面展示
spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json 优点:不需要自己再处理 步骤一:在spring- ...
- 条件随机场(CRF) - 3 - 概率计算问题
声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...
- 下推栈实现(c++编程思想 p136)
1 头文件Stack.h #ifndef STACK_H #define STACK_H struct Stack { struct Link { void* data; Link* next; vo ...
- [转]VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)
源码地址:https://github.com/YANGKANG01/Spring-Boot-Demo 安装扩展 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.spr ...