BZOJ 3460 Jc的宿舍
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3460
题意:一棵树。每个节点住一个人,这个人打水的时间为Ti。每次查询一个路径。这个路径上的人都去一个水管前打水。总的最小等待时间。
思路:在树的DFS序中分块。
const int N=200005;
struct node
{
int x,y,lca,flag,id;
int t;
};
vector<node> b;
vector<int> g[N];
vector<pair<int,int> > Q[N];
int n,m,key,d[N];
int S[N],id;
int mp[N],pos[N][2];
int get(int x)
{
if(S[x]!=x) S[x]=get(S[x]);
return S[x];
}
int visit[N];
void dfs(int u,int pre)
{
pos[u][0]=++id;
mp[id]=u;
int i;
for(i=0;i<SZ(g[u]);i++)
{
int v=g[u][i];
if(v==pre) continue;
dfs(v,u);
S[v]=u;
}
pos[u][1]=++id;
mp[id]=u;
visit[u]=1;
for(i=0;i<SZ(Q[u]);i++)
{
int v=Q[u][i].first;
int id=Q[u][i].second;
if(visit[v]) b[id].lca=get(v);
}
}
i64 ans[N][2];
int M;
int MM;
int cmp(node a,node b)
{
if(a.x/MM!=b.x/MM) return a.x<b.x;
if((a.x/MM)&1) return a.y>b.y;
return a.y<b.y;
}
int dp[N];
i64 A[N],B[N];
i64 suma(int x)
{
i64 ans=0;
while(x<N) ans+=A[x],x+=x&-x;
return ans;
}
i64 sumb(int x)
{
i64 ans=0;
while(x) ans+=B[x],x-=x&-x;
return ans;
}
i64 Ans;
int qp[N];
void add(int x)
{
int j;
for(j=d[mp[x]];j;j-=j&-j) A[j]+=qp[mp[x]];
if(qp[mp[x]]==-1) Ans-=sumb(d[mp[x]]);
for(j=d[mp[x]];j<=n;j+=j&-j) B[j]+=(i64)dp[d[mp[x]]]*qp[mp[x]];
Ans+=suma(d[mp[x]]+1)*dp[d[mp[x]]]*qp[mp[x]];
if(qp[mp[x]]==1) Ans+=sumb(d[mp[x]]);
qp[mp[x]]*=-1;
}
void deal()
{
MM=sqrt(2*n);
sort(b.begin(),b.end(),cmp);
int L=1,R=0;
int i;
for(i=0;i<N;i++) qp[i]=1;
for(i=0;i<SZ(b);i++)
{
int ll=b[i].x;
int rr=b[i].y;
int id=b[i].id;
int t=b[i].t;
while(R<rr) add(++R);
while(R>rr) add(R--);
while(L<ll) add(L++);
while(L>ll) add(--L);
if(b[i].flag) add(pos[b[i].lca][0]);
ans[id][t]=Ans;
if(b[i].flag) add(pos[b[i].lca][0]);
}
}
int main()
{
n=getInt();
m=getInt();
key=getInt();
int i;
for(i=1;i<=n;i++) d[i]=getInt(),dp[i]=d[i];
sort(dp+1,dp+n+1);
M=unique(dp+1,dp+n+1)-(dp+1);
for(i=1;i<=n;i++) d[i]=lower_bound(dp+1,dp+M+1,d[i])-dp;
int root;
for(i=1;i<=n;i++)
{
int x=getInt();
if(!x) root=i;
else g[x].pb(i),g[i].pb(x);
}
int cnt=0;
for(i=1;i<=m;i++)
{
char op[5];
scanf("%s",op);
if(op[0]=='C') root=getInt();
else
{
int x=getInt();
node a;
a.x=x%n+1;
a.y=root;
a.id=i;
a.t=0;
b.pb(a); Q[a.x].pb(MP(a.y,cnt)),Q[a.y].pb(MP(a.x,cnt)); cnt++;
a.x=(x+key)%n+1;
a.y=root;
a.id=i;
a.t=1;
b.pb(a); Q[a.x].pb(MP(a.y,cnt)),Q[a.y].pb(MP(a.x,cnt)); cnt++;
}
}
for(i=1;i<=n;i++) S[i]=i;
dfs(1,0);
for(i=0;i<SZ(b);i++)
{
if(b[i].y==b[i].lca) swap(b[i].x,b[i].y);
if(b[i].x==b[i].lca)
{
b[i].flag=0;
b[i].x=pos[b[i].x][0];
b[i].y=pos[b[i].y][0];
continue;
}
if(pos[b[i].x][1]>pos[b[i].y][0]) swap(b[i].x,b[i].y);
b[i].x=pos[b[i].x][1];
b[i].y=pos[b[i].y][0];
b[i].flag=1;
}
clr(ans,-1);
deal();
int last=0;
for(i=1;i<=m;i++) if(ans[i][0]!=-1||ans[i][1]!=-1)
{
printf("%lld\n",ans[i][last&1]);
last=ans[i][last&1];
}
}
BZOJ 3460 Jc的宿舍的更多相关文章
- [BZOJ3460] Jc的宿舍
bzoj 题面放一下 Description WC2014后无数人来膜拜jc,但是来膜拜的人实在太多了, 而且很多人是一连膜拜好几天.所以jc给这些人建了一座树 形的宿舍,而根节点(1号节点)住着jc ...
- BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]
3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...
- BZOJ 3640: JC的小苹果
3640: JC的小苹果 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 425 Solved: 155[Submit][Status][Discus ...
- BZOJ 3640 JC的小苹果(逆矩阵)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...
- ●BZOJ 3640 JC的小苹果
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3640题解: 期望dp,高斯消元 设dp[i][h]在i位置且血量为h这个状态的期望经过次数. ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- #YCB#待做题目与填坑资料
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- RMAN备份演练初级篇
前面我们已经知道了如何进入rman,以及rman的一些基本命令,相信大家定会觉着rman操作的简单,事实也确实如此,但万不要因此小视rman的强大,简单往往意味着灵活,灵活对于那些有心人则意味着主动权 ...
- 初级node+express建站
我的建站经历. 我建站的原因也很简单,就仅仅想有一个linux服务器玩一玩,但是还没有想到要怎么玩,就先搭建一个web服务吧.因为我工作的时候可能会用到. 我就从头开始讲起走. 先买了个云服务器,选择 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON HWindow Overlayer 1
zw版[转发·台湾nvp系列Delphi例程]HALCON HWindow Overlayer 1 ------------------------------------HALCON HWindow ...
- Android NDK 开发(二) -- 从Hlello World学起【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719 上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...
- Spring使用p名称空间配置属性
给XML配置文件"减肥"的另一个选择就是使用p名称空间,从 2.0开始,Spring支持使用名称空间的可扩展配置格式.这些名称空间都是基于一种XML Schema定义.事实上,我们 ...
- ecshop第一讲之安装
今天开始对Ectouch做一些研究,但是发现网上资源很少,而且官网对服务都需收费:并且提供的wiki.官方文档等都是空的,瞬间感觉,,,,后来开始海量搜索,最后发现只有论坛还有些东西可以看看,并对海量 ...
- destoon短信接口修改方法
destoon是很优秀的B2B行业站程序.程序模块化开发契合度很高,二次开发起来也很顺畅.数据缓存,权限分配,SEO功能方面都不错. 但是在使用这套程序的时候,常常要用到发送短信的功能,而destoo ...
- 如何检查失败的Segment/master
在启用Mirror情况下,可能出现Segment失败时,系统不会中断服务,而且没有明确提示.检查系统状态的一种方法就是使用gpstate命令.该命令会列出GPDB系统中每个独立组件(Primary I ...
- Java 流程控制语句
java的流程控制: 1.顺序结构 2.选择结构 a.关系运算.逻辑运算.条件运算 b.if语句 c.if-else语句.if - else if -else语句 d.switch语句. 3.循环语句 ...
- 类型引起的bug
1.当类型是整型时 $type = 12; 2.当类型是字符型 $type = '12';