poj3067 树状数组解决二维逆序对
2019-08-09 09:17
85 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43279710/article/details/98938256
一直在学习二维逆序对的解决方法,然后并没有搞明白,这是第一道自己搞出来的模板题。
POJ3067 JAPAN
题解:
设东部的城市为eie_iei,西部的城市为wiw_iwi,那么如果连接e1e_1e1w2w_2w2和连接e2e_2e2w1w_1w1的两条道路想形成交叉,必然有当e1<e2e_1 < e_2e1<e2时,w1&
3ff7
;gt;w2w_1 > w_2w1>w2,也就是说,题意所求的交叉数量一定是在eee有序的情况下,求www的逆序对数,所以我们先对eee排序,在用树状数组对www求逆序对数即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const int N = 10100; int n, m, k; ll num[N], c[N]; struct road{ ll e, w; }r[1010100]; bool cmp(road a, road b){ if(a.e != b.e) return a.e < b.e; return a.w <= b.w; } void add(int x, int y){ for(;x <= m; x += x & -x) c[x]+=y; } ll ask(int x){ ll ans = 0; for(;x;x -= x &-x) ans+=c[x]; return ans; } int main(){ int t; scanf("%d", &t); int cas = 0; while(t--){ scanf("%d%d%d",&n,&m,&k); memset(num, 0, sizeof(num)); memset(c, 0, sizeof(c)); for(int i = 1;i <= k; i++){ scanf("%lld%lld", &r[i].e, &r[i].w); } sort(r+1, r+k+1, cmp); ll ans = 0; for(int i = k; i; i--){ ans += ask(r[i].w - 1); add(r[i].w, 1); } printf("Test case %d: %lld\n", ++cas, ans); } return 0; }
相关文章推荐
- POJ3067:Japan(树状数组求逆序对)
- 【树状数组--求逆序数】poj3067 Japan
- POJ3067(树状数组逆序对)
- poj3067 Japan 树状数组求逆序对
- POJ3067:Japan(树状数组求逆序对)
- hdu1394求最小逆序----树状数组解决
- POJ3067 Japan【树状数组】【逆序数】
- HDOJ 题目2838 Cow Sorting(树状数组逆序对)
- [NOIP2013] 火柴排队 离散化 树状数组 逆序对
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
- POJ2299 树状数组求逆序对
- POJ3067 树状数组 情景转化为区间求和
- 二维树状数组~
- 2017.10.12 树状数组求逆序对
- 二维树状数组
- 树状数组求逆序对个数
- 【poj 1195】Mobile phones 二维树状数组
- poj1195 Mobile phones 二维线段树和二维树状数组两种做法 树套树
- 单调栈、单调队列、线段树、LCA、二维树状数组、Bitset讲解
- 二维树状数组详解