铃铛计数问题 解题报告

U72118 铃铛计数问题

对点我们发现有两种编号,一种是它本身的编号用作询问,一种是便于我们子树/链的操作的重新编号。

如果对链树剖作为第二编号,把点放到二维平面内,我们就可以用个kd-tree维护,需要支持一些加和询问之类的操作,但因为有个\(\log\)段,所以实际上是\(\sqrt n\log n\)的。我寻思卡卡是可以过的。

正解是分块

我们考虑对原编号分块

\(f_{i,r}\)表示点\(i\)对块\(r\)的贡献,这个可以dp出来,从父亲那里转移。

这样我们大块询问和大块修改就可以完成了

考虑小块询问和小块修改

实际上我们需要支持询问子树和,修改单点值,要求询问\(O(1)\)

考虑放到\(dfs\)序上,就成了单点改,区间询问,然后再分一拨块就可以了

写成单点询问,区间修改比较好写


Code:

#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
#define ll long long
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{int f=0;x=0;char c=gc();while(!isdigit(c)) f|=c=='-',c=gc();while(isdigit(c)) x=x*10+c-'0',c=gc();if(f) x=-x;
}
const int N=1e5+10;
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,q,rt,yuy[N],toki[N][320],B,T,L[N],R[N],belong[N];
int dfn[N],low[N],ha[N],dfsclock;
ll sum[N];
void dfs(int now,int fa)
{dfn[now]=++dfsclock;ha[dfsclock]=now;for(int i=1;i<=T;i++) toki[now][i]=toki[fa][i]+(L[i]<=now&&now<=R[i]),sum[i]+=1ll*toki[now][i]*yuy[now];for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa)dfs(v,now);low[now]=dfsclock;
}
ll tag[N],f[N];
void modi(int x,int d)
{int pos=belong[x];for(int i=pos+1;i<=T;i++) tag[i]+=d;for(int i=x;i<=R[pos];i++) f[i]+=d;
}
ll qry(int x)
{return f[x]+tag[belong[x]];
}
int main()
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);read(n),read(q);for(int i=1;i<=n;i++) read(yuy[i]);for(int u,v,i=1;i<=n;i++){read(u),read(v);if(u) add(u,v),add(v,u);else rt=v;}B=sqrt(n)+1,T=(n-1)/B+1;for(int i=1;i<=T;i++){L[i]=R[i-1]+1,R[i]=min(i*B,n);for(int j=L[i];j<=R[i];j++)belong[j]=i;}dfs(rt,0);for(int i=1;i<=n;i++) f[i]=f[i-1]+yuy[ha[i]];for(int op,l,r,i=1;i<=q;i++){read(op),read(l),read(r);if(op==1){int d=r-yuy[l];yuy[l]=r;for(int j=1;j<=T;j++)sum[j]+=1ll*d*toki[l][j];modi(dfn[l],d);}else{int lp=belong[l],rp=belong[r];ll ans=0;if(rp-lp<=1){for(int j=l;j<=r;j++)ans+=qry(low[j])-qry(dfn[j]-1);}else{for(int j=l;j<=R[lp];j++) ans+=qry(low[j])-qry(dfn[j]-1);for(int j=lp+1;j<rp;j++) ans+=sum[j];for(int j=L[rp];j<=r;j++) ans+=qry(low[j])-qry(dfn[j]-1);}printf("%lld\n",ans);}}return 0;
}

2019.5.23

转载于:https://www.cnblogs.com/butterflydew/p/10912730.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Breadth-first Search 】513. Find Bottom Left Tree Value

输入&#xff1a;一颗二叉树 输出&#xff1a;这颗树的最下面一层最左边的节点值。 分析&#xff1a; 用BFS的思路解决最直观。读每一层&#xff0c;在每一层记录第一个元素的值。在队列中第一层&#xff1a;1&#xff1b;第二层&#xff1a;2&#xff0c;3&#xff1b;第三层…

Java:这是一份全面 详细的 Synchronized关键字 学习指南

前言 在Java中&#xff0c;有一个常被忽略 但 非常重要的关键字Synchronized今天&#xff0c;我将详细讲解 Java关键字Synchronized的所有知识&#xff0c;希望你们会喜欢目录 1. 定义 Java中的1个关键字 2. 作用 保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法…

[Leetcode][第404题][JAVA][左叶子之和][DFS][BFS]

【问题描述】[简单] 【解答思路】 1. DFS 递进思想 一步一步递进 /先序遍历求所有节点值之和 public int sumOfTrees(TreeNode root) {if (root null) {return 0;}int leave root.val;int left sumOfTrees(root.left);int right sumOfTrees(root.right);return left ri…

01背包、完全背包、多重背包

参考&#xff08;都有些错误&#xff09;&#xff1a;https://github.com/guanjunjian/Interview-Summary/blob/master/notes/algorithms/%E7%BB%8F%E5%85%B8%E7%AE%97%E6%B3%95/01%E8%83%8C%E5%8C%85.mdhttps://blog.csdn.net/na_beginning/article/details/62884939 #include…

【Breadth-first Search 】515. Find Largest Value in Each Tree Row

输入&#xff1a;一颗二叉树 输出&#xff1a;这棵树每一层的最大值。 分析&#xff1a;和513 题目一样&#xff0c;处理层次问题&#xff0c;使用BFS最直观。使用和513一样的模板&#xff0c;只是记录下该层最大值即可。 分析2&#xff1a;用DFS处理层次遍历的问题&#xff0…

第十四期: 拥有7000多万店铺和10多亿件商品的微店如何打造AI系统?

AI技术对于电商至关重要&#xff0c;但AI的实践门槛很高&#xff0c;对于创业公司尤其如此。那么电商创业公司如何打造AI系统?如何利用AI解决实际问题? 作者&#xff1a;夏剑 AI技术对于电商至关重要&#xff0c;但AI的实践门槛很高&#xff0c;对于创业公司尤其如此。那么电…

【数据结构与算法】【算法思想】位图

位图BitMap 算法 public class BitMap { // Java中char类型占16bit&#xff0c;也即是2个字节private char[] bytes;private int nbits;//nbits 总容量public BitMap(int nbits) {this.nbits nbits;this.bytes new char[nbits/161];}//长度16 k/16 定位某一段 k%16定位段中某…

js 高阶函数之柯里化

博客地址&#xff1a;https://ainyi.com/74 定义 在计算机科学中&#xff0c;柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术 就是只传递给函数…

【Breadth-first Search 】专题3

529 Minesweeper 输入&#xff1a;一个二维矩阵&#xff0c;一些修改规则。  如果点到一个隐藏的地雷M&#xff0c;把它改为X&#xff0c;游戏结束  如果点到一个E&#xff0c;且其周围8邻接的范围没有地雷&#xff0c;那么应该把8邻接的范围的格子全部翻开为E  如果翻开的…

第十五期:一个用户至少“值”100美元,美国最“贵”数据法案CCPA明年初实行!

还在急于应对欧洲GDPR&#xff08;General Data Protection Regulation&#xff0c;通用数据保护条例&#xff09;&#xff1f;那你就OUT了&#xff01; 作者&#xff1a;文摘菌 大数据文摘出品 作者&#xff1a;刘俊寰 还在急于应对欧洲GDPR(General Data Protection Regul…

【数据结构与算法】【算法思想】【推荐系统】向量空间

背景知识 欧几里得的距离公式 推荐系统方法 应用 如何实现一个简单的音乐推荐系统&#xff1f; 1. 基于相似用户做推荐 找到跟你口味偏好相似的用户&#xff0c;把他们爱听的歌曲推荐给你&#xff1b; 2. 基于相似歌曲做推荐 找出跟你喜爱的歌曲特征相似的歌曲&#x…

第十六期:AWS 瘫痪:DNS 被 DDoS 攻击了 15 个小时

AWS警告客户&#xff0c;分布式攻击严重阻碍网络连接&#xff0c;殃及众多网站和应用软件&#xff0c;云巨头AWS遭到攻击后&#xff0c;今天其部分系统实际上断。网。 作者&#xff1a;佚名来源|2019-10-23 15:17 AWS警告客户&#xff0c;分布式攻击严重阻碍网络连接&#xff…

【Breadth-first Search 】752. Open the Lock

输入&#xff1a;deadends 是指针终止状态列表&#xff0c;target 是希望到达的指针状态&#xff0c;初始化指针状态是0000。 输出&#xff1a;如果指针能够到达target状态&#xff0c;则变化的最少步骤是多少。如果不能到达target状态&#xff0c;返回-1。 分析&#xff1a;指…

Spring Security在标准登录表单中添加一个额外的字段

概述 在本文中&#xff0c;我们将通过向标准登录表单添加额外字段来实现Spring Security的自定义身份验证方案。 我们将重点关注两种不同的方法&#xff0c;以展示框架的多功能性以及我们可以使用它的灵活方式。 我们的第一种方法是一个简单的解决方案&#xff0c;专注于重用现…

【数据结构与算法】【算法思想】【MySQL数据库索引】B+树

B树特点 考虑因素 支持按照区间来查找数据 磁盘 IO 操作 N叉树 树的高度就等于每次查询数据时磁盘 IO 操作的次数 在选择 m 大小的时候&#xff0c;要尽量让每个节点的大小等于一个页的大小。读取一个节点&#xff0c;只需要一次磁盘 IO 操作。&#xff08;分裂成两个节点&am…

第十七期:2019人工智能统计数字和一些重要事实

人工智能(AI)每天在以惊人的速度发展。这项技术在2018年已经取得了巨大的成功&#xff0c;简化医疗保健业的工作流程&#xff0c;降低制造业的间接费用&#xff0c;并减少教育业的行政工作量。现在是2019年&#xff0c;每天似乎都有一家新的AI初创公司冒出来&#xff0c;致力于…

Filter和Listener

javaweb三大组件1. Filter&#xff1a;过滤器 2. Listener&#xff1a;监听器3. servlet Filter&#xff1a;过滤器 1. 概念&#xff1a;* 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、* web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可…

【Breadth-first Search 】934. Shortest Bridge

输入&#xff1a;一个二维数组&#xff0c;每个元素的值为0/1。 规则&#xff1a;所有连在一起的1是一个岛屿&#xff0c;数组中包含2个岛屿。连在一起是指上下左右4个方向。可以将0变为1&#xff0c;将2个岛屿链接在一起。 输出&#xff1a;最小改变多少个0就可以将2个岛屿链接…

[Leetcode][第78题][JAVA][子集][位运算][回溯]

【问题描述】[中等] 【解答思路】 1. 位运算 复杂度 class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] n…

第十八期:闲鱼上哪些商品抢手?Python分析后告诉你

经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能&#xff0c;都能为他们带来不错的 睡后收入。 作者&#xff1a;星安果 1.目标场景 经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能&#xff0c;都能为他们带来不错的睡后收入。 闲鱼上大量的商品&#xf…