1. 程式人生 > >JZOJ 3025. 選擇客棧(hotel) (Standard IO) NOIP2011

JZOJ 3025. 選擇客棧(hotel) (Standard IO) NOIP2011

p s text 結果 noi clu code cin standard bsp

題目

Description

麗江河邊有n家很有特色的客棧,客棧按照其位置順序從1到n編號。每家客棧都按照某一種色調進行裝飾(總共k種,用整數0 ~ k-1表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。 兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過p。 他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過p元的咖啡店小聚。


Input

輸入文件hotel.in,共n+1行。 第一行三個整數n,k,p,每兩個整數之間用一個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值; 接下來的n行,第i+1行兩個整數,之間用一個空格隔開,分別表示i號客棧的裝飾色調和i號客棧的咖啡店的最低消費。


Output

輸出只有一行,一個整數,表示可選的住宿方案的總數。


Sample Input

5 2 3
0 5
1 3
0 2
1 4
1 5

Sample Output

3

Data Constraint

Hint

2人要住同樣色調的客棧,所有可選的住宿方案包括:住客棧①③,②④,②⑤,④⑤,但是若選擇住4、5號客棧的話,4、5號客棧之間的咖啡店的最低消費是4,而兩人能承受的最低消費是3元,所以不滿足要求。因此只有前3種方案可選。


對於30%的數據,有n≤100; 對於50%的數據,有n≤1,000; 對於100%的數據,有2≤n≤200,000,0<k≤50,0≤p≤100, 0≤最低消費≤100。

分析

還是要先分析

如果按照常規做法我們肯定是先把相同色調的先放在一起然後在全枚舉算出結果

但很明顯會超時

所以我們不能這樣子做

首先我們先預處理

算出前i個中當前顏色的總個數

 將每個顏色最後出現的位置記錄下來

 結果其實就是等於

將每一個co[f[i]][a[i]]加在一起

代碼

 1 #include<iostream>
 2 using namespace std;
 3 int a[200001];
 4 int co[200001][60];
 5 int f[200001];
 6 int main ()
 7 {
 8     int n,k,p;
 9     cin>>n>>k>>p;
10     int b;
11     for (int i=1;i<=n;i++)
12     {
13         cin>>a[i]>>b;
14         for(int j=0;j<k;j++)
15         {
16             co[i][j]=co[i-1][j];
17         }
18         co[i][a[i]]++;
19         if (b<=p)
20            f[i]=i;
21         else
22           f[i]=f[i-1];
23     }
24     int ans=0;
25     for (int i=1;i<=n;i++)
26     {
27         ans+=co[f[i]][a[i]];
28         if (f[i]==i) ans--;
29     }
30     cout<<ans;
31 }

JZOJ 3025. 選擇客棧(hotel) (Standard IO) NOIP2011