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 ...
随机推荐
- json和字符串/数组/集合的互相转换の神操作总结
一:前端字符串转JSON的4种方式 1,eval方式解析,恐怕这是最早的解析方式了. function strToJson(str){ var json = eval('(' + str + ')') ...
- PAT乙级 1020. 月饼 (25)(只得到23分)
1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食 ...
- 必备的 Java 参考资源列表(转)
包含必备书籍.站点.博客.活动等参考资源的完整清单级别: 初级 Ted Neward, 主管,ThoughtWorks, Neward & Associates 2009 年 3 月 02 日 ...
- JAVA 集合List,数组,Set,Map,直接的相互转换
Java集合转换[List<-->数组.List<-->Set.数组<-->Set.Map-->Set.Map-->List] //List--> ...
- Sublime Text使用教程【转】
本文转载自:http://lucida.me/blog/sublime-text-complete-guide/ 摘要(Abstract) 本文系统全面的介绍了 Sublime Text,旨在成为最优 ...
- 一个基于和围绕Docker生态环境构建的早期项目列表
https://blog.docker.com/2013/07/docker-projects-from-the-docker-community/
- scala多个构造函数的定义方法
直接上代码: package com.test.scalaw.test.demo /** * scala定义多个构造函数, * 另外,Scala中有只有一个主要构造函数,其他都是辅助构造函数.而且需要 ...
- C#(winform)浏览按钮
FolderBrowserDialog folderBrowser = new FolderBrowserDialog(); //folderBrowser.SelectedPa ...
- React笔记_(7)_react路由
路由 路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程. 路由器当然是作为一个转发设备出现的,主要是转发数据包来实现网络互联. 那么react的路由到底指的是什么呢? 举个 ...
- 《C++标准库》
函数对象 使用bind时注意,占位符有自己的命名空间std::placeholders,如果不在程序开始处using std::placeholders,那么就要写成: std::bind(std:: ...