国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【樹狀數組】Stars

2019-11-06 08:16:09
字體:
來源:轉載
供稿:網友

                                        C - Stars

 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.InputThe 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. OutputThe 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
51 15 17 13 35 5Sample Output
12110HintThis problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.

#----------------------------------------------------------------------------------------------#題目大意:按y的升序(y相同則按x升序)給出n(1<=n<=15000)個星星的坐標(0<=x,y<=32000),每個星星左下方(包括同一行或同一列)的星星個數為它的“等級”,依次輸出等級為1,2,3,...,n-1的星星的個數。

最后提示用sanf,最好不用cin

#----------------------------------------------------------------------------------------------#

思路很容易:樹狀數組求x的“順序對”,因為y已經按升序(即從低到高)排好序,所以只需要知道有多少個星星的x坐標小于當前星星的x坐標就可以了。

怎么用樹狀數組求x的“順序對”呢,先解釋下順序對就是它之前的數當中比它小的數的個數。

然后,就容易了:將星星的x坐標的位置+1,當然是樹狀數組的+1,然后,x的getsum就是它的等級了。

why?

因為:x坐標+1,就表示了x那一排多了1個,而y坐標是遞增的,每個點只有一個星星,所以當前x的getsum就代表了當前x坐標比它小的星星數量。

原諒我只能這樣描述……自己體會吧。

代碼:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define lowbit(x) x&-xint n;int tr[32005];//樹狀數組int ans[15005];//存每個等級星星數void update(int q,int x){	for(int i=q;i<=32001;i+=lowbit(i))//注意i<=32001,這里我調了2天,之前寫的是i<=32000,然而我x++了,所以……		tr[i]+=x;}int getsum(int q){	int ans=0;	for(int i=q;i>0;i-=lowbit(i))		ans+=tr[i];	return ans;}//模板int main(){	scanf("%d",&n);	for(int i=1;i<=n;i++)	{		int x,y;		scanf("%d%d",&x,&y);		x++;//為了防止x為0		update(x,1);		ans[getsum(x)-1]++;//前面x++了,后邊要減回來	}	for(int i=0;i<n;i++)		printf("%d/n",ans[i]);}                                                                                                                                            By WZY


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 塘沽区| 五河县| 洛隆县| 金堂县| 离岛区| 剑阁县| 河津市| 洛浦县| 平遥县| 巴彦淖尔市| 垣曲县| 确山县| 阿坝县| 隆安县| 惠水县| 贵德县| 石阡县| 齐齐哈尔市| 成武县| 阿合奇县| 孙吴县| 德惠市| 淮安市| 义马市| 时尚| 偃师市| 大渡口区| 清水河县| 西和县| 金秀| 合江县| 肥东县| 宝清县| 黄石市| 赣榆县| 马山县| 石河子市| 济宁市| 浪卡子县| 喀喇沁旗| 额尔古纳市|