JZOJ 3025. 选择客栈(hotel) (Standard IO) NOIP2011
题目
分析
还是要先分析
如果按照常规做法我们肯定是先把相同色调的先放在一起然后在全枚举算出结果
但很明显会超时
所以我们不能这样子做
首先我们先预处理
算出前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++) //记录前i中共出现多少次同种颜色 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 }
为何要逼自己长大,去闯不该闯的荒唐