zoukankan      html  css  js  c++  java
  • 【NOIP2011】选择客栈

    题文:

    丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号。每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。 
    两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。 
    他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

    很明显,暴力是枚举左旅馆,和右旅馆,如果中间有一个合法的咖啡店,贡献就加一;可转换为枚举每个左端点,对于一个左端点,统计

    每个合法右端个数,然后将所有的合法由端点相加就可以了,但如何知道合法的右端点数呢?如果左端点的cost本身就很小,咖啡厅就可以

    选在左端点,左端点之后所有的颜色相同的点和左端点都合法,数目统计用树状数组统计一下就可以了,如果左端点比较大,那就必须找到

    第一个比较小的咖啡店,我是暴力找,不放心的同学可以使用单调栈维护一下,之后的颜色相同的点都合法,用树状数组统计一下就可以;

    这样就可以在近似nlog(n)时间内跑出来;

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<stdlib.h>
    #define ll long long
    const int MAXN=200010;
    int lb(int x){
      return -x&x;
    }
    using namespace std;
    int tree[MAXN][101];
    int n,numcolor,have;
    int color[MAXN],cost[MAXN];
    ll ans=0;
    void cl(){
      for(int i=1;i<=numcolor;i++){
        for(int j=1;j<=n;j++){
          tree[j][i]=0;
        }
      }
    }
    void add(int num,int now,int zhi){
      while(now<=n){
        tree[now][num]+=zhi;
        now+=lb(now);
      }
    }
    int tot=0;
    ll sum(int num,int now){
      tot=0;
      while(now>0){
        tot+=tree[now][num];
        now-=lb(now);
      }
      return tot;
    }
    int main(){
      cin>>n>>numcolor>>have;
      cl();
      for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        color[i]=x,cost[i]=y;
        add(x,i,1);
      }
      int can=0;
      for(int l=1;l<n;l++){
        if(cost[l]>have){
          can=l+1;
          while(1){
        if(cost[can]<=have) break;
        else can++;
        if(can==n+1) break;
          }
          if(can==n+1) continue;
          ans+=sum(color[l],n)-sum(color[l],can-1);
        }
        else ans+=sum(color[l],n)-sum(color[l],l);
      }
      printf("%lld",ans);
    }
  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/renjianshige/p/7108323.html
Copyright © 2011-2022 走看看