Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组
传送门
文章目录
- 题意
- 思路:
题意
给定一个不同数组成的序列aaa,定义pkp_kpk为pk=∑i=1k∑j=1kaimodajp_k=\sum_{i=1}^k\sum_{j=1}^ka_i\bmod a_jpk=∑i=1k∑j=1kaimodaj,让你对于每个i∈[1,n]i\in [1,n]i∈[1,n]求出pip_ipi。
2≤n≤2e5,1≤ai≤3e52\le n\le 2e5,1\le a_i\le 3e52≤n≤2e5,1≤ai≤3e5
思路:
考虑每次新增了什么,不难发现从pi−1p_{i-1}pi−1到pip_ipi新增了∑j=1iaimodaj+∑j=1iajmodai\sum_{j=1}^i a_i\bmod a_j+\sum_{j=1}^ia_j\bmod a_i∑j=1iaimodaj+∑j=1iajmodai。
对于这俩式子的不取模的时候贡献,第一个是查询[1,i−1][1,i-1][1,i−1]中大于aia_iai的值的个数再乘上aia_iai,第二个是查询[1,i−1][1,i-1][1,i−1]中小于aia_iai的值的和。
对于第二个式子,aia_iai固定,我们考虑枚举aia_iai的倍数,对应[0,ai),[ai,2∗ai),...[0,a_i),[a_i,2*a_i),...[0,ai),[ai,2∗ai),...,我们还是查询区间和,让后减去k∗aik*a_ik∗ai即可,其中kkk是有几个aia_iai。
对于第一个,我们考虑将其化简一下,aimodaj=ai−aj∗⌊aiaj⌋a_i\bmod a_j=a_i-a_j*\left \lfloor \frac{a_i}{a_j} \right \rflooraimodaj=ai−aj∗⌊ajai⌋,对于后面的下取整的式子我们显然可以直接整除分块,但是这样会t掉。。
直接考虑贡献不好弄,我们考虑对于每个aia_iai,我们将其对其他数的贡献存下来,也就是我们依旧枚举aia_iai的倍数,将ai,2∗ai,...a_i,2*a_i,...ai,2∗ai,...的位置都加上aia_iai,此时只需要查询[1,ai][1,a_i][1,ai]的和即可,贡献都已经放到里面了。
// Problem: F. Pairwise Modulo
// Contest: Codeforces - Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
// URL: https://codeforces.com/problemset/problem/1553/F
// Memory Limit: 256 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=600010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N];
struct BIT {LL tr[N];#define lowbit(x) (x&(-x))void add(int x,int c) {while(x<N) tr[x]+=c,x+=lowbit(x);}LL sum(int x) {if(x<=0) return 0ll;LL ans=0;// while(x) ans+=tr[x],x-=lowbit(x);for(int i=x;i;i-=lowbit(i)) ans+=tr[i];return ans;}}tr1,tr2,tr3;int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);LL ans=0,mx=*max_element(a+1,a+1+n);for(int i=1;i<=n;i++) {for(int j=0,k=a[i]-1;k<=mx*2;j++,k+=a[i]) {LL all=tr1.sum(k)-tr1.sum(max(k-a[i],0));ans+=all;ans-=1ll*j*a[i]*(tr2.sum(k)-tr2.sum(max(k-a[i],0)));}ans+=1ll*a[i]*(i-1);ans-=tr3.sum(a[i]);for(int j=a[i];j<=mx;j+=a[i]) tr3.add(j,a[i]);// for(int l=1,r;l<=a[i];l=r+1) {// r=a[i]/(a[i]/l);// int now=a[i]/l;// ans-=1ll*now*(tr1.sum(r)-tr1.sum(l-1));// }tr1.add(a[i],a[i]);tr2.add(a[i],1);printf("%lld ",ans);}puts("");return 0;
}
/**/
Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组相关推荐
- CodeForces - 1553F Pairwise Modulo(数论+树状数组)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求 pk=∑1≤i,j≤kaimodajp_k = \sum_{1 \le i, j \le k} a_i \bmod a_jpk=∑1 ...
- Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) 题号 题目 知识点 A ...
- Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝
传送门 文章目录 题意: 思路: 题意: 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n],你可以选择一个kkk,将这个排列循环右移kkk次,让后最多交换 ...
- Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)(A - D)
A 太简单了,写完就删了 B 有很多人暴力搜,或者其他方法,样例不严谨过了,然后就被hack了 #include<bits/stdc++.h> #define int long long ...
- Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) -29
自闭场,d题fst了,掉大分^^ A 题意 如果数字x的各个位数加和比x+1的大,称为一个特殊数字,问给出n,小于等于n的特殊数字个数 A 思路 这能wa1,我真服了..显然只有9,19,29,等等尾 ...
- Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set
题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...
- codeforces 7.22 F Pairwise Modulo
codeforces 7.22 F Pairwise Modulo 给出n个数的数列a,每个数互不相同且都小于3e5,求出qk=∑1<=i,j<=kaimodajq_k=\sum_{1&l ...
- codeforces1553 F. Pairwise Modulo(数学)
F. Pairwise Modulo 想到了,但又没完全想到..wtcl 首先 pk=pk−1+∑1≤i<kakmodai+∑1≤i<kaimodakp_k=p_{k-1}+\sum_{1 ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...
最新文章
- 备份恢复文件夹NTFS安全设置
- uva 129 回溯法入门
- 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL
- Effective Java之谨慎地使用本地方法(五十四)
- 『ACM-算法-二分法』算法竞赛进阶指南--在单调递增序列a中查找大于等于X的数中最小的一个,即X或X的后继
- Tracking 的SimTrack 以及 4D seg
- 网曝Facebook中国员工跳楼身亡,总部态度冷漠,华人群体抗议:为死者讨回公道...
- Ubuntu16.04下禁用scp、sftp和winscp
- Ubuntu18.04 如何解决编译objective-c出现undefined reference to objc_get_class
- 自动控制原理复习——第二章 控制系统的数学模型,系统框图简化,信号流图,梅森公式,控制系统的传递函数(详细介绍)
- 《白话大数据与机器学习》读书笔记1
- 百度人脸识别申请授权文件步骤要领
- 算法笔记.胡凡 第五章 数学问题
- 【python基础知识学习(6)】面向对象编程
- 【CTF题解NO.00008】mini-LCTF 2021 official write up by arttnba3
- KBL410-ASEMI整流桥KBL410
- Hybrid App 发展史
- java分布式任务调度 唯品会,分布式定时任务调度系统Saturn安装部署
- 思维导图局域网共享功能使用教程
- PyTorch 实现批训练和 Optimizer 优化器
热门文章
- vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
- MultiProcessing中主进程与子进程之间通过管道(Pipe)通信
- 竟然有如何奇葩的如厕方式......
- 震撼世界的基建狂魔,中国制造的超级工程到底有多牛?
- OpenAI“单手解魔方”被公开质疑,Gary Marcus称七大问题涉嫌误导
- 老师“鬼话”全曝光!哈哈哈哈哈哈全国的老师都这样吗?
- 剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?
- 12星座程序员写代码
- mendelay为什么安装不了_你为什么消防验收过不了?消防管道安装错误图集
- textjoin去重_SuperJoinText这个函数,弥补了TEXTJOIN的缺憾