UOJ 58 BZOJ 3052 [wc2013] 糖果公园
来源:互联网 发布:linux执行sh脚本 编辑:程序博客网 时间:2024/04/27 03:30
Candyland 有一座糖果公园,公园里不仅有美丽的风景、好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩。
糖果公园的结构十分奇特,它由
糖果公园所发放的糖果种类非常丰富,总共
来到公园里游玩的游客都不喜欢走回头路,他们总是从某个特定的游览点出发前往另一个特定的游览点,并游览途中的景点,这条路线一定是唯一的。他们经过每个游览点,都可以品尝到一颗对应种类的糖果。
大家对不同类型的糖果的喜爱程度都不尽相同。根据游客们的反馈打分,我们得到了糖果的美味指数,第
当然,公园中每个糖果发放点所发放的糖果种类不一定是一成不变的。有时,一些糖果点所发放的糖果种类可能会更改(也只会是
糖果公园的工作人员小 A 接到了一个任务,那就是根据公园最近的数据统计出每位游客游玩公园的愉悦指数。但数学不好的小 A 一看到密密麻麻的数字就觉得头晕,作为小 A 最好的朋友,你决定帮他一把。
输入格式
第一行包含三个正整数
第二行包含
第三行包含
第四行到第
第
接下来
若
若
输出格式
按照输入的先后顺序,对于每个
样例一
input
4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2
output
841312784
限制与约定
对于所有的数据,
祝大家一遍 AC,求不虐萌萌哒测评机!
时间限制:
空间限制:
下载
样例数据下载
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~树上带修莫队~
和苹果树差不多,就是计数不太一样,而且因为有个修改,所以我们要给修改和询问加上一个时间标记。
按块把询问排序,第一关键字x的pos值,第二关键字y的pos值,第三关键字时间。(pos[x]<=pos[y])
然后需要考虑的就是时间递增的xy的递推,和无修改莫队一样;主要的是时间减小的递推比较麻烦。
这就相当于一个回溯的过程,所以我们在输入修改的时候就记录下修改前该位置的值,这样回溯就相当于把值改回去,与前面递推的部分是一样的。
pow(i,j)太神奇了,还能是小数的小数次方!
w[i],v[i],a[i],c[i],ans[i]以及记录目前答案的now都要开long long!
更新的时候忘了更新x和y导致WA了很久……以后写莫队的时候要注意呀!
(另这道题是卡评测利器啊2333)
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;#define ll long longint n,m,q,k,tot1,fi[100001],ne[200001],w[200001],fa[100001][18],dep[100001],pos[100001];int stk[100001],cnt,top,tot,jin,nowtime,num[100001];bool b[100001];ll ans[100001],now,vv[100001],ww[1000001],a[100001],c[100001];struct node{int x,y,id,time;}que[100001];struct node1{int x,y,last;}ch[100001];ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void add(int u,int v){w[++cnt]=v;ne[cnt]=fi[u];fi[u]=cnt;w[++cnt]=u;ne[cnt]=fi[v];fi[v]=cnt;}void dfs(int u){for(int i=1;(1<<i)<=dep[u];i++) fa[u][i]=fa[fa[u][i-1]][i-1];int now=top;for(int i=fi[u];i;i=ne[i]) if(w[i]!=fa[u][0]) { fa[w[i]][0]=u;dep[w[i]]=dep[u]+1; dfs(w[i]); if(top-now>=jin) { tot++; while(top>now) pos[stk[top--]]=tot; } }stk[++top]=u;}int lca(int u,int v){if(dep[u]<dep[v]) swap(u,v);int now=dep[u]-dep[v];for(int i=0;i<=17;i++) if((1<<i)&now) u=fa[u][i];if(u==v) return u;for(int i=17;~i;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];return fa[u][0];}bool operator < (node u,node v){if(pos[u.x]==pos[v.x]) return pos[u.y]==pos[v.y] ? u.time<v.time:pos[u.y]<pos[v.y];return pos[u.x]<pos[v.x];}void xo(int u){if(b[u]) now-=vv[a[u]]*ww[num[a[u]]--];else now+=vv[a[u]]*ww[++num[a[u]]];b[u]^=1;}void chancol(int u,int v){if(b[u]){xo(u);a[u]=v;xo(u);}else a[u]=v;}void chan(int u,int v){while(u!=v) if(dep[u]>dep[v]) xo(u),u=fa[u][0];else xo(v),v=fa[v][0];}int main(){n=read();m=read();q=read();for(int i=1;i<=m;i++) vv[i]=read();for(int i=1;i<=n;i++) ww[i]=read();for(int i=1;i<n;i++) add(read(),read());jin=pow(n,2.0/3)*0.5;dfs(1);while(top) pos[stk[top--]]=tot;for(int i=1;i<=n;i++) a[i]=c[i]=read();for(int i=1;i<=q;i++){k=read();if(k){que[++tot1].x=read(),que[tot1].y=read(),que[tot1].id=tot1,que[tot1].time=nowtime;if(pos[que[tot1].x]>pos[que[tot1].y]) swap(que[tot1].x,que[tot1].y);}else{ch[++nowtime].x=read(),ch[nowtime].y=read();ch[nowtime].last=c[ch[nowtime].x];c[ch[nowtime].x]=ch[nowtime].y;}}q=tot1;sort(que+1,que+q+1);int x=1,y=1,time=1;for(int i=1;i<=q;i++){if(que[i].x!=x) chan(que[i].x,x),x=que[i].x;if(que[i].y!=y) chan(que[i].y,y),y=que[i].y;for(;time-1>que[i].time;time--) chancol(ch[time-1].x,ch[time-1].last);for(;time<=que[i].time && time<=nowtime;time++) chancol(ch[time].x,ch[time].y);k=lca(x,y);xo(k);ans[que[i].id]=now;xo(k);}for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);return 0;}
- UOJ 58 BZOJ 3052 [wc2013] 糖果公园
- UOJ 58 [WC2013]糖果公园
- bzoj 3052: [wc2013]糖果公园
- 【BZOJ 3052】 [wc2013]糖果公园
- 【bzoj 3052】: [wc2013]糖果公园
- BZOJ 3052: [wc2013]糖果公园
- bzoj 3052 [wc2013]糖果公园
- uoj#58. 【WC2013】糖果公园
- BZOJ 3052: [wc2013]糖果公园【树上带修莫队
- 3052: [wc2013]糖果公园
- BZOJ 3052 WC2013 糖果公园 带修改树上莫队
- BZOJ 3052 [wc2013]糖果公园 树上莫队
- [BZOJ 3052][wc2013]糖果公园:树上带修改莫队
- BZOJ 3052: [wc2013]糖果公园 树上莫队
- [UOJ]#58. 【WC2013】糖果公园 树上带修改莫队
- [wc2013]糖果公园
- bzoj3052: [wc2013]糖果公园
- BZOJ3052: [wc2013]糖果公园
- linux--c++多文件编程
- 如何理解和使用Java package包
- TCP/IP三次握手与四次挥手
- python——类——类对象
- java异常 Unsupported major.minor version 51.0
- UOJ 58 BZOJ 3052 [wc2013] 糖果公园
- SVN提交出现这个提示: is scheduled for addition, but is missing
- 排序算法之冒泡排序
- 关于 Linux Ubuntu的shadowsocks 安装配置
- Docfx文档生成器基本使用
- centos 7.X 升级 python3(带修复yum)
- python——类——元类对象
- 线程的创建pthread_create()函数(线程一)
- C++面向过程与面向对象的区别