zoukankan      html  css  js  c++  java
  • POJ-2352-Stars

    这题分析一下就可以用树状数组去做,因为已经排过序了,所以我们每次读入的点,前面的点的纵坐标都是小于当前点的纵坐标的,所以我们只要统计,之前所有点x坐标小于当前点的x坐标的的星星数即可。
    每次加入一个点,都用对应的x坐标进行加一更新,用来影响后面的点,而在同一个纵坐标的点,如果x坐标大于了后面的比他高,但是x坐标较小的点,实际上也不会影响。实际上很简单,稍微思考一下就出来了。
    需要特别注意的是这题会TLE,因为x坐标给了0值,lowbit会一直返回0,i一直加0就会T掉。所以x坐标加1即可,不会有任何的影响。

    #include <iostream>
    #include <cstdio>
    
    const int maxn=32005;
    int level[maxn];
    int bit[maxn];
    int n;
    
    int lowbit(int x)
    {
    	return x&(-x);
    }
    
    void edit(int x,int y)
    {
    	//if x=0 -> TLE
    	for (int i=x;i<=maxn;i+=lowbit(i)) {
    		bit[i]+=y;
    	}
    }
    
    int sum(int x)
    {
    	int ans=0;
    	for (int i=x;i>0;i-=lowbit(i)) {
    		ans+=bit[i];
    	}
    	return ans;
    }
    
    int main()
    {
    	int x,y;
    	scanf("%d",&n);
    	for (int i=0;i<n;i++) {
    		scanf("%d%d",&x,&y);
    		level[sum(x+1)]++;
    		edit(x+1,1);
    //		for (int i=1;i<=8;i++) {
    //			printf("%d ",bit[i]);
    //		}
    //		printf("
    ");
    	}
    	for (int i=0;i<n;i++) {
    		printf("%d
    ",level[i]);
    	}
    	return 0;
    }
    /*
    5
    1 1
    5 1
    7 1
    3 3
    0 5
    */
    
  • 相关阅读:
    Mysql中limit的用法详解
    EXCEPTION与ERROR的区别
    调用sed命令的三种方式
    学编程一定要上大学?美国一半码农都没有计算机学位
    awk 循环语句例子
    Ubuntu 16.04 LTS今日发布
    Ubuntu启动eclipse问题
    Vim技能修炼教程(6)
    Vim技能修炼教程(7)
    Vim技能修炼教程(5)
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328896.html
Copyright © 2011-2022 走看看