码迷,mamicode.com
首页 > 其他好文 > 详细

noip2013t1:逆序对

时间:2015-11-09 20:59:38      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

树状数组求逆序对:

------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
 int x=0;
 char c=getchar();
 while(!isdigit(c)) c=getchar();
 while(isdigit(c)){
  x=x*10+c-‘0‘;
  c=getchar();
 }
 return x;
}
struct node{
 int cur,w;
 bool operator<(const node&rhs)const{
  return rhs.w<w;
    }
};
node a[100005];
node b[100005];
int f[100005];
int c[100005];
int n;
const int mod=99999997;
int lowbit(int x){
 return x&-x;
}
void insert(int x){
 for(int i=x;i<=n;i+=lowbit(i))
   c[i]++;
}
int find(int x){
 int ans=0;
 for(int i=x;i>0;i-=lowbit(i)){
  ans+=c[i];
 }
 return ans;
}
int main(){
 n=read();
 rep(i,n){
  a[i].w=read(),a[i].cur=i;
 }
 rep(i,n){
  b[i].w=read(),b[i].cur=i;
 }
 sort(a+1,a+n+1);
 sort(b+1,b+n+1);
 
 rep(i,n){
  f[a[i].cur]=b[i].cur;
 }
 /*rep(i,n){
  cout<<f[i]<<" ";
 }*/
 int ans=0;
 rep(i,n){
  ans=(ans+i-1-find(f[i]))%mod;
  insert(f[i]);
 }
 printf("%d\n",ans);
 return 0;
}

------------------------------------------------------------------------------------

noip2013t1:逆序对

标签:

原文地址:http://www.cnblogs.com/fighting-to-the-end/p/4950937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!