poj2352(线段树)

/1.题目(theme)

                                      Stars

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 32652   Accepted: 14263

Description

Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. Astronomers want to know the distribution of the levels of the stars.For example, look at the map shown on the figure above. Level of the star number 5 is equal to 3 (it‘s formed by three stars with a numbers 1, 2 and 4). And the levels of the stars numbered by 2 and 4 are 1. At this map there are only one star of the level 0, two stars of the level 1, one star of the level 2, and one star of the level 3.
You are to write a program that will count the amounts of the stars of each level on a given map.

Input

The first line of the input file contains a number of stars N (1<=N<=15000). The following N lines describe coordinates of stars (two integers X and Y per line separated by a space, 0<=X,Y<=32000). There can be only one star at one point of the plane. Stars are listed in ascending order of Y coordinate. Stars with equal Y coordinates are listed in ascending order of X coordinate.

Output

The output should contain N lines, one number per line. The first line contains amount of stars of the level 0, the second does amount of stars of the level 1 and so on, the last line contains amount of stars of the level N-1.

Sample Input

5
1 1
5 1
7 1
3 3
5 5

Sample Output

1
2
1
1
0

Hint

This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.

2.题目大意(The meaning of the questions):

  求星星的等级,然后输出个等级的数目从0-(n-1);

  星星等级的计算如下:先画个坐标轴xy,在坐标轴上画出每个星星(根据它的坐标),在它的左下方有多少个星星(包括正下方),那它就有多少级。

3.解决方式(solution):

  1.线段树:把x轴作为处理对象,因为输入的坐标是随着y轴递增,这就为题目用线段树查询提供方便,这道题用线段树就不用管y,只需要处理x就行,就化简为区间线段树,不用担心因为y的问题出错,这就是这道题的有趣之处。

  举个例子好了,6

         1 1

         2 1

         3 1

         2 2

         3 5

         1 7

        化简为(去y留x):1  2  3  2 3 1(这些就是建好树之后,要加进去的点,加完一个查询一个就行)

4.代码:

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <string.h>
 6 using namespace std;
 7 struct st{
 8     int value;
 9 }root[32005*4];
10 int level[32005*2];
11 void build(int rt,int l,int r)
12 {
13     int mid;
14     if (l==r) {root[rt].value=0;return ;}
15     mid=(l+r)/2;
16     build(2*rt,l,mid);
17     build(2*rt+1,mid+1,r);
18     root[rt].value=root[rt*2].value+root[rt*2+1].value;
19 }
20 int query(int rt,int l,int r,int left,int x)
21 {
22     int mid;
23     if (left==l&&r==x)return root[rt].value;
24     mid=(l+r)/2;
25     if (x<=mid){
26     return query(rt*2,l,mid,left,x);
27     }
28     if (left>mid){
29         return query(rt*2+1,mid+1,r,left,x);
30     }
31     return (query(rt*2,l,mid,left,mid)+query(rt*2+1,mid+1,r,mid+1,x));
32 }
33 void updata(int rt,int l,int r,int x)
34 {
35     int mid;
36     if (l==r){root[rt].value++;return;}
37     mid=(l+r)/2;
38     if (x>mid){
39         updata(rt*2+1,mid+1,r,x);
40     }else {
41         updata(rt*2,l,mid,x);
42     }
43     root[rt].value=root[rt*2].value+root[rt*2+1].value;
44 }
45 int main()
46 {
47     int n,x,y,sum,maxx=32005,i;
48     scanf("%d",&n);
49     for (i=0;i<n;i++){
50         level[i]=0;
51     }
52     build(1,0,maxx);
53     for (i=0;i<n;i++){
54         scanf("%d%d",&x,&y);
55         sum=query(1,0,maxx,0,x);
56         level[sum]++;
57         updata(1,0,maxx,x);
58     }
59     for (i=0;i<n;i++){
60         printf("%d\n",level[i]);
61     }
62     return 0;
63 }

         

时间: 2024-10-23 20:40:23

poj2352(线段树)的相关文章

POJ2352 Stars 【树状数组】or【线段树】

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31172   Accepted: 13595 Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a st

[poj2104]可持久化线段树入门题(主席树)

解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序列的第k小,我们会想到离散化二分和线段树的做法, 而主席树只是保存了序列的前缀和,排序之后,对序列的前缀分别做线段树,具有差分的性质,因此可以求任意区间的第k小,如果主席树维护索引,只需要求出某个数字在主席树中的位置,即为sort之后v中的索引:若要求第k大,建树时反向排序即可 1 #include

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树

题目传送门 这道题就是线段树 先传乘法标记再传加法 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=400010; LL read(){ LL ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

luogu 1712 区间(线段树+尺取法)

题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭区间,然后线段树的每一个节点表示一个半开半闭区间. 接着我们注意到需要求最小的花费,且这个花费只与选择的区间集合中的最大长度和最小长度有关. 这意味着如果最大长度和最小长度一定,我们显然是需要把中间长度的区间尽量的选择进去使答案不会变的更劣. 不妨把区间按长度排序,枚举每个最小长度区间,然后最大区间

【BZOJ】1382: [Baltic2001]Mars Maps (线段树+扫描线)

1382: [Baltic2001]Mars Maps Time Limit: 5 Sec  Memory Limit: 64 MB Description 给出N个矩形,N<=10000.其坐标不超过10^9.求其面积并 Input 先给出一个数字N,代表有N个矩形. 接下来N行,每行四个数,代表矩形的坐标. Output 输出面积并 Sample Input 2 10 10 20 20 15 15 25 30 Sample Output 225 本以为是傻逼题,没想到不容易啊- 线段树+扫描

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列

HDU 1754 I Hate It(线段树之单点更新,区间最值)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 70863    Accepted Submission(s): 27424 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的