這是一道不算太難的題,但愚蠢的我並沒有想到。
首先,判斷無解的情況:他想相鄰的不想與他相鄰。
然後,構造出合法的數列,因為第一位左邊有兩種選擇,且構造出的環不等價,所以要做兩次。
(這一點我並沒有想清楚)
然後,考慮對於構造出的數列(斷環為鏈),如何計算他與原數列的差別,即答案。
這是這道題最難的地方:如何 \(o(n)\) 的求出兩個環的不同之處。
樸素演算法:\(o(n^2)\),顯然無法接受。
因為環無論怎麼旋轉,兩個人的相對位置是不會變的,於是,可以對於每乙個位置求出的數列與原數列的差 \(x\),表示數列要旋轉 \(x\) 個位置,此位置才會與原數列重合。然後條統計出每個 \(x\) 出現的次數,\(n-max(x)\) 就是答案。
#include using namespace std;
#define db double
#define ll long long
#define rg register
inline int gi()
const db pi = acos(-1.0);
const int n = 5e4+5, inf = 1<<30;
int n,ans,f[n],s[n],pos[n],cnt[n];
bool vis[n];
inline void cal()
inline void dfs(rg int o,rg int dep)
int main()
NOIP2005 篝火晚會
題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...
Noip2005 篝火晚會
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nnn個同學,編號從111到nnn。一開始,同學們按照1,2,n1,2,n1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整...
NOIP 2005 篝火晚會
額 對這組題感興趣的具體的解題報告可以戳戳這裡 問題描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n個同學,編號從1到n。一開始,同學們按照1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望...