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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势

發布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

文章目錄

  • 題意:
  • 思路:

題意:

給你一個長度為nnn的序列aaa,讓你計算

n≤4e5,a≤1e7n\le 4e5,a\le 1e7n4e5,a1e7

思路:

首先這個式子是n2n^2n2的,顯然不能直接算,并且異或沒有分配律,所以碰到這種情況我們自然的就想到按位考慮。
分開考慮每一位,假設當前為第kkk位,當這一位是111的時候,兩個數的和一定在[2k,2k+1?1][2^k,2^{k+1}-1][2k,2k+1?1]之間,由于有可能會溢出,比如全是111的情況相加,所以還有可能在[2k+2k+1,2k+2?2][2^k+2^{k+1},2^{k+2}-2][2k+2k+1,2k+2?2]之間,我們可以取出來每個數模上2k+12^{k+1}2k+1之后的數,將他們排個序,之后雙指針掃一遍,注意要倒著掃才能保證正確性,算一下有多少對在這一位有貢獻的,讓后看奇偶性就好啦。
直接做的復雜度顯然是nlognloganlognloganlognloga,這個題顯然是能過去的,但是我們可以再優化一下它。
考慮到枚舉每一位是不能優化掉的,我們對排序進行優化。
觀察可以知道我們每次都只考慮某一位之前的數,并且每次都增加一位,所以我們每次只執行一次快排,因為對于新增加的一位我們能將其分成兩部分,這一位如果是111就放在右邊,否則放在左邊,讓后雙指針掃一下就可以排出序來了。
復雜度nloganloganloga。

// Problem: D. Present // Contest: Codeforces - Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) // URL: https://codeforces.com/contest/1323/problem/D // Memory Limit: 512 MB // Time Limit: 3000 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> #define X first #define Y second #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=1000010,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n; int a[N],b[N]; int ans=0; int L[N],R[N],Lid[N],Rid[N],id[N];int get(int L,int R) {if(L>R) return 0;int ans=0;for(int i=n,l=1,r=1;i>=1;i--) {while(l<=n&&b[l]+b[i]<L) l++;while(r<=n&&b[r]+b[i]<=R) r++;ans+=r-l-(l<=i&&i<r);}return ans>>1&1; }void merge(int k) {int l,r; l=r=0;for(int i=1;i<=n;i++) {if(a[id[i]]>>k&1) R[++r]=b[i]|(1<<k),Rid[r]=id[i];else L[++l]=b[i],Lid[l]=id[i];}int p1=1,p2=1,p=1;while(p1<=l&&p2<=r) {if(L[p1]<=R[p2]) b[p]=L[p1],id[p++]=Lid[p1++];else b[p]=R[p2],id[p++]=Rid[p2++];}while(p1<=l) b[p]=L[p1],id[p++]=Lid[p1++];while(p2<=r) b[p]=R[p2],id[p++]=Rid[p2++]; }int calc(int x) {merge(x);return (get(1<<x,(1<<(x+1))-1)+get(3<<x,(1<<(x+2))-2))%2; }int main() { // ios::sync_with_stdio(false); // cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]),id[i]=i;for(int i=0;i<25;i++) ans+=calc(i)<<i;printf("%d\n",ans);return 0; } /**/

總結

以上是生活随笔為你收集整理的Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势的全部內容,希望文章能夠幫你解決所遇到的問題。

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