您的位置:首页 > 其它

[noip2013]火柴排队

2016-10-09 21:20 302 查看
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

[b]

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<map>
#include<set>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
using namespace std;
#define LL long long
#define up(i,j,n) for(int i=(j);(i)<=(n);(i)++)
#define max(x,y) ((x)<(y)?(y):(x))
#define min(x,y) ((x)<(y)?(x):(y))
#define FILE "1"
const int maxn=101000,mod=99999997;
int n,c[maxn];
struct node{
int num,id;
bool operator<(const node& b)const{return num<b.num;}
}a[maxn],b[maxn];
int read(){
bool flag=0;char ch=getchar();int x=0;
while(ch>'9'||ch<'0'){if(ch=='-')flag=1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return flag?-x:x;
}
int d[maxn];
int lowbit(int x){return x&-x;}
void add(int x){while(x<=n){d[x]+=1;x+=lowbit(x);}}
LL get(int x){LL ans=0;while(x>0)ans=(ans+d[x])%mod,x-=lowbit(x);return ans;}
void getni(){
LL ans=0;
up(i,1,n){
ans=(ans+get(n+1-c[i]))%mod;
add(n+1-c[i]);
}
printf("%I64d\n",ans);
}
void init(){
scanf("%d",&n);
up(i,1,n)a[i].num=read(),a[i].id=i;
up(i,1,n)b[i].num=read(),b[i].id=i;
sort(a+1,a+n+1);sort(b+1,b+n+1);
up(i,1,n)c[a[i].id]=b[i].id;
getni();
}
int main(){
init();
return 0;
}


View Code
主要是第一个版本映射写的太辣鸡了点;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: