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

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

一开始想着二维线段树+二次换根来着,然而空间不够并且强制在线

然后就想到了一个比较好的计算方式,详见
就是类似这个统计距离和的方法,不过这次是有边权的,区间修改的话,预处理路径的长度就好了
然后发现还是不好做,看题解去
然后看到了动态点分治(本人过弱,听懂了就是不会写代码,就一直搁着)
还好有拿那个思路写的,先树链剖分用颗主席树维护就好了,才发现可以将年龄那一维用主席树前缀和处理掉
但是空间依然很紧,用一下标记永久化(太久没写标记永久化了,写了好久才写对)
代码:

#include
#include
#include
using namespace std;void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1; for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;}#define rg registerconst int maxn=2e5+10;long long ss[maxn],dis[maxn],sum[maxn*30],lastans,s[maxn];int pre[maxn*2],nxt[maxn*2],h[maxn],v[maxn*2],cnt,tot,f[maxn],ans;int n,m,A,dep[maxn],size[maxn],w[maxn],top[maxn],id[maxn],tmp;int rt[maxn],ls[maxn*30],rs[maxn*30],tag[maxn*30];struct oo{int x,id;}a[maxn];bool cmp(oo a,oo b){return a.x
dep[x]&&size[pre[i]]>size[k])k=pre[i]; if(!k)return ;dfs1(k,ff); for(rg int i=h[x];i;i=nxt[i]) if(dep[pre[i]]>dep[x]&&pre[i]!=k)dfs1(pre[i],pre[i]);}void change(int x,int &k,int l,int r,int a,int b,int id){ k=++tot,ls[k]=ls[x],rs[k]=rs[x],tag[k]=tag[x],sum[k]=sum[x]; if(a<=l&&b>=r){tag[k]++;return ;} int mid=(l+r)>>1;sum[k]+=ss[min(r,b)]-ss[max(l,a)-1]; if(a<=mid)change(ls[x],ls[k],l,mid,a,b,id); if(b>mid)change(rs[x],rs[k],mid+1,r,a,b,id);}void modify(int k,int x,int y){ while(top[x]!=top[y]) { if(dep[top[x]]
id[y])swap(x,y); change(rt[k],rt[k],1,n,id[x],id[y],k);}long long get(int x,int &k,int l,int r,int a,int b,int now){ long long ans=0,mid=(l+r)>>1; if(a<=l&&b>=r)return (now+tag[k]-tag[x])*(ss[r]-ss[l-1])+sum[k]-sum[x]; if(a<=mid)ans+=get(ls[x],ls[k],l,mid,a,b,now+tag[k]-tag[x]); if(b>mid)ans+=get(rs[x],rs[k],mid+1,r,a,b,now+tag[k]-tag[x]); return ans;}long long qsum(int a,int b,int x,int y){ long long ans=0; while(top[x]!=top[y]) { if(dep[top[x]]
id[y])swap(x,y); ans+=get(rt[a],rt[b],1,n,id[x],id[y],0); return ans;}signed main(){ read(n),read(m),read(A); for(rg int i=1;i<=n;i++)read(a[i].x),a[i].id=i,w[i]=a[i].x; for(rg int i=1,x,y,z;i

转载于:https://www.cnblogs.com/lcxer/p/10574062.html

你可能感兴趣的文章
spring security 11种过滤器介绍
查看>>
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>