2020牛客多校第五場D Drop Voicing

2021-10-24 06:32:58 字數 947 閱讀 5656

給定乙個長度為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...