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,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...
随机推荐
- linux给文件或目录添加apache权限
系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: ...
- PHP 讓 json_encode() 指定回傳格式
PHP 回傳 JSON 很方便, 只要將資料經過 json_encode() 就解決了. 不過因為 PHP 自動轉換型別, 造成很多資料都習慣存成字串, 希望在輸出 JSON 的時候, 數字部份可以輸 ...
- mvc报( 检测到有潜在危险的 request.form 值 )错的解决方案
今天在做项目中遇到了报( 检测到有潜在危险的 request.form 值 )错,百度过后解决了该问题,出此问题主要还是因为提交的Form中有HTML字符串,例如你在TextBox中输入了html标签 ...
- markdown快捷键(转)
markdown快捷键 GLYPH NAME COMMAND Command, Cmd, Clover, (formerly) Apple ALT Option, Opt, (Windows) Alt ...
- JS进阶-特殊形式的函数-内部私有函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- layout转Bitmap
业务需求详细描述:最近产品说要在分享的商品图中添加一些其他图片和文字,然后拼接为一张图片,再分享到微信朋友圈,于是我就一脸懵逼了,但是没办法还是得做额! 然后整理了一下思路,主要有这么两条路线: 自己 ...
- EJB2的配置
1. ejb-jar.xml <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns=&q ...
- javascript动态添加、修改、删除对象的属性与方法
在其他语言中,对象一旦生成,就不可更改了,要为一个对象添加修改成员必须要在对应的类中修改,并重新实例化,而且程序必须经过重新编译.JavaScript 中却非如此,它提供了灵活的机制来修改对象的行为, ...
- 洛谷 P1361 小猫爬山
题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道上的缆车最大承重量为W ...
- selelinum+PhantomJS 爬取拉钩网职位
使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘 拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的. 我们不 ...