poj 2299 树状数组
来源:互联网 发布:知我者二三子典故 编辑:程序博客网 时间:2024/06/05 14:25
就是求每个数之前比他大的数的个数,然后因为数太大了,先离散化一下
注意一组测试数据
3
1
1
1
答案是0
还有结果是longlong
AC代码如下:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAX_N = 5e5;struct Node{ __int64 n; int id;};Node node[MAX_N+5];int num[MAX_N+5];int sum[MAX_N+5];int N;bool cmp( Node a, Node b ){ if( a.n > b.n ){ return false; }else{ return true; }}inline int lowbit( int x ){ return x & -x;}int getsum( int x ){ int ans = 0; while( x > 0 ){ ans += sum[x]; x -= lowbit( x ); } return ans;}void updata( int x, int val ){ while( x <= N ){ sum[x] += val; x += lowbit( x ); }}int main(){ while( scanf( "%d", &N ) && N ){ for( int i = 1; i <= N; i++ ){ scanf( "%I64d", &node[i].n ); node[i].id = i; } sort( node + 1, node + 1 + N, cmp ); num[node[1].id] = 1; for( int i = 2; i <= N; i++ ){ if( node[i].n == node[i-1].n ){ num[node[i].id] = num[node[i-1].id]; }else{ num[node[i].id] = num[node[i-1].id] + 1; } } memset( sum, 0, sizeof( sum ) ); __int64 ans = 0; for( int i = 1; i <= N; i++ ){ updata( num[i], 1 ); ans += i - getsum( num[i] ); } printf( "%I64d\n", ans ); } return 0;}/*3111答案是0*/
0 0
- poj 2299 树状数组
- POJ 2299 树状数组
- poj 2299 树状数组
- Poj 2299 树状数组
- POJ 2299 树状数组
- poj 2299(树状数组)
- POJ 2299 (树状数组)
- poj 2299 树状数组入门
- poj 2299 poj 2481 树状数组
- poj 2299 逆序数树状数组
- poj 2299树状数组求逆序数
- POJ 2299 树状数组+离散化
- poj 2299 树状数组+离散化
- poj 2299 Ultra-QuickSort (树状数组解法)
- poj - 2299 - Ultra-QuickSort(树状数组)
- [树状数组]POJ 2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort(树状数组)
- Poj 2299 Ultra-QuickSort 树状数组 解法
- 关于qt的QGraphicsPathItem无法获得鼠标事件的解决方法
- 链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)
- poj3295
- linux - cannot execute binary file
- 浅析VO、DTO、DO、PO的概念、区别和用处
- poj 2299 树状数组
- G - Self Numbers(2.2.1)
- C语言 经典练习 输出当前时间的下一秒
- ubuntu安装及使用wine
- poj 1163数字三角形问题--动态规划
- [深入浅出Cocoa]iOS程序性能优化
- java面试题【递归】和【循环】的考察7月中旬
- iOS解析---WebView和js交互原理
- HDU - 1213 How Many Tables (简单并查集)