博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2015]开店
阅读量:4947 次
发布时间:2019-06-11

本文共 2359 字,大约阅读时间需要 7 分钟。

显然这个题不强制在线我们就有一个非常优秀的树剖做法

但是现在强制在线使得这个问题变得看起来有些难搞了

于是就变成了动态点分治的板子题了

我们先建一棵点分树,对于每一个分治重心我们存一下当前分治块内所有点到这个点的距离,用一个vector存下来

我们再存一下每个点作为分治重心的时分治块内部所有点上一级分治重心的距离

每次询问我们暴力跳点分树,在vector里二分即可

代码

#include
#include
#include
#include
#include
#define re register#define LL long long#define mp std::make_pair#define pb push_back#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))inline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}const int maxn=150005;typedef std::pair
pii;struct E{int v,nxt,w;}e[maxn<<1];int n,num,m,S,rt,cnt,A;int head[maxn],pre[maxn],vis[maxn],fa[maxn],a[maxn];int deep[maxn],b[maxn<<1],sum[maxn],mx[maxn],pos[maxn];int f[maxn<<1][20],lg[maxn<<1];inline void add(int x,int y,int w) { e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].w=w;}std::vector
son[maxn];std::vector
sg[maxn],sh[maxn];std::vector
g[maxn],h[maxn];void getpre(int x) { b[++cnt]=x;pos[x]=cnt; for(re int i=head[x];i;i=e[i].nxt) { if(deep[e[i].v]) continue; deep[e[i].v]=deep[x]+1,pre[e[i].v]=pre[x]+e[i].w; getpre(e[i].v);b[++cnt]=x; }}void getroot(int x,int f) { sum[x]=1;mx[x]=0; for(re int i=head[x];i;i=e[i].nxt) { if(vis[e[i].v]||f==e[i].v) continue; getroot(e[i].v,x);sum[x]+=sum[e[i].v]; mx[x]=max(mx[x],sum[e[i].v]); } mx[x]=max(S-sum[x],mx[x]); if(mx[x]
>1; if(g[x][mid].first<=t) l=mid+1,c=mid; else r=mid-1; } if(c!=-1) tot-=c+1,ans-=sg[x][c];}inline int LCA(int x,int y) { x=pos[x],y=pos[y]; if(x>y) std::swap(x,y); int k=lg[y-x+1]; if(deep[f[x][k]]
<
>1; if(h[x][mid].first<=t) l=mid+1,c=mid; else r=mid-1; } if(c!=-1) tot=c+1,ans+=sh[x][c]; if(p) find(p,t,tot,ans); ans+=1ll*tot*dis(x,k); p=x;x=fa[x]; } return ans;}int main() { n=read(),m=read(),A=read(); for(re int i=1;i<=n;i++) a[i]=read(); for(re int x,y,w,i=1;i
>1]+1; for(re int j=1;j<=lg[2*n];j++) for(re int i=1;i+(1<
<=2*n;i++) if(deep[f[i][j-1]]
<<(j-1))][j-1]]) f[i][j]=f[i][j-1]; else f[i][j]=f[i+(1<<(j-1))][j-1]; mx[0]=n+1,S=n,rt=0,getroot(1,0);dfs(rt); LL lst=0;int u,x,y,l,r; while(m--) { u=read(),x=read(),y=read(); l=(1ll*x+lst)%A,r=(1ll*y+lst)%A; if(l>r) std::swap(l,r); printf("%lld\n",lst=ask(u,r)-ask(u,l-1)); } return 0;}

转载于:https://www.cnblogs.com/asuldb/p/10864567.html

你可能感兴趣的文章
deque
查看>>
计算机
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
再谈“我是怎么招聘程序员的”(下)
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>