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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Inna and Binary Logic

發(fā)布時(shí)間:2024/6/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Inna and Binary Logic 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Codeforces Round #234 (Div. 2)?E:http://codeforces.com/problemset/problem/400/E

題意:給你n個(gè)數(shù),然后每相鄰的兩個(gè)數(shù)可以通過and運(yùn)算生成一個(gè)新的數(shù),然后這些新生成的n-1個(gè)數(shù)每相鄰的兩個(gè)數(shù)又通過and運(yùn)算成n-2個(gè)數(shù),最后只會(huì)剩下一個(gè)數(shù),然后讓你求這n(n+1)/2個(gè)數(shù)的和,然后每一次會(huì)更新最底層的某個(gè)數(shù),然后操作之后,輸出剛才的總和。

題解:這一題,雖然是看題解,然后自己敲出來的,但是還是有點(diǎn)成就感和收獲。首先,這一題的思路很巧妙。如果所有的數(shù)都是1或者0,加入說序列是1110001,通過計(jì)算,發(fā)現(xiàn)其實(shí)和就是(3+1)*3/2+(1+1)*1/2==7,與連續(xù)1的個(gè)數(shù)有關(guān),加入連續(xù)1的個(gè)數(shù)是x,那么這連續(xù)的x個(gè)1,形成的和就是(x+1)*x/2;總和就是把所有連續(xù)的1和相加。想到這里,就可以知道,數(shù)的范圍是1e5,最多是2^17,所以可以把每個(gè)數(shù)拆成17位,每一位要么是0或者是1,這樣只要統(tǒng)計(jì)底層的連續(xù)1有多少就可以了。num[i][j]表示第j個(gè)數(shù)的第i位,一開始我們可以計(jì)算出總和,然后更新時(shí),如果更新數(shù)的這一位和原來相同則這一位不用變化,否則,如果是1要0,可以把a(bǔ)ns先減去原來連續(xù)個(gè)一所形成的和,然后加上這個(gè)數(shù)左邊連續(xù)1的和以及右邊連續(xù)1的和,然后把這一位變成0,如果是0變1,則相反。這一要注意數(shù)據(jù)范圍,在過程中有可能爆int,所以要用long long,并且在求和過程中使用的局部變量也要用long long,由于自己沒有注意到這樣的問題結(jié)果wa 2發(fā),int和long long之間轉(zhuǎn)換出了問題。也許,有人會(huì)問這樣會(huì)不會(huì)t,首先事實(shí)上沒有t,而且跑的很快。從理論上講,也不會(huì),因?yàn)橐霈F(xiàn)很長(zhǎng)的連續(xù)的1是很難的,必須保證這個(gè)連續(xù)的數(shù)在某些位上都是1,并且連續(xù),很難,這樣的數(shù)據(jù)很難。所以很快。

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=1e5+20; 7 long long num[18][N]; 8 long long ans; 9 long long a[N],v; 10 int n,m,p; 11 long long tmp[18]; 12 int main(){ 13 while(~scanf("%d%d",&n,&m)){ 14 memset(num,0,sizeof(num)); 15 memset(a,0,sizeof(a)); 16 memset(tmp,0,sizeof(tmp)); 17 for(int i=1;i<=n;i++){ 18 scanf("%I64d",&a[i]); 19 for(int j=0;j<=17;j++){ 20 num[j][i]=(a[i]&1); 21 a[i]/=2; 22 } 23 } 24 ans=0; 25 for(int j=0;j<=17;j++){ 26 long long temp=0,tp=0; 27 for(int i=1;i<=n;i++){ 28 if(num[j][i]==0){ 29 tp+=temp*(temp+1)/2; 30 temp=0; 31 } 32 else{ 33 temp++; 34 } 35 if(i==n){ 36 tp+=temp*(temp+1)/2; 37 temp=0; 38 } 39 } 40 ans+=(tp<<j); 41 } 42 for(int i=1;i<=m;i++){ 43 scanf("%d%I64d",&p,&v); 44 for(int j=0;j<=17;j++){ 45 tmp[j]=(v&1); 46 v/=2; 47 } 48 for(int j=0;j<=17;j++){ 49 long long sum=0; 50 int tt=p; 51 if(tmp[j]==num[j][p])continue; 52 long long lnum=0,rnum=0; 53 while(num[j][--tt]) 54 lnum++; 55 tt=p; 56 while(num[j][++tt]) 57 rnum++; 58 if(tmp[j]==0&&num[j][p]==1){ 59 sum-=(lnum+rnum+1)*(lnum+rnum+2)/2; 60 sum+=(lnum+1)*lnum/2; 61 sum+=(rnum+1)*rnum/2; 62 num[j][p]=0; 63 } 64 else{ 65 sum-=(lnum+1)*lnum/2; 66 sum-=(rnum+1)*rnum/2; 67 sum+=(lnum+rnum+1)*(lnum+rnum+2)/2; 68 num[j][p]=1; 69 } 70 ans+=(sum<<j); 71 } 72 printf("%I64d\n",ans); 73 } 74 } 75 76 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/chujian123/p/3887553.html

總結(jié)

以上是生活随笔為你收集整理的Inna and Binary Logic的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。