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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)

發(fā)布時(shí)間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出一個(gè)長度為 nnn 的數(shù)組 aaa,下標(biāo)從 000 開始,每次操作分為兩個(gè)步驟:

  • 構(gòu)建出數(shù)組 bbb,有 bi=gcd(ai,a(i+1)modn)b_i=gcd(a_i,a_{(i+1)\mod n})bi?=gcd(ai?,a(i+1)modn?)
  • 用數(shù)組 bbb 覆蓋數(shù)組 aaa
  • 問至少需要操作多少次,才能使得數(shù)組 aaa 的每個(gè)元素都相等

    題目分析:

    方便起見,下文中的下標(biāo) (i+1)modn(i+1)\mod n(i+1)modn 統(tǒng)一用 i+1i+1i+1 表示

    需要分析出:

  • 操作 000 次,ai=aia_i=a_iai?=ai?
  • 操作 111 次,ai=gcd(ai,ai+1)a_i=gcd(a_i,a_{i+1})ai?=gcd(ai?,ai+1?)
  • 操作 222 次,ai=gcd(gcd(ai,ai+1),gcd(ai+1,ai+2))=gcd(ai,ai+1,ai+2)a_i=gcd(gcd(a_i,a_{i+1}),gcd(a_{i+1},a_{i+2}))=gcd(a_i,a_{i+1},a_{i+2})ai?=gcd(gcd(ai?,ai+1?),gcd(ai+1?,ai+2?))=gcd(ai?,ai+1?,ai+2?)
  • 操作 kkk 次,ai=gcd(ai,ai+1,...,ai+k)a_i=gcd(a_i,a_{i+1},...,a_{i+k})ai?=gcd(ai?,ai+1?,...,ai+k?)
  • 不難看出當(dāng) kkknnn 時(shí),所有的數(shù)字都等于 nnn 個(gè)數(shù)的最大公約數(shù),所以操作次數(shù)最多有 nnn 次,最少有 000

    顯然 kkk 具有單調(diào)性,所以考慮二分 kkk,現(xiàn)在問題是如何快速去求區(qū)間 gcdgcdgcd,這里給出兩種方法,第一種就是最簡單的線段樹,但是如果嚴(yán)格來計(jì)算復(fù)雜度的話,線段樹拆分區(qū)間一層 loglogloggcdgcdgcd 一層 logloglog,所以總的時(shí)間復(fù)雜度是 nlog3nnlog^3nnlog3n 的,但好像是可以通過本題的?

    又因?yàn)槭庆o態(tài)查詢,所以不妨直接打個(gè) STSTST 表,這樣可以優(yōu)化掉一層 logloglog,復(fù)雜度是 nlog2nnlog^2nnlog2n 的,但 gcdgcdgcd 的那層 logloglog 好像很小,所以近似于 nlognnlognnlogn

    循環(huán)取模的話,只需要將數(shù)組復(fù)制一遍就可以了

    代碼:

    // Problem: F. Array Stabilization (GCD version) // Contest: Codeforces - Codeforces Round #731 (Div. 3) // URL: https://codeforces.com/contest/1547/problem/F // Memory Limit: 512 MB // Time Limit: 4000 ms // // Powered by CP Editor (https://cpeditor.org)// #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> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; int a[N],st[N][20],n; void ST_build() {for(int i=1;i<=n<<1;i++)st[i][0]=a[i];for(int i=1;i<=20;i++)for(int j=1;j+(1<<i)-1<=n<<1;j++)st[j][i]=__gcd(st[j][i-1],st[j+(1<<(i-1))][i-1]); } int ST_query(int l,int r) {int k=log2(r-l+1);return __gcd(st[l][k],st[r-(1<<k)+1][k]); } bool check(int len) {int mark=ST_query(1,1+len);for(int i=2;i<=n;i++) {if(mark!=ST_query(i,i+len)) {return false;}}return true; } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--) {read(n);for(int i=1;i<=n;i++) {read(a[i]);a[i+n]=a[i];}ST_build();int l=0,r=n,ans=-1;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) {r=mid-1;ans=mid;} else {l=mid+1;}}cout<<ans<<endl;}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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