日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=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 3e52n2e5,1ai?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_ij=1i?ai?modaj?+j=1i?aj?modai?

對于這倆式子的不取模的時候貢獻,第一個是查詢[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 \rfloorai?modaj?=ai??aj???aj?ai???,對于后面的下取整的式子我們顯然可以直接整除分塊,但是這樣會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 逆向思维 + 树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。