您的位置:首页 > 其它

树状数组求逆序和模板

2011-07-16 22:43 316 查看
C++ code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define lowbit(i) (i & -i);

using namespace std;

struct lines
{
long l, r, i;
}line[30001];
bool cmp_1(lines, lines);
bool cmp_2(lines, lines);

int main()
{
long A, B, n, i, k, b, T[30001], m, j;

while(scanf("%ld%ld", &A, &B) == 2)
{
scanf("%ld", &n);
for(i = 1; i <= n; i++)
{
scanf("%ld%ld", &k, &b);
line[i].l = k * A + b;
line[i].r = k * B + b;
T[i] = lowbit(i);
}
sort(line + 1, line + n + 1, cmp_1);
for(i = 1; i <= n; i++)
line[i].i = i;
sort(line + 1, line + n + 1, cmp_2);
T[0] = m = 0;
for(i = 1; i <= n; i++)
{
j = line[i].i - 1;
while(j)
{
m += T[j];
j -= lowbit(j);
}
j = line[i].i;
while(j <= n)
{
T[j]--;
j += lowbit(j);
}
}
printf("%ld\n", n + m + 1);
}

return 0;
}

bool cmp_1(lines a, lines b)
{
return a.l > b.l;
}

bool cmp_2(lines a, lines b)
{
return a.r > b.r;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: