【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间。
伪·强制在线
这题看似强制在线,但实际上,\(pre\ mod\ 2\)只能为\(0\)或\(1\),因此只要将两种情况下的答案都求出来,最后视情况输出即可。
这样就可以用离线算法乱搞了。
树上莫队+树状数组
其实,这道题是可以用树上莫队来做的。
考虑当前已有若干人要去打水,现在新加入一个人,他的打水时间为\(x\),求改变的贡献值。
显然,根据贪心的思想,我们应让打水时间越久的人越早打水。
则设有\(rk\)个人打水时间\(>x\),\(val\)为打水时间\(\le x\)的人打水时间总和,则这个人所需等待时间为\((rk+1)*x+val\)。
不难发现,\(rk\)和\(val\)两个值是可以用树状数组来进行维护的。
这样这题就做完了。
代码
#include<bits/stdc++.h>
#define N 50000
#define LL long long
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
#define swap(x,y) (x^=y^=x^=y)
using namespace std;
int n,query_tot,key,ee,a[N+5],lnk[N+5];
struct edge
{
int to,nxt;
}e[(N<<1)+5];
class Class_FIO
{
private:
#define Fsize 100000
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,Fsize,stdin),A==B)?EOF:*A++)
#define pc(ch) (void)(FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,Fsize,stdout),Fout[(FoutSize=0)++]=ch))
int Top,FoutSize;char ch,*A,*B,Fin[Fsize],Fout[Fsize],Stack[Fsize];
public:
Class_FIO() {A=B=Fin;}
inline void read(int &x) {x=0;while(!isdigit(ch=tc()));while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));}
inline void readc(char &x) {while(isspace(x=tc()));}
inline void writeln(LL x) {if(!x) return pc('0'),pc('\n');while(x) Stack[++Top]=x%10+48,x/=10;while(Top) pc(Stack[Top--]);pc('\n');}
inline void clear() {fwrite(Fout,1,FoutSize,stdout),FoutSize=0;}
}F;
class Class_CaptainMotao_on_Tree//树上莫队
{
private:
#define bp(x) (((x)-1)/S+1)
#define F5(x) ((v=Di.get_val(a[t=x]),op[t]^=1)?(res+=1LL*(T.QSize(Di.cnt)-T.QSize(v)+1)*a[t]+T.QSum(v),T.Add(v,1,a[t]),0):(T.Add(v,-1,-a[t]),res-=1LL*(T.QSize(Di.cnt)-T.QSize(v)+1)*a[t]+T.QSum(v)))
int Q,S,op[N+5];LL ans[N+5][2];char opt[N+5];
class Class_Dfser//DFS预处理
{
private:
#define LogN 16
int cnt,Depth[N+5],fa[N+5][LogN+5];
public:
int s[(N<<1)+5],I[N+5],O[N+5];
inline void Init(int x=1,int lst=0)
{
register int i;
for(s[I[x]=++cnt]=x,i=1;i<=LogN;++i) fa[x][i]=fa[fa[x][i-1]][i-1];
for(i=lnk[x];i;i=e[i].nxt) e[i].to^lst&&(Depth[e[i].to]=Depth[fa[e[i].to][0]=x]+1,Init(e[i].to,x),0);
s[O[x]=++cnt]=x;
}
inline int LCA(int x,int y)
{
register int i;
for(Depth[x]<Depth[y]&&swap(x,y),i=0;Depth[x]^Depth[y];++i) ((Depth[x]^Depth[y])&(1<<i))&&(x=fa[x][i]);
if(!(x^y)) return x;
for(i=LogN;~i;--i) fa[x][i]^fa[y][i]&&(x=fa[x][i],y=fa[y][i]);
return fa[x][0];
}
}D;
class Class_Discretization//离散化
{
private:
int data[N+5];
public:
int cnt;
inline void Init(int len,int *num)
{
for(register int i=1;i<=len;++i) data[i]=num[i];
sort(data+1,data+len+1),cnt=unique(data+1,data+len+1)-data-1;
}
inline int get_val(int x)
{
register int l=1,r=cnt,mid;
for(mid=l+r>>1;l<=r;mid=l+r>>1) data[mid]<x?l=mid+1:r=mid-1;
return l;
}
}Di;
class Class_TreeArray//树状数组
{
private:
#define lowbit(x) (x&-x)
int Size[N+5];LL Sum[N+5];
public:
int len;
inline void Add(int pos,int val1,int val2) {while(pos<=len) Size[pos]+=val1,Sum[pos]+=val2,pos+=lowbit(pos);}
inline int QSize(int pos,int res=0) {while(pos) res+=Size[pos],pos-=lowbit(pos);return res;}
inline LL QSum(int pos,LL res=0) {while(pos) res+=Sum[pos],pos-=lowbit(pos);return res;}
}T;
struct Query
{
int l,r,pos,op,bl,flag;
Query(int x=0,int y=0,int p=0,int o=0,int b=0,int f=0):l(x),r(y),pos(p),op(o),bl(b),flag(f){}
inline friend bool operator < (Query x,Query y) {return x.bl^y.bl?x.bl<y.bl:(x.bl&1?x.r<y.r:x.r>y.r);}
}q[(N<<1)+5];
public:
inline void Solve()
{
int i,x,y,z,k,s=1,t,v,L=1,R=0;LL res=0,lst_ans=0;
for(D.Init(),Di.Init(n,a),T.len=Di.cnt,S=sqrt(n),i=1;i<=query_tot;++i)//每个询问分pre%2的值存储两个
{
if(F.readc(opt[i]),F.read(k),opt[i]^'Q') {s=k;continue;}
D.I[x=k%n+1]>D.I[y=s]&&swap(x,y),q[++Q]=(z=D.LCA(x,y))^x?Query(D.O[x],D.I[y],i,0,bp(D.O[x]),z):Query(D.I[x],D.I[y],i,0,bp(D.I[x]),0);
D.I[x=(k+key)%n+1]>D.I[y=s]&&swap(x,y),q[++Q]=(z=D.LCA(x,y))^x?Query(D.O[x],D.I[y],i,1,bp(D.O[x]),z):Query(D.I[x],D.I[y],i,1,bp(D.I[x]),0);
}
for(sort(q+1,q+Q+1),i=1;i<=Q;++i)//处理询问
{
while(R<q[i].r) F5(D.s[++R]);while(L>q[i].l) F5(D.s[--L]);while(R>q[i].r) F5(D.s[R--]);while(L<q[i].l) F5(D.s[L++]);
q[i].flag&&F5(q[i].flag),ans[q[i].pos][q[i].op]=res,q[i].flag&&F5(q[i].flag);
}
for(i=1;i<=query_tot;++i) opt[i]^'C'&&(F.writeln(lst_ans=ans[i][lst_ans&1]),0);//输出答案
}
}C;
int main()
{
register int i,x,y;register char op;
for(F.read(n),F.read(query_tot),F.read(key),i=1;i<=n;++i) F.read(a[i]);
for(i=1;i<=n;++i) F.read(x),add(x,i);
return C.Solve(),F.clear(),0;
}
【BZOJ3460】Jc的宿舍(树上莫队+树状数组)的更多相关文章
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- HihoCoder 1488 : 排队接水(莫队+树状数组)
描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...
- BZOJ 3236 莫队+树状数组
思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...
随机推荐
- Go:一个可能导致锁失效的坑
先看代码: package main import( "sync" ) var hclock sync.RWMutex func main() { a := make(map[in ...
- 对于多线程程序,单核cpu与多核cpu是怎么工作的
此文中的大部分资料来自于网络上,我只是觉得把有道理的整理一下,方便以后查阅. 1.多线程在单核和多核CPU上的执行效率问题的讨论a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执 ...
- ASP.NET对象
ASP.NET有五个基本的常用对象 一张图胜过前言万语 ASP.NET对象重头戏 对象名 解释 属性 方法 例子 Request 获取客户端数据信息 1.UserAgent:用来获取客户端浏览器 ...
- 设计模式——懒汉式单例类PK饿汉式单例类
前言 我们都知道生活中好多小软件,有的支持多IP在线,有的仅仅局限于单个IP在线.为什么这样设计,在软件开发阶段就是,有需求就是发展.这就是软件开发的一个设计模式--懒汉式单例类和饿汉式单例类. 内容 ...
- 水库(树形dp)
水库 (树形dp) R国有n座城市和n-1条长度为1的双向道路,每条双向道路连接两座城市,城市之间均相互连通.现在你需要维护R国的供水系统.你可以在一些城市修建水库,在第i个城市修建水库需要每年c_i ...
- 清北刷题冲刺 11-03 a.m
纸牌 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 使用shell脚本分析Nagios的status.dat文件
前言 Nagios的安装和配置以及批量添加监控服务器在我前面的文章中已经讲的很详细了. 我们知道,Nagios的网页控制页面(一般为http://nagio.domain.com/nagios)里可以 ...
- CentOS编译安装GCC 4.9.2成功
在Linux上编译安装gcc是个寻烦恼的活,对于像我这样习惯于在Windows上面使用二进制安装包的人来说,自已编译安装gcc是个相当大的挑战,今天直接挑战最新版的gcc,是4.9.2版本的,做之前查 ...
- MySQL服务器与MySQL57服务器区别与不同处在哪里,他们各自的领域范围,能不能同时启动服务?
安装了MySQL-5.7.18.0版本数据库,版本中包含了MySQL Workbench可视化试图工具,在服务列表栏中会有MySQL的两个服务器:如果启动第一项MySQL服务器就只能操作数据库,外界不 ...
- VUE中嵌套路由
官网地址:https://router.vuejs.org/zh-cn/essentials/nested-routes.html 路由嵌套一般使用在后台管理系统中 给一个比较简单的小案例 <! ...