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;
}

相关文章: