原題
首先暴力如果寫的優秀,可以拿到60分,這裡介紹兩種暴力:
40:
#include
#include
#include
#include
#include
using
namespace
std;
int color[200010],cost[200010];
int main()
printf("%d\n",ans/k);
return0;}
這是一種莫名其妙的卡常數,大家不要在意,我只是想拿30分而已......(可是還是沒有30分!!!)
60:
#include
#include
#include
#include
#include
using
namespace
std;
int color[200010],cost[200010];
int main()
printf("%d\n",ans);
return
0;}
那麼接下來看正解:
yzk大佬說過:
這就是一道簡單的數論題.注意到顏色只有100種,多種顏色混合起來使問題變得更複雜,我們考慮單獨考慮每一種顏色的情況題目的含義為取兩個顏色相同的客棧l,r,使得區間[l,r][l,r][l,r]中含有乙個消費<=p的咖啡店。那麼我們只需要留下有用的資料,若該咖啡店消費<=p則為true,>p則為false。若單獨考慮只有一種顏色,就變成了有多少個區間[l,r][l,r][l,r]使得區間中含有至少乙個true。
假設我們不管這個條件,那麼該種顏色下的客棧個數為n時,我們可以選擇的區間個數是為n*(n-1)/2的。
那我們如何統計含有true的區間個數呢?
反著統計,我們將所有的區間個數減去不含true的區間個數。
我們可以用乙個陣列ca儲存符合條件的咖啡店的下標。
列舉相鄰的兩個咖啡店下標分別為a1,a2
則統計(a1,a2)(a1,a2)(a1,a2)這個區間裡面有k個這種顏色的店子,他們的組合區間數為k*(k-1)/2,再將當前顏色的總組合數n*(n-1)/2減去這個數。因為(a1,a2)(a1,a2)(a1,a2)這個區間絕對不含滿足條件的咖啡店。
每種顏色統計過後,加起來就是答案。
區間同顏色店子的個數可以通過字首和得到。
每種顏色分別處理會比較好。
#include
using
namespace
std;
int color[200010],a[200010],sum[200010],reans;
int main()
a[++can]=n+1;
int ans=0;
for(i=0;i0;
memset(sum,0,sizeof(sum));
for(j=1;j<=n;j++)
ans=(ans-1)*ans/2;
int ans2=0;
for(j=1;j<=can;j++)
reans+=ans;
}printf("%d\n",reans);
return
0;}
洛谷P1311 選擇客棧
做法1 樸素模擬。考慮到此題有可模擬性,所以我們可以列舉i,j,分別為第乙個人住i和第二個人住j的情況,然後再列舉k,k即為兩者中間的點,判斷是否有value p的情況就可以了。做法2 有技巧的運用一些與組合數有關的知識。考慮咖啡館的每個地方所代表的方案,發現我們可以從這裡突破。在讀入時把每乙個點如...
洛谷P1311 選擇客棧
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...
洛谷P1311 選擇客棧
做法1 樸素模擬。考慮到此題有可模擬性,所以我們可以列舉i,j,分別為第乙個人住i和第二個人住j的情況,然後再列舉k,k即為兩者中間的點,判斷是否有value p的情況就可以了。做法2 有技巧的運用一些與組合數有關的知識。考慮咖啡館的每個地方所代表的方案,發現我們可以從這裡突破。在讀入時把每乙個點如...