POJ 2352 star level
题目链接:
http://poj.org/problem?id=2352
题目大意:
对于每一颗星星来说,都有一个属于自己的level,这个值为其他星星x,y坐标均不大于本星星的个数。输入时按先y由小到大,再x由小到大排列,无相同位置的星星
仔细一想其实这道题目根本不需要用到y,我是反向来思考的,构建一个保存x坐标由0到maxn的线段树,因为最后一个星星肯定不可能x,y同时不大于其他星星,所
以从后面开始看,只计算比它x小或相等的星星的个数,用cnt[ans]++,来记录成为ans水平的个数,再删去这个点,继续找上一个点对应的level
在这里要注意的是数组的范围,我就因为这个改了半天错,第一次发现数组范围定的不够大也是WA
他这里星星个数为15000,但是我们保存的是x的坐标,所以要看x最大达32000,所以用4*32000的大小保存tree[],我的代码里懒得修改了就写成了
#define N 15005
int cnt[N],num[2*N],tree[*N],D,maxn;//开始我写成的是4*N所以报错T T
#include <cstdio>
#include <cstring>
using namespace std;
#define N 15005
int cnt[N],num[*N],tree[*N],D,maxn; int max(int a,int b)
{
return a>b?a:b;
} void update(int i)
{
for(;i^;i>>=)
tree[i>>]=tree[i]+tree[i^];
} int query(int a,int b)
{
int i=D+a-,j=D+b+,ans=;
for(;i^j^;i>>=,j>>=)
{
if(~i&) ans+=tree[i^];
if(j&) ans+=tree[j^];
}
return ans;
} int main()
{
int n,x[N],y;
while(scanf("%d",&n)!=EOF){
maxn=;
memset(num,,sizeof(num));
//memset(tree,0,sizeof(tree));
for(int i=;i<=n;i++){
scanf("%d%d",&x[i],&y);
maxn=max(maxn,x[i]);
num[x[i]]++;
}
for(D=;D<maxn++;D<<=);
for(int i=;i<=maxn+;i++) tree[D+i]=num[i-];
for(int i=D-;i>=;i--) tree[i]=tree[i<<]+tree[i<<|];
for(int i=;i<=n-;i++) cnt[i]=;
//for(int i=1;i<=2*D-1;i++) printf("%d\n",tree[i]);
for(int i=n;i>=;i--){
// printf("%d",query(1,x[i]+1));
tree[D+x[i]+]--;
update(D+x[i]+);
cnt[query(,x[i]+)]++;
}
for(int i=;i<n;i++) printf("%d\n",cnt[i]);
}
return ;
}
当然从前往后思考也是一样的,那样的话是不断将x添入线段树,这里有一份是学长的代码,果然比我反向思考的要简洁好多,而且从他的代码也得到了其实tree的底层在没有
得到顶点的必要时,也是可以不必强求定位1<<n这种2的几次方的大小的,而在这里正好适用,因为每次找个数和只求到i^j^1即可(这个代表左右子树);
代码如下:
#include <cstdio>
#include <cstring>
const int maxn = ;
int tree[maxn<<],a[maxn];
int N,D; void update(int i){
for(;i^;i >>= ){
tree[i>>] = tree[i]+tree[i^];
}
} int query(int x,int y){
int i = D+x-,j = D+y+,ans = ;
for(;i^j^;i >>= ,j >>= ){
if(~i&) ans += tree[i^];
if(j&) ans += tree[j^];
}
return ans;
} int main(){
while(scanf("%d",&N) != EOF){
memset(tree,,sizeof(tree));
memset(a,,sizeof(a));
D = ;
for(int i = ;i < N;i++){
int x,y;
scanf("%d%d",&x,&y);
a[query(,++x)]++;
tree[D+x]++;
update(D+x);
}
for(int i = ;i < N;i++) printf("%d\n",a[i]);
}
return ;
}
POJ 2352 star level的更多相关文章
- POJ 2352 Stars(线段树)
题目地址:id=2352">POJ 2352 今天的周赛被虐了. . TAT..线段树太渣了..得好好补补了(尽管是从昨天才開始学的..不能算补...) 这题还是非常easy的..维护 ...
- poj 2352 Stars 数星星 详解
题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...
- POJ 2352 Stars(树状数组)
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30496 Accepted: 13316 Descripti ...
- POJ 2352
---恢复内容开始--- http://poj.org/problem?id=2352 这是一个树状数组的题目,也是我第一次接触这类的题目,也正是因为之前的一道题,TLE了,超时太严重了,我看disc ...
- 【树状数组】POJ 2352 Stars
/** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...
- hdu 1541/poj 2352:Stars(树状数组,经典题)
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- POJ 2352 Stars(HDU 1541 Stars)
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 41521 Accepted: 18100 Descripti ...
- [POJ] 2352 Stars [线段树区间求和]
Stars Description Astronomers often examine star maps where stars are represented by points on a pla ...
- POJ 2352 && HDU 1541 Stars (树状数组)
一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...
随机推荐
- RHEL 7.2 源码安装Python 3.6.2报错
报错代码:zipimport.ZipImportError: can't decompress data; zlib not available 一条命令解决:yum install zlib-dev ...
- java学习第二章
- 关于c#的结构体struct与class的区别
C# 结构体 struct C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中 ...
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- js实现跨域的方法
由于同源策略的限制,XMLHttpRequest只允许请求当前源(包含域名.协议.端口)的资源. json与jsonp的区别: JSON是一种数据交换格式,而JSONP是一种依靠开发人员创造出的 ...
- UART协议
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART,读音/ˈjuːart/)是一种异步收发传输器,是电脑硬件的一部分,将资料由 ...
- 杨辉三角python的最佳实现方式,牛的不能再牛了
def triangles(): N = [1] while True: yield N N.append(0) N = [N[i-1] + N[i] for i in range(len(N))] ...
- Selenium私房菜系列1 -- Selenium简介
一.Selenium是什么? Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,本系列现在主要包括以下4款: 1.Selenium Core:支持DHTML的测试案 ...
- SAP CRM和Cloud for Customer中的Event handler(事件处理器)
SAP CRM可以在开发工具中用右键直接创建一个新的事件处理器: 这些事件处理器实际上就是UI控制器(Controller)上具有特定接口类型的方法. C4C UI的event handler 在C4 ...
- 使用JavaScript将当前页面保存成PDF,支持图片和文字的保存
前端开发的朋友们可能会遇到这个需求:将您负责开发的网页的全部内容,包括文字和图片,一起保存成一个PDF文件.如果采用屏幕截图的话,默认Windows操作系统的截图按钮无法完整截取超过一屏幕的屏幕内容. ...