真是道好题。。。感到灵魂的升华。。。


按dfs序建树状数组,拿前缀和去求解散块;

按点的标号分块,分成一个个区间,记录区间子树和 的 总和。。。

具体地,需要记录每个点u修改后,对每一个块i的贡献,记为t[u][i]

计算思路:dfs时,每到一个新的点,就让++c[其所在块],为了记录每个块中的点出现过几次,就相当于记录这个点 被每一块中的点 包含了几次 , 然后for一遍,记录t[u][i]=c[i]

当修改一个点时,这个块的和+=这个点u对块i的贡献*这个点的变化量,即sum[i]+=t[u][i]*(v-a[u]);

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #define ll unsigned long long
  5. #define R register ll
  6. using namespace std;
  7. const int N=;
  8. inline ll g() {
  9. R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
  10. do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
  11. }
  12. int n,m,q,T,cnt,num,rt;
  13. int vr[N<<],nxt[N<<],a[N],fir[N],dfn[N],l[N],r[N],c[],t[N][],pos[N];
  14. ll w[N],sum[];
  15. inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
  16. inline int lbt(int x) {return x&-x;}
  17. inline void inc(int pos,ll d) {for(;pos<=n;pos+=lbt(pos)) w[pos]+=d;}
  18. inline ll query(int pos) { R ret=;
  19. for(;pos;pos-=lbt(pos))
  20. ret+=w[pos]; return ret;
  21. }
  22. void dfs(int u) { l[u]=++num,++c[pos[u]]; inc(num,a[u]);
  23. for(R i=;i<=pos[n];++i) t[u][i]=c[i];
  24. for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
  25. if(l[v]) continue; dfs(v);
  26. } r[u]=num,--c[pos[u]];
  27. }
  28. signed main() {
  29. n=g(),q=g(); T=sqrt(n); m=(n%T)?n/T+:n/T;
  30. for(R i=;i<=n;++i) a[i]=g(); for(R i=;i<=n;++i) pos[i]=(i-)/T+;
  31. for(R i=,u,v;i<=n;++i) {u=g(),v=g(); if(!u) rt=v; else add(u,v),add(v,u);}
  32. dfs(rt);
  33. for(R i=;i<=pos[n];++i) for(R j=(i-)*T+,lim=min(i*T,(ll)n);j<=lim;++j) sum[i]+=query(r[j])-query(l[j]-);
  34. for(R i=;i<=q;++i) {
  35. R k=g(),u=g(),v=g();
  36. if(k&) {
  37. inc(l[u],v-a[u]);
  38. for(R i=;i<=pos[n];++i) sum[i]+=1ull*t[u][i]*(v-a[u]);
  39. a[u]=v;
  40. } else { R ret=;
  41. if(pos[u]==pos[v]) for(R i=u;i<=v;++i) ret+=query(r[i])-query(l[i]-);
  42. else {
  43. for(R i=u;i<=pos[u]*T;++i) ret+=query(r[i])-query(l[i]-);
  44. for(R i=(pos[v]-)*T+;i<=v;++i) ret+=query(r[i])-query(l[i]-);
  45. } for(R i=pos[u]+;i<pos[v];++i) ret+=sum[i]; printf("%llu\n",ret);
  46. }
  47. }
  48. }

这题真神仙。。2019.04.23

BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!的更多相关文章

  1. bzoj 4765 普通计算姬 dfs序 + 分块

    题目链接 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些.普通计算机能计算数列区间和,而普通计算姬能 ...

  2. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...

  3. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  4. BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...

  5. BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)

    本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...

  6. HDU 6203 ping ping ping(dfs序+LCA+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连 ...

  7. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  8. POJ 2763 Housewife Wind(DFS序+LCA+树状数组)

    Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11419   Accepted: 3140 D ...

  9. 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)

    题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...

随机推荐

  1. dubbo+zookeeper+dubboadmin环境搭建

    4.环境搭建 4.1.zookeeper注册中心的配置安装(在windows平台下,Linux类似,见官方文档)(Redis注册中心安装,简易注册中心安装,简易监控中心安装,见官方文档) 下载zook ...

  2. python之模块(在命令行当中使用pip install 模块来进行模块的安装)

    模块:在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位. 在我们编程的时候我们如果将所有的文件都放在那个py文件中,我们的py文件会很大,这样也很不好 ...

  3. adb device offline 解决办法

    当电脑中的豌豆荚之类的应用打开的状态下 adb devices 显示连接状态 关闭手机助手之后,adb devices总显示 device offline 后来发现sdk  platform-tool ...

  4. 3-2 zk客户端连接关闭服务端,查看znode

    使用ZooKeeper官方提供的Client来连接.路径类似的结构. 连接到我们的门户HOST. quota属于zookeeper.quota是子节点,zookeeper是父节点.quota其实是一个 ...

  5. 使用Java2D改善API的绘制效果

    ---------------siwuxie095                             工程名:TestSwingPaintAPI 包名:com.siwuxie095.swingp ...

  6. java web前端发送请求的4种方式

    表单 action, 链接href,js 绑定按钮 ajax绑定标签 <h1>通过表单提交参数</h1> <form action="/day46_v1/Ser ...

  7. 面试题:hibernate 第二天 快照 session oid 有用

    ## Hibernate第二天 ## ### 回顾与反馈 ### Hibernate第一天 1)一种思想 : ORM OM(数据库表与实体类之间的映射) RM 2)一个项目 : CRM 客户关系管理系 ...

  8. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)

    一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 package algorithms.elementar ...

  9. 1、awk打开多个文件的方法

    转载:http://www.cnblogs.com/Berryxiong/p/6209324.html 1.当awk读取的文件只有两个的时候,比较常用的有三种方法(1)awk 'NR==FNR{... ...

  10. beforeFilter()

    在控制器每个动作之前执行,可以方便地检查有效的会话,或者检查用户的权限. function beforeFilter() { parent::beforeFilter(); if(empty($thi ...