题目链接: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的宿舍的更多相关文章

  1. [BZOJ3460] Jc的宿舍

    bzoj 题面放一下 Description WC2014后无数人来膜拜jc,但是来膜拜的人实在太多了, 而且很多人是一连膜拜好几天.所以jc给这些人建了一座树 形的宿舍,而根节点(1号节点)住着jc ...

  2. BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]

    3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...

  3. BZOJ 3640: JC的小苹果

    3640: JC的小苹果 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 425  Solved: 155[Submit][Status][Discus ...

  4. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  5. ●BZOJ 3640 JC的小苹果

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3640题解: 期望dp,高斯消元 设dp[i][h]在i位置且血量为h这个状态的期望经过次数. ...

  6. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. #YCB#待做题目与填坑资料

    各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...

  9. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. 夺命雷公狗---DEDECMS----15dedecms首页栏目列表页导航部分完成

    我们在点击导航页面的连接时候我们需要我们的连接跳到指定的模版页面,而不是随便跳到一个指定的A连接标签: 所以我们首先要将前端给我们的栏目列表模版拷贝到目录下,然后就可以创建栏目列表页面了,但是名字我们 ...

  2. PAT乙级 1005. 继续(3n+1)猜想 (25)

    1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz ...

  3. [MaxOSX] 路由操作

    查看当前路由情况 netstat -nr 添加路由 sudo route -n add x.x.x.x/24 x.x.x.x 可以简单这样子理解: 第1个参数 x.x.x.x/24是远程地址 第2个参 ...

  4. Javascript之回调函数(callback)

    1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方 ...

  5. Ajax错误 “SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成” 的归纳总结

    最近在做Asp.net项目的时候,用Ajax访问服务器数据有时候老是莫名其妙的报错:SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而 ...

  6. Javascript 类与静态类的实现-js面向对象

    在Javascript里,对面向对象并没有一个直接的实现,对于代码方面也是非常的灵活. 今天所要说的就是,如何在Javascript里写类与静态类,这是本人一惯用的方法,你也可以有更为方便的,也可以发 ...

  7. scala偏函数

    package com.ming.test /** * 在Scala中,偏函数是具有类型PartialFunction[-T,+V]的一种函数.T是其接受的函数类型,V是其返回的结果类型. * 偏函数 ...

  8. [BIM]STEP标准和EXPRESS语言

    参考:http://blog.sina.com.cn/s/blog_620be62e0100iqyb.html (BIM名词和术语(四)- IFC/STEP/EXPRESS) IFC标准使用形式化的数 ...

  9. (原创)cocos2dx使用jsoncpp的正确姿势

    环境: vs2010, cocos2dx@2.1.4, win32, jsoncpp-src-0.5.0.tar.gz jsoncpp下载地址: http://sourceforge.net/proj ...

  10. ural 1114,计数dp

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1114 题意:N个盒子,a个红球,b个蓝球,把求放到盒子中去,没有任何限制,有多少种放法. ...