【2020五校联考NOIP #6】三格缩进
题意:
给出 \(n\) 个数 \(a_1,a_2,\dots,a_n\),你要进行 \(m\) 次操作,每次操作有两种类型:
\(1\ p\ x\):将 \(a_p\) 改为 \(x\)。
\(2\ y\):求 \(\sum\limits_{i=1}^ny/a_i+y\%a_i\)。
\(1 \leq n,m \leq 10^5,1 \leq a_i \leq 2 \times 10^5\)。
一道水水的 T2。
考虑整除分块,不同的 \(y/a_i\) 最多只有 \(2\sqrt{200000}\) 种,并且对于所有 \(y/x=z\) 的 \(x\) 一定可以构成一个区间 \([l,r]\)。
这部分对答案的贡献就是 \(\sum\limits_{a_i \in [l,r]}z+y-a_i \times z\)。
设有 \(cnt\) 个 \(a_i \in [l,r]\),它们的和为 \(sum\)。
上述式子可以变为 \((z+y) \times cnt-z \times sum\)。
接下来我们的任务就是求出 \(cnt,sum\)。
相信一名正常人第一反应应该是树状数组,维护值为 \(x\) 的 \(a_i\) 出现了多少次。
稍加分析就可以得出时间复杂度,查询 \(m\sqrt{200000}\) 次,修改 \(m\) 次,总时间复杂度 \(\mathcal O(n\sqrt{n}\log n)\)(假设 \(n,m\) 同阶)。
出题人比较良心,放树状数组过去了。
可是作为一名 OIer,我们不能满足于现状,需要探寻更加高效的求解方法,而这,也是这道题的重头戏所在。
回顾树状数组的时间复杂度计算,发现瓶颈在询问上,要进行 \(m\sqrt{200000}\) 查询,而修改只用进行 \(m\) 次。
可我们树状数组查询和修改复杂度都是 \(\log n\) 的。修改复杂度仅仅只有 \(m \log n\)。
这启发我们使用查询复杂度 \(\mathcal O(1)\),而修改复杂度 \(\mathcal O(\sqrt{n})\) 的数据结构。
我们考虑分块。维护整块的前缀和和块内前缀和,这样查询复杂度就可以做到 \(\mathcal O(1)\) 了,而修改复杂度 \(\mathcal O(\sqrt{n})\)
本题实现非常简单,但思想比较重要。
/*
Contest: -
Problem: NFLSOJ 707
Author: tzc_wk
Time: 2020.10.15
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
typedef pair<int,int> pii;
typedef long long ll;
int n,q,a[100005];
const int BLOCK_SZ=447;
int L[453],R[453],bel[200005],blk;
struct blockstruct{
ll sum[453],blk_sum[453][453];
inline void add(int x,int v){
int t=bel[x];
for(int i=x-L[t]+1;i<=R[t]-L[t]+1;i++)
blk_sum[t][i]+=v;
for(int i=t;i<=blk;i++) sum[i]+=v;
}
inline ll query(int l,int r){
int _l=bel[l],_r=bel[r];
if(_l==_r) return blk_sum[_l][r-L[_l]+1]-blk_sum[_l][l-L[_l]];
else return blk_sum[_l][R[_l]-L[_l]+1]-blk_sum[_l][l-L[_l]]+sum[_r-1]-sum[_l]+blk_sum[_r][r-L[_r]+1];
}
} b1,b2;
int main(){
scanf("%d%d",&n,&q);
blk=448;for(int i=1;i<=blk;i++){
L[i]=(i-1)*BLOCK_SZ+1;
R[i]=min(i*BLOCK_SZ,200000);
for(int j=L[i];j<=R[i];j++) bel[j]=i;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) b1.add(a[i],1),b2.add(a[i],a[i]);
while(q--){
int opt;scanf("%d",&opt);
if(opt==1){
int p,x;scanf("%d%d",&p,&x);
b1.add(a[p],-1);b2.add(a[p],-a[p]);
a[p]=x;
b1.add(a[p],1);b2.add(a[p],a[p]);
} else {
int y;scanf("%d",&y);ll s=0;
for(int l=1,r;l<=y;l=r+1){
r=y/(y/l);
s+=b1.query(l,r)*(y/l)+y*b1.query(l,r)-b2.query(l,r)*(y/l);
// printf("%d %d %d %d\n",l,r,b1.query(l,r),b2.query(l,r));
}
s+=y*b1.query(y+1,200000);
printf("%lld\n",s);
}
}
return 0;
}
【2020五校联考NOIP #6】三格缩进的更多相关文章
- 【2020五校联考NOIP #8】自闭
题目传送门 题意: 有一个 \(n \times m\) 的矩阵,里面已经填好了 \(k\) 个非负整数. 问是否能在其它 \(n \times m-k\) 个格子里各填上一个非负整数,使得得到的矩阵 ...
- 【2020五校联考NOIP #8】狗
题面传送门 原题题号:Codeforces 883D 题意: 有 \(n\) 个位置,每个位置上要么有一条狗,要么有一根骨头,要么啥都没有. 现在你要给每个狗指定一个方向(朝左或朝右). 朝左的狗可以 ...
- 【2020五校联考NOIP #7】道路扩建
题面传送门 题意: 给出一张 \(n\) 个点 \(m\) 条边的无向图 \(G\),第 \(i\) 条边连接 \(u_i,v_i\) 两个点,权值为 \(w_i\). 你可以进行以下操作一次: 选择 ...
- 【2020五校联考NOIP #6】最佳观影
题意: 给出一个 \(k \times k\) 的网格和 \(n\) 次操作.其中 \(k\) 为奇数. 每次操作给出一个数 \(m\).每次你要找出一个三元组 \((x,l,r)\) 使得: \(r ...
- 【2020五校联考NOIP #4】今天的你依旧闪耀
题面传送门 题意: 对于一个长度为 \(n\)(\(n\) 为偶数)的排列 \(p\),定义一次"变换"后得到的排列 \(p'\) 为: \(p'_i=\begin{cases}p ...
- 【2020五校联考NOIP #3】序列
题面传送门 原题题号:Codeforces Gym 101821B 题意: 给出一个排列 \(p\),要你找出一个最长上升子序列(LIS)和一个最长下降子序列(LDS),满足它们没有公共元素.或告知无 ...
- 【2020五校联考NOIP #2】矩阵
咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...
- 【2020五校联考NOIP #7】伟大的卫国战争
题面传送门 题意: 数轴上有 \(n\) 个点,现在要在它们之间连 \(m\) 条边,第 \(i\) 条边连接 \(a_i,b_i\) 两个点. 现在你要钦定每条边连在数轴的上方还是下方,使得任意两条 ...
- 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你
[五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...
随机推荐
- 软工博客之关于CSDN的移动端软件测评
关于CSDN的移动端软件测评 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件测评作业 我在这个课程的目标 不求变强,只求做好,成为一颗有用的 ...
- 使用jave2实现将wav格式的音频转换成mp3格式
最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件. ...
- 表单编辑时el-form的validate方法执行无效,阻塞代码运行 - Element UI踩坑记录
今天在用element-ui写管理后台需求时,遇到一个奇怪的问题 一个正常带校验的表单,在新增列表数据时表单校验功能正常: 但是在新增之后再去编辑数据时,表单校验却失效了,甚至阻塞了后续的代码执行,控 ...
- C/C++编程笔记:浪漫流星雨表白装b程序
作为一个未来可能会成为一个专业程序员的小伙们,不知道你们现在学到哪里了,学了点东西之后有没有想在你女朋友面前装个大大的b呢,今天小编就给你一个机会来研究一下下边的代码吧,保证大写的N,当然大佬是排除在 ...
- Educational Codeforces Round 113 (Rated for Div. 2)题解
\(A,B,C\)顺利签到,还是在\(D\)上面卡住了,之后在睡前还是想出来了,看来还是自己的思维不够敏捷和成熟... D. Inconvenient Pairs 简化题意,在一个直角坐标系中,有一些 ...
- Django settings.py设置 DEBUG=False后静态文件无法加载解决
解决办法: settings.py 文件 DEBUG = False STATIC_ROOT = os.path.join(BASE_DIR,'static') #新增 urls.py文件(项目的) ...
- shell 脚本控制命令的执行顺序
&&,||,(),{},& 五个符号的运用shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. 也 ...
- Docker的centos镜像内无法使用systemctl命令的解决办法
在Docker官方的centos镜像内无法使用systemctl命令的解决办法, 使用该命令docker报错 Failed to get D-Bus connection: Operation not ...
- Java 17 新功能介绍(LTS)
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...
- Jmeter二次开发实现自定义functions函数(九)
在Jmeter->选项->函数助手对话框中我们可以看到Jmeter内置的一些常用函数,但考虑到测试过程中的实际情况,我们经常需要在脚本引用或者实现自定义的函数.那么如何在"函数助 ...