Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组
傳送門
文章目錄
- 題意
- 思路:
題意
給定一個不同數(shù)組成的序列aaa,定義pkp_kpk?為pk=∑i=1k∑j=1kaimodajp_k=\sum_{i=1}^k\sum_{j=1}^ka_i\bmod a_jpk?=∑i=1k?∑j=1k?ai?modaj?,讓你對于每個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
思路:
考慮每次新增了什么,不難發(fā)現(xiàn)從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=1i?ai?modaj?+∑j=1i?aj?modai?。
對于這倆式子的不取模的時候貢獻,第一個是查詢[1,i?1][1,i-1][1,i?1]中大于aia_iai?的值的個數(shù)再乘上aia_iai?,第二個是查詢[1,i?1][1,i-1][1,i?1]中小于aia_iai?的值的和。
對于第二個式子,aia_iai?固定,我們考慮枚舉aia_iai?的倍數(shù),對應[0,ai),[ai,2?ai),...[0,a_i),[a_i,2*a_i),...[0,ai?),[ai?,2?ai?),...,我們還是查詢區(qū)間和,讓后減去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 \rfloorai?modaj?=ai??aj???aj?ai???,對于后面的下取整的式子我們顯然可以直接整除分塊,但是這樣會t掉。。
直接考慮貢獻不好弄,我們考慮對于每個aia_iai?,我們將其對其他數(shù)的貢獻存下來,也就是我們依舊枚舉aia_iai?的倍數(shù),將ai,2?ai,...a_i,2*a_i,...ai?,2?ai?,...的位置都加上aia_iai?,此時只需要查詢[1,ai][1,a_i][1,ai?]的和即可,貢獻都已經(jīng)放到里面了。
// 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 逆向思维 + 树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Harbour.Space Schola
- 下一篇: 苹果手机耗电快什么原因(苹果手机突然掉电