我是靠谱客的博主 怕孤单狗,最近开发中收集的这篇文章主要介绍三元逆序对 求ia[j]>a[k] 的对数 树状数组Codeforces 61E Enemy is weak ,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
http://codeforces.com/problemset/problem/61/E
题意是求 i<j<k && a[i]>a[j]>a[k] 的对数
如果只有2元组那就是求逆序数的做法
三元组的话就用一个树状数组x表示 数字i前面有多少个比自己大的个数
然后每次给这个y数组求和,再把x中>a[i]的个数存入y中即可
即使是4元也可以求了#include <algorithm>
#include <cctype>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <climits>
#include <vector>
#include<iostream>
using namespace std;
#define ll long long
inline void rd(int &ret)
{
char c;
do { c = getchar();
} while(c < '0' || c > '9');
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
#define N 1000005
#define eps 1e-8
#define inf 1000000
ll n;
struct node{
ll c[N];
inline ll lowbit(ll x){return x&-x;}
void init(){memset(c, 0, sizeof c);}
ll sum(ll x){
ll ans = 0;
while(x<=n+10)
ans += c[x], x+=lowbit(x);
return ans;
}
void change(ll x, ll y){
while(x)
c[x] +=y, x-=lowbit(x);
}
}x, y;
int haifei[1000000], panting[1000000];
int main()
{
ll i, j;
while(cin>>n)
{
ll ans = 0;
for(i = 0; i < n; i++)rd(haifei[i]), panting[i] = haifei[i];
x.init(); y.init();
sort(haifei, haifei+n);
for(i = 0; i < n; i++)
{
ll b = (lower_bound(haifei, haifei+n, panting[i]) - haifei) +1;
ll siz = y.sum(b);
ans += siz;
y.change(b, x.sum(b));
x.change(b, 1);
}
cout<<ans<<endl;
}
return 0;
}
最后
以上就是怕孤单狗为你收集整理的三元逆序对 求i
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复