hdu 2481 树状数组 双关键字排阻
2481这道水题坑了我三天。。。。。数组超界10W让我的6.0崩溃了。。。。然后由于不懂。。。重装了一边。。。。
不扯了。。。讲思想。。
把s看成x,e看成y,于是,每次输入就相当于输入一组点,看了网上的攻略,知道了按x排序会超时(这里要先按一个关键字排序),于是我就建立一个yox的坐标系(y为横坐标)按y为关键字,从大到小排序
简单画图,就会发现,我们要求出的值为每个点左上方的点的个数。
对每个点的x坐标值 作为树状数组下标,进行累加,然后再用一个数组resr对应原本输入次序的点
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <fstream>using namespace std;
#define N 100005 typedef struct _node
{int x;int y;int id;
}NODE , *PTNODE;int n;
NODE node[N];
int resr[N];
int tree[N];
const int max_n = 100001;bool cmp( const NODE& a , const NODE& b )
{if( a.y != b.y )return a.y > b.y ;return a.x < b.x;
}int lowb( int idx ){ return idx&(-idx); }
void up_add( int idx , int x )
{ for( ; idx < max_n ; tree[idx] += x , idx += lowb(idx) ); }
int sum( int idx )
{int res = 0;for( ; idx > 0 ; res += tree[idx] , idx -= lowb(idx) );return res;
}int main()
{int i,j;//ifstream fin;//fin.open("concavie.txt");while( ~scanf("%d",&n) ){memset( node , 0 , sizeof(node) );memset( resr , 0 , sizeof(resr) );memset( tree , 0 , sizeof(tree) );for( i = 1 ; i <= n ; i++ ){scanf("%d%d", &node[i].x , &node[i].y);//fin >> node[i].x >> node[i].y;node[i].x++;node[i].y++;//node[i].x = max_n - node[i].x;//node[i].y = max_n - node[i].y;node[i].id = i;}sort( node+1 , node+n+1 , cmp );//for( i = 1 ; i <= n ; i++ )// cout << node[i].id << ' ' << node[i].x-1 << ' ' << node[i].y-1 << endl; // cout << endl;up_add( node[1].x , 1 );for( i = 2 ; i <= n ; i++ ){if( node[i].x == node[i-1].x && node[i].y == node[i-1].y )resr[ node[i].id ] = resr[ node[i-1].id ];else resr[ node[i].id ] = sum( node[i].x );up_add( node[i].x , 1 );}cout << resr[1];for( i = 2 ; i <= n ; i++ )cout << ' ' << resr[i];cout << endl;}return 0;
}
hdu 2481 树状数组 双关键字排阻相关推荐
- HDU 4358 树状数组+思路
http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1166 树状数组解
树状数组解决 (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...
- hdu 3333 树状数组+离线处理
思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...
- hdu 4417(树状数组+离线算法)
解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
- Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
题意 给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1 ...
- hdu 4970 树状数组 “改段求段”
题意:塔防.给1--n,给出m个塔,每个塔有攻击力,给出k个怪兽的位子和血量,问有几只可以到达n点. 今天刚刚复习了树状数组,就碰到这个题,区间更新.区间求和类型.第三类树状数组可以斩. 注意一下大数 ...
- hdu 1541 树状数组版)——咯咯
/*树状数组版*/ #include<stdio.h> #include<string.h> #define L 32005 #define N 15005 int tree[ ...
最新文章
- Nginx, HTTPS的配置
- 开年趣图汇总:对不起,让你笑了这么久
- u 20ubuntu 安装 postfix_极力推荐和田咨询问题U型钢托盘厂家
- C语言程序设计打鱼还是晒网,C语言编程三天打鱼两天晒网
- 【job】面试中常见的笔试梳理
- 如何在Docker中列出容器
- Ubuntu怎么从图形桌面切换到命令行界面
- vmvare虚拟机地址总是更换的解决方法
- python3详细安装教程
- Twaver-HTML5基础学习(14)连线(Link)连线类型(直线、延伸直线、正交直线)
- SE96X、CM500-I27条码扫描引擎使用经验
- html写的3d烟花带字幕,Three.js 3D烟花绽放动画
- HBase 数据库检索性能优化策略
- 大学物理-震动波动光学
- 心蓝12306订票助手
- C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt
- 全志H3-NanoPi开发板SDK之一总体概述
- 【Java基础】Java输入输出(IO)流
- JSP基础语法-动作(Action)
- Unity实现围绕另一物体旋转