poj3067 树状数组

来源:互联网 发布:用c 计算矩阵特征值 编辑:程序博客网 时间:2024/05/17 04:46

日本有N个城市在东海岸,有M个城市在西海岸,有K条高速公路将要被建,高速公路端点分别是东海岸和西海岸的一个城市,问这K条公路有多少交点

这里写图片描述

代码:

#include <iostream>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <map>#define MST(s,q) memset(s,q,sizeof(s))#define INF 0x3f3f3f3f#define MAXN 1000005#define Lchild id<<1#define Rchild (id<<1)+1inline int lowbit(int x) {return x & (-x);}using namespace std;struct edge{    int u, v;} Edge[MAXN];bool cmp(edge a, edge b) {    if (a.u == b.u)        return a.v < b.v;    return a.u < b.u;}int t[MAXN];void update(int x, int N) {    while (x <= N) {        t[x]++;        x += lowbit(x);    }}long long getsum(int x) {    long long ans = 0;    while (x > 0) {        ans += t[x];        x -= lowbit(x);    }    return ans;}int main() {    int N, M, K, T, icase = 1;    cin >> T;    while (T--) {        scanf("%d%d%d", &N, &M, &K);        for (int i = 1; i <= K; i++)            scanf("%d%d", &Edge[i].u, &Edge[i].v);        sort(Edge + 1, Edge + 1 + K, cmp);        memset(t, 0, sizeof(t));        long long sum = 0;        for (int i = 1; i <= K; i++)        {            update(Edge[i].v, M);            sum += getsum(M) - getsum(Edge[i].v);        }        printf("Test case %d: %lld\n", icase++ , sum );    }}
0 0
原创粉丝点击