!POJ 2352 左下角星星-线段树-(单点更新,区间查询)

题意:直接坐标系中有n个星星,每个星星左下角的星星个数是它的价值,输出价值为0~n-1的星星个数。

分析:

这题就没有上面四道线段树的题裸了。

这题是怎么联系到区间,然后用线段树维护的呢?

因为题目要求输入的次序是按y第一关键字,x第二关键字升序输入,那么我们可以想到对于星星A(x,y),它左下角的星星一定在比他先输入的星星中,所以我们只需判断在比他先输入的星星的x2,如果x2<=x,那么星星A的价值+1。所以这题就转化为了求区间中的tot[0~x],也就是区间查询。每输入一个星星,先在原来的树中查询x比他小的星星的个数,然后把这个星星插入线段树,然后向上更新tot[].

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=32000;
int n;
int ans[15010],tot[maxn*4+10];
void pushup(int rt)
{
	tot[rt]=tot[rt<<1]+tot[rt<<1|1];
}
int query(int a,int l,int r,int rt)  //查询<=a的星星个数
{
	if(a>=r) return tot[rt];
	if(a<l) return 0;
	int mid=(l+r)>>1;
	int ret;
	ret=query(a,l,mid,rt<<1);
	if(a>mid) ret+=query(a,mid+1,r,rt<<1|1);
	return ret;
}
void upd(int a,int l,int r,int rt)
{
	if(l==r){          //找到a的位置,更新他的个数
		tot[rt]++;
		return;
	}
	int mid=(l+r)>>1;
	if(a<=mid) upd(a,l,mid,rt<<1);
	else upd(a,mid+1,r,rt<<1|1);
	pushup(rt);   //向上更新区间的tot[]
}
int main()
{
	while(scanf("%d",&n)!=EOF){
		memset(ans,0,sizeof(ans));
		memset(tot,0,sizeof(tot));
		int sum;
		for(int i=1;i<=n;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			sum=query(a,0,maxn,1);
			ans[sum]++;
			upd(a,0,maxn,1);
		}
		for(int i=0;i<n;i++) printf("%d\n",ans[i]);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:50:35

!POJ 2352 左下角星星-线段树-(单点更新,区间查询)的相关文章

POJ 3264 Balanced Lineup (线段树单点更新 区间查询)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 36820   Accepted: 17244 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

POJ训练计划2828_Buy Tickets(线段树/单点更新)

解题报告 题意: 插队完的顺序. 思路: 倒着处理数据,第i个人占据第j=pos[i]+1个的空位. 线段树维护区间空位信息. #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node { int x,v; } num[201000]; int sum[1000000],ans[201000]; void cbtree(int rt,int l,in

HDU 3874 Necklace (线段树单点更新+区间查询+离线操作)

Problem Description Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful value. The balls with the same beautiful value look the same, so if two or more balls have the same beautiful value, we just count

hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询

单点更新 区间查询 #include <bits/stdc++.h> using namespace std; #define m ((l+r)/2) #define ls (rt<<1) #define rs (rt<<1|1) const int N = 2e6+10; int s[N], tr[N]; void build(int rt,int l,int r) { if(l == r) { tr[rt] = s[l]; return ; } build(ls,

HDU1166(线段树单点更新区间查询)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 62483    Accepted Submission(s): 26386 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就

CDOJ 1073 线段树 单点更新+区间查询 水题

H - 秋实大哥与线段树 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1073 Appoint description:  System Crawler  (2016-04-24) Description “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为

敌兵布阵(线段树单点更新+区间查询)

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇

POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)

解题报告 题意: 求逆序数. 思路: 线段树离散化处理. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; LL sum[2001000],num[501000],_hash[501000]; void push_up(int rt) { sum[rt]=sum[rt*2

POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Description BackgroundRaymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just b