poj2352题解
来源:互联网 发布:免费抠图软件 编辑:程序博客网 时间:2024/05/21 11:27
线段树经典入门题,线段树本弱是一个半月前听的课,没练题,今天第一次做线段树,一个半小时。。。。
这道题由于数据给出是按y递增的,所以难度降低了,否则应该是先根据y大小由小到大来排序。刚开始我不知道要维护那些数据,翻了一下当时的课件,才渐渐理解只需记录元素个数。。。。tree数组要比maxn大两倍(理论上好像是,一般直接三倍)
#include <stdio.h>#include <string.h>int level[15001],N,tree[96000];int x[32001];void Buildtree(int tn,int left,int right,int x){ int mid; if(left==right) {tree[tn]++; return;} mid=(left+right)>>1; if(mid>=x) Buildtree(tn<<1,left,mid,x); else Buildtree(tn<<1|1,mid+1,right,x); tree[tn]=tree[tn<<1]+tree[tn<<1|1];}int Find(int tn,int left,int right,int x){ int mid; if(left==right) return tree[tn]; mid=(left+right)>>1; if(mid>=x) return Find(tn<<1,left,mid,x); else return tree[tn<<1]+Find(tn<<1|1,mid+1,right,x);}int main(int argc, char const *argv[]){ int i,tmpx,tmpy; scanf("%d",&N); memset(level,0,15001*sizeof(int));/*没有这个也可以,因为是在函数外开的,初始值也是0*/ memset(tree,0,96000*sizeof(int)); for(i=0;i<N;i++) { scanf("%d %d",&tmpx,&tmpy); Buildtree(1,0,32000,tmpx); level[Find(1,0,32000,tmpx)-1]++; } for(i=0;i<N;i++) printf("%d\n",level[i] ); return 0;}
0 0
- poj2352题解
- POJ2352
- poj2352
- POJ2352
- POJ2352
- poj2352
- poj2352
- POJ2352
- poj2352
- poj2352
- poj2352
- POJ2352
- POJ2352
- poj2352
- Poj2352
- poj2352
- POJ2352
- poj2352
- 家谱 并差集
- JAVA设计模式--原型模式
- 剑指Offer——字符流中第一个不重复的字符
- [drp 6]接口和抽象类的区别,及其应用场景
- 奶牛接力 矩阵乘法
- poj2352题解
- 使用 ormlite 操作已有数据库
- JUnit单元测试--JUnit简介
- 10267 - Graphical Editor
- csu 1329 一行盒子
- 《剑指offer》-数组中出现次数超过一半的数字
- Node.js简介
- KL 散度(从动力系统到推荐系统)
- 沼泽鳄鱼 矩阵乘法