小 c 在了解了她所需要的資訊之後,讓兔子們調整到了恰當的位置。小 c 準備給兔子 們分成若干個小組來喂恰當的胡蘿蔔給兔子們吃。solution:此時, nn 只兔子按一定順序排成一排,第 ii 只兔子的顏色是 a_iai。由於順序已經是被 調整好了的,所以每個小組都應當是序列上連續的一段。
在分組前,小 c 發現了乙個規律:有些兔子會兩兩發生矛盾。並且,兩隻兔子會發生矛 盾,當且僅當代表他們的顏色的數值之和為乙個正整數的平方。比如,1 色兔子和 2 色兔子 不會發生矛盾,因為 3 不是任何乙個正整數的平方;而 1 色兔子卻會和 3 色兔子發生矛盾, 因為 4 = 2^24=22。
小 c 認為,只要乙個小組內的矛盾不要過大就行。因此,小 c 定義了乙個小組的矛盾 值 kk ,表示在這個小組裡,至少需要將這個組再一次分成 kk 個小團體;每個小團體並不需 要是序列上連續的一段,但是需要使得每個小團體內任意兩隻兔子之間都不會發生矛盾。
小 c 要求,矛盾值最大的小組的矛盾值 kk 不超過 kk 就可以了。當然,這樣的分組方 法可能會有很多個;為了使得分組變得更加和諧,小 c 想知道,在保證分組數量最少的情況 下,字典序最小的方案是什麼。你能幫幫她嗎?
字典序最小的方案是指,按順序排列分組的間隔位置,即所有存在兔子 ii 和 i + 1i+1 在 不同組的位置 ii,和其它所有相同分組組數相同的可行方案相比總有第乙個不同的位置比其 它方案小的方案。
輸入格式:
從標準輸入中讀入資料。
輸入第 1 行兩個正整數 n,kn,k。
輸入第 2 行 nn 個正整數,第 ii 個數表示第 ii 只兔子的顏色 a_iai。
輸出格式:
輸出到標準輸出中。
輸出第 1 行乙個正整數 mm,為你至少需要將兔子分為多少個小組。
輸出第 2 行m-1m−1個從小到大的排列的正整數,第 ii 個數 s_isi表示 s_isi和 s_i + 1si+1 在 你的方案裡被分到了兩個小組。如果 m = 1m=1,那麼請輸出乙個空行。
輸入樣例#1: 複製
5 2輸出樣例#1: 複製1 3 15 10 6
2【樣例 1 解釋】1
如果將五隻兔子全部分到同乙個小組的話,那麼 (1, 3) (3, 6) (6, 10) (10, 15) (1, 15) 均 不能分到同乙個小團體;因為最多分成兩個小團體,所以為了滿足前 4 對限制,只能分為 , },但此時不滿足 (1, 15) ,所以不存在一種組數為 1 的方案滿足全部限制。
如果將五隻兔子分為兩個小組的話,一種字典序最小的可行的分組方案是 , ,此時第二組內的小團體數量不超過 2 的一種分法是 , }。
【資料範圍】
子任務會給出部分測試資料的特點。如果你在解決題目中遇到了困難,可以嘗試只解 決一部分測試資料。
每個測試點的資料規模及特點如下表:
特殊性質 1:保證最優分組方案唯一。
特殊性質 2:保證不會有兩隻相同顏色的兔子。
k==1的點很水,直接從後面貪心就好,用乙個帶時間戳的vis陣列處理(亂搞)一下就好。
k==2的思路和前乙個基本一樣,只不過用乙個並查集維護一下和當前顏色衝突的兩個顏色是否也衝突,如果它倆也衝突那麼說明需要重新分乙個組,否則可以繼續,直到出現不合法狀態或找完為止。
1#pragma gcc optimize("o3")
2 #include 3 #include 4 #include 5 #include 6 #include 7
using
namespace
std;
8int
read()
15int n,k,color[262505],ans[262505],fa[262505*2],vis[262505
];16 vector match[262505
];17
namespace
one
26if(!pd) ans[ans[0]++]=i;
27 vis[color[i]]=ans[0
];28 } printf("
%d\n
",ans[0
]);29
for(int i=ans[0]-1; i; --i) printf("
%d "
,ans[i]);
30} 31}
32namespace
two
34int find(int x)
35void union(int x,int
y) 39
void
work()
49 union(i+n,match[now][k]),union(i,match[now][k]+n);50}
51}52}
53if(!pd) ans[ans[0]++]=i;
54if(vis[color[i]]!=ans[0
]) match[color[i]].push_back(i);
58 } printf("
%d\n
",ans[0
]);59
for(int i=ans[0]-1; i; --i) printf("
%d "
,ans[i]);60}
61}62int
main()
noip模擬賽 分組
分析 暴力分挺多,也挺好想的,個人感覺兩個特殊性質沒什麼卵用.對於k 1,n 1024的情況,從後往前貪心地分,如果能和上一組分在一起就分在一起,否則就再開一組,這樣可以保證字典序最小.ai 2就看前面有沒有2.有就不能分在一組.n 131072就不能再這樣二重迴圈列舉了,因為兩個數的和頂多只有26...
noip模擬賽 罪犯分組
分析 看了題後沒別的思路,感覺就是dp,普通dp的話狀態和方程實在是不好設計,觀察資料,發現n非常小,暗示了這道題要用狀壓dp來做.先列舉每個集合,再用o n 2 的暴力看這個集合內有多少個衝突,如果衝突數量不大於k,那麼就可以分成1個集合了,否則一定要分成多個集合,那麼列舉它的子集j,狀態轉移方程...
NOIP模擬賽 洛谷11月月賽
t1終於結束的起點 題解 列舉啊.斐波那契數 第46個爆int,第92個爆long long.發現結果一般是m的幾倍左右.不用擔心t。題解 貪心。從當前沒跳過的最高的和最低的之間來回跳。預計10分 include include include include define ll long long...