給定乙個長度為n的排列,每次可以做兩個操作
1、把排列倒數第二個數放到第一的位置
2、把第乙個數放到最後乙個位置
連續的操作1視作一次操作。
問最少需要幾次操作才能把排列變為全部公升序。即12345678……
操作2可看作改變排列的順序,相當於在圓上繞圈圈,操作1可改變排列的本質。
所以只需要每次進行操作2後求排列的最長上公升序列長度,再在這些長度中取最大值,用n減去這個值即可。
此處直接把原陣列延拓一倍,然後從0到n求最長上公升子串行即可
複雜度o(n3)
不是很理解怎麼優化到o(n2)我覺得只能到o(n2log n)吧
#includeusing namespace std;
//#define int long long
#define pii pair#define fi first
#define se second
int t=1,mod;
int qmi(int a,int b)
return res;
}inline void rd(int &res)
while('0'<=ch&&ch<='9')res=(res<<3)+(res<<1)+(ch-'0'),ch=getchar();
res*=f;
}int a[2*510],dp[2*510];
int n;
int inc(int sta)
} }int ans=0;
for(int i=sta;ireturn ans;
}void solve()
int ans=0;
for(int i=0;ians=n-ans;
printf("%d",ans);
}signed main()
return 0;
}
2020牛客多校第五場H
乙個數轉為二進位制後,最多有log位,所以減小後的個數最多只有log位,加上二分,複雜度為平方級的,主席樹也是log級的,所以總複雜度為 nlog2n mlogn 可能常數偏大 ac include include include include include include include de...
2020牛客多校第五場 D
題意,有兩個操作,求你最少使用的段數 連續使用1操作包括1次也稱為1段 對於操作1 我們可以把 1 n 1看成是乙個環,操作一次,環轉一次。對於操作2 我們可以把1 n 看成是乙個環,操作一次,環轉一次。每使用多次包括1次操作1 之後 再使用多次包括1次操作2 就可以把某些數放到最後乙個數的後面,即...
牛客多校(第五場)E room
將乙個房間當做乙個點,後來的房間與之前的房間中不用搬的人作為權值,建圖,跑最大權匹配,就是不用搬的人數,在減一下即可,km演算法,o n 3 include include include includeusing namespace std define n 200 define inf 0x3f...