Description
有 (n) 间客栈,每间客栈按某种色调装饰,总共 (k) 种,每家有最低消费 (w_i)。两个人打算选择同种色调的两家不同客栈入住,同时在他们之间要有一间客栈的 (w_i le p)。求选择的方案数。
Solution
先将所有满足 (w_i le p) 的 (i) 标记为可用的,其它的标记为不可用的。
考虑对于每一个左端点,向右找到第一个可用的客栈,则这个客栈以及它右边的所有同色客栈都可以作为右端点。
于是弄几个 std::vector
记录所有可用客栈、各种颜色客栈的出现位置二分一下即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2000005;
int n,k,p,c[N],w[N],ans;
vector<int> v[N],u;
signed main()
{
cin>>n>>k>>p;
for(int i=1;i<=n;i++) cin>>c[i]>>w[i];
for(int i=1;i<=n;i++) if(w[i]<=p) u.push_back(i);
for(int i=1;i<=n;i++) v[c[i]].push_back(i);
for(int i=1;i<=n;i++)
{
auto t=lower_bound(u.begin(),u.end(),i);
if(t==u.end()) continue;
int x=*t;
if(x==i) ++x;
ans+=v[c[i]].end()-lower_bound(v[c[i]].begin(),v[c[i]].end(),x);
}
cout<<ans;
}