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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 1457D XOR-gun(位运算+暴力)

發布時間:2024/4/11 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1457D XOR-gun(位运算+暴力) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個長度為 n 的非降序列,現在可以執行數次操作:選擇相鄰的兩個位置將其替換成異或和,更具體的,每次操作可以選擇一個位置 i ,滿足 1 <= i < n,令 a[ i ] = a[ i ] xor a[ i + 1 ] 并刪除掉 a[ i + 1 ],問最少需要操作多少次才能使得整個序列不再非降

題目分析:假設 b[ i ] 為 a[ i ] 最高位的那個 1,比較顯然的是,如果存在 b[ i - 1 ] == b[ i ] == b[ i + 1 ] 時,答案為 1,因為此時只需要將 a[ i ] 與 a[ i + 1 ] 進行一次操作后,就能得到 a[ i - 1 ] > a[ i ] ,即滿足了條件

考慮如果沒有連續的三個位置的最高位相同,那么最壞情況肯定是兩兩成對,換句話說 b 數組依次為 1 , 1 , 2 , 2 , 3 , 3 ... log( mmax ) , log( mmax ),此時如果再多一個數字,因為要滿足初始的序列非降,所以不難看出無論插在哪里一定會出現 b[ i - 1 ] == b[ i ] == b[ i + 1 ] 的情況,又回到了第一種情況,換句話說如果整個序列的長度大于?log( mmax ) * 2 了,那么答案一定為 1,這是一個很重要的剪枝

上面剪枝的閾值可以設置為大于 60 的任意一個數,而對于小范圍的數直接暴力即可,再考慮一下答案會在哪些地方出現:

  • 選擇一段區間 [ l , r ],將整個區間進行異或,最后得到的答案與 a[ l - 1 ] 和 a[ r + 1 ] 比較
  • 選擇兩段相鄰的區間 [ i , j ] 和 [ j + 1 , k ] ,將兩段區間分別異或然后比較大小
  • 情況一可以 n^2 暴力,情況二可以 n^3 暴力

    代碼:
    ?

    //#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;int a[N],sum[N];int main() { #ifndef ONLINE_JUDGE // freopen("data.ans.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",a+i);sum[i]=sum[i-1]^a[i];}if(n>60)return 0*puts("1");int ans=inf;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){int num=sum[j]^sum[i-1];if((i>1&&num<a[i-1])||(j<n&&num>a[j+1]))ans=min(ans,j-i);}for(int i=1;i<=n;i++)//[i,j][j+1,k]for(int j=i+1;j<=n;j++)for(int k=j+1;k<=n;k++){int num1=sum[j]^sum[i-1];int num2=sum[k]^sum[j];if(num1>num2)ans=min(ans,k-i-1);}if(ans==inf)puts("-1");elseprintf("%d\n",ans);return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的CodeForces - 1457D XOR-gun(位运算+暴力)的全部內容,希望文章能夠幫你解決所遇到的問題。

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