zoukankan      html  css  js  c++  java
  • 【AtCoder

    BUPT2017 wintertraining(15) #9A

    题意

    有n个纪念品,购买区间是([l_i,r_i])。求每i(1~m)站停一次,可以买到多少纪念品。

    题解

    每隔d站停一次的列车,一定能买到购买区间的长度≥d的纪念品。
    长度比d小但包含了d的倍数的纪念品也可以买到。
    所以,如果按长度给纪念品排序,用树状数组维护长度小于当前d的购买区间,那么就可以很快求出每个停靠点(d的倍数)有多少个长度不超过d的纪念品了。

    代码

    #include <cstdio>
    #include <algorithm>
    #define N 100001
    using namespace std;
    int n,m;
    struct souvenir{
    	int l,r,len;
    	bool operator <(const souvenir &b){
    		return len<b.len;
    	}
    }s[N*3];
    int c[N];
    int get(int i){
    	int ans=0;
    	for(;i;i-=i&(-i))ans+=c[i];
    	return ans;
    }
    void add(int i,int v){
    	for(;i<=m;i+=i&(-i))c[i]+=v;
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1,l,r;i<=n;++i){
    		scanf("%d%d",&l,&r);
    		s[i]=(souvenir){l,r,r-l+1};
    	}
    	sort(s+1,s+1+n);
    	for(int i=1,j=1;i<=m;++i){
    		while(j<=n&&s[j].len<i){
    			add(s[j].l,1);
    			add(s[j].r+1,-1);
    			++j;
    		}
    		int ans=n-j+1;
    		for(int k=i;k<=m;k+=i)
    			ans+=get(k);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

    树状数组的英文名叫 Fenwick Tree

  • 相关阅读:
    SQL FORMAT() 函数
    SQL ROUND() 函数
    SQL NOW() 函数
    SQL LEN() 函数
    SQL LCASE() 函数
    SQL MID() 函数
    SQL HAVING 子句
    UCASE() 函数
    SQL GROUP BY 语句
    SQL MAX() 函数
  • 原文地址:https://www.cnblogs.com/flipped/p/AtCoder2300.html
Copyright © 2011-2022 走看看