点此看题面

大致题意: 一棵树,每个节点有一个人,他打水需要\(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的宿舍(树上莫队+树状数组)的更多相关文章

  1. bzoj3236 作业 莫队+树状数组

    莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  2. BZOJ_3289_Mato的文件管理_莫队+树状数组

    BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...

  3. 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 ...

  4. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  5. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  6. 51nod 1290 Counting Diff Pairs | 莫队 树状数组

    51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...

  7. HihoCoder 1488 : 排队接水(莫队+树状数组)

    描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...

  8. BZOJ 3236 莫队+树状数组

    思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...

  9. BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)

    传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...

随机推荐

  1. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) -- 样例(6)

    managed-schema 样例: <?xml version="1.0" encoding="UTF-8" ?> <!-- License ...

  2. cf811C(预处理&dp)

    题目链接: http://codeforces.com/problemset/problem/811/C 题意: 给一个有n个人排队上车,去相同地方的人要么坐在同一个车厢,要不就不上车,问最大舒适度和 ...

  3. 自定义进度条PictureProgressBar——从开发到开源发布全过程

    自定义进度条PictureProgressBar——从开发到开源发布全过程 出处: 炎之铠邮箱:yanzhikai_yjk@qq.com 本文原创,转载请注明本出处! 本项目JCenter地址:htt ...

  4. spark sql 导出数据

    如果用户希望在spark sql 中,执行某个sql 后,将其结果集保存到本地,并且指定csv 或者 json 格式,在 beeline 中,实现起来很麻烦.通常的做法是将其create table ...

  5. OJDBC版本区别:ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别

    classes12.jar - for Java 1.2 and 1.3ojdbc14.jar - for Java 1.4 and 1.5ojdbc5.jar - for Java 1.5ojdbc ...

  6. 洛谷 P1536 村村通(并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1536 思路: 这道题可以看出是并查集的思想,然后用一个while嵌套一下,输入一条路的两个端点,就 ...

  7. Hadoop实战:用Hadoop处理Excel通话记录

    项目需求 有博主与家庭成员之间的通话记录一份,存储在Excel文件中,如下面的数据集所示.我们需要基于这份数据,统计每个月每个家庭成员给自己打电话的次数,并按月份输出到不同文件夹. 数据集 下面是部分 ...

  8. 【Lua】Lua中ipair和pair的区别

    pairs会遍历table的所有键值对. 而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历.顺便说下,记忆也很简单,带i的就是根据int ...

  9. matlab 文件打开设置

    平台 macOS MATLAB 版本 matlab 2017a 需要设置文件打开编码的情况 从windows平台迁移过来的.m文件的编码格式是GB2312的, 而macOS的MATLAB默认是UTF- ...

  10. hdu 5489——Removed Interval——————【删除一段区间后的LIS】

    Removed Interval Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...