zoukankan      html  css  js  c++  java
  • [NOIP2011] 选择客栈

    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;
    }
    
  • 相关阅读:
    Divide Two Integers
    LRU Cache
    Max Points on a Line
    Recover Binary Search Tree
    Copy List with Random Pointer
    IEE修改最大连接数
    SQL Tuning 基础概述02
    RHEL 本地yum源配置
    Linux演示 dd测试IO
    Linux平台oracle 11g单实例 安装部署配置 快速参考
  • 原文地址:https://www.cnblogs.com/mollnn/p/13674011.html
Copyright © 2011-2022 走看看