POJ 3061 Japan

来源:互联网 发布:淘宝v任务平台下载 编辑:程序博客网 时间:2024/06/11 12:19
#ifdef _DEBUG#pragma warning(disable : 4996)#endif#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define CLOSE() ios::sync_with_stdio(false)#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define PF(a) printf("%d\n", a)#define SF(a) scanf("%d", &a)#define SFF(a, b) scanf("%d%d", &a, &b)#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define MAXN 1000005#define MAXM 1005#define MOD 1000007#define INF 2147483648using namespace std;//-------------------------CHC------------------------------////POJ 3061 Japan//这题虽然直接就想到了求逆序数,但是对于x相等的情况的处理想了好久。。。//只要排个序就好啦。。在x相等时保持y的大小,就不会计数了。//sum计算的是包括等于的数,update的前后决定了是否算入了自身。#define lowbit(a)  a & -astruct A {int x, y;bool operator<(const A &r) const {if(x != r.x) return x < r.x;else return y < r.y;}}a[MAXN];int bit[MAXM], m;void Update(int i, int val) {while (i <= m) {bit[i] += val;i += lowbit(i);}}int sum(int i) {int ret = 0;while (i) {ret += bit[i];i -= lowbit(i);}return ret;}int main() {int T, kase = 1;SF(T);while (T--) {CLEAR(bit, 0);int n, k;SFF(n, m); SF(k);FOR(i, 0, k) SFF(a[i].x, a[i].y);sort(a, a + k);LL ans = 0;for (int i = k - 1; i >= 0; --i) {ans += sum(a[i].y);ans -= sum(a[i].y) - sum(a[i].y - 1);Update(a[i].y, 1);}printf("Test case %d: ", kase++);printf("%lld\n", ans);}return 0;}