POJ 3067 Japan—— 树状数组
来源:互联网 发布:淘宝实名资料 编辑:程序博客网 时间:2024/04/25 22:01
题目链接点击打开链接
题意:说的很麻烦,其实就是左边竖着一坨数,右边竖着一坨数,两边分别按大小排好后,根据题目的输入信息,两坨数中的一对一对的连起来,这些线段任意三条不相交于同一个点,求共有多少个交点。
思路:就是求逆序对。即使不了解逆序对,在纸上把样例画一画,思路就有了。
PS 这题的最终结果要用long long,因为这个WA了三发。。。
这题我把sum和update稍微改动了一下,求和是从1到i,更新是从i到m 这样直接求就可以了。不用再用sum(m)减了。
AC代码:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<iomanip>#include<algorithm>#include<cmath>const int MAX=0x7fffffff;using namespace std;const int Max=1005;int c[Max],n,m;struct node{ int sta,ed;}cross[1000005];bool cmp(node a,node b){ if(a.sta==b.sta) return a.ed<b.ed; return a.sta<b.sta;}int lowbit(int x){ return x & (-x);}void update(int i, int x){ while(i>=1) { c[i] = c[i]+x; i -= lowbit(i); }}int sum(int i){ int ans = 0; while(i<=m+1) { ans += c[i]; i += lowbit(i); } return ans;}int main(){ int t,cas=1; scanf("%d",&t); for(cas;cas<=t;cas++) { memset(c,0,sizeof(c)); int k,i; long long ans=0; scanf("%d%d%d",&n,&m,&k); for(i=0;i<k;i++) scanf("%d%d",&cross[i].sta,&cross[i].ed); sort(cross,cross+k,cmp); for(i=0;i<k;i++) { ans+=sum(cross[i].ed+1); update(cross[i].ed,1); } printf("Test case %d: %lld\n",cas,ans); } return 0;}
0 0
- POJ 3067 Japan—— 树状数组
- POJ 3067—— Japan(树状数组)
- BIT (树状数组) ——Poj 3067 Japan
- POJ 3067 Japan【树状数组】
- poj 3067 japan 树状数组
- poj 3067 树状数组 Japan
- POJ 3067 Japan 树状数组
- POJ 3067 Japan 树状数组
- poj 3067 - Japan(树状数组)
- 树状数组 - POJ 3067 Japan
- Poj 3067 Japan 树状数组
- Poj 3067 Japan【树状数组】
- POJ 3067Japan 树状数组
- POJ 3067 Japan(树状数组)
- POJ 3067 Japan 树状数组
- POJ 3067 Japan 树状数组 .
- POJ 3067 Japan 树状数组
- poj 3067 Japan(树状数组)
- STL系列之六 set与hash_set
- [leetcode] Remove Duplicates from Sorted Array
- uva714 - Copying Books(最大值最小化)
- 九度题目1109:连通图
- STL系列之七 快速计算x的n次幂 power()的实现
- POJ 3067 Japan—— 树状数组
- HDU2242 考研路茫茫——空调教室
- 3n+1b 备忘录方法
- 设计模式——之动态代理 笔记
- 深入研究Servlet线程安全性问题
- STL系列之八 slist单链表
- 矿工冒险记
- (转自知乎)如何看待 Google 说已经停用 Map Reduce 好多年?
- MDK-ARM(Keil uVision V4.72)上STM32开发环境配置