P1966 火柴排队

P1966 火柴排队
进行映射,然后求逆序对即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<cstring>
11 #define inf 2147483647
12 #define For(i,a,b) for(register int i=a;i<=b;i++)
13 #define p(a) putchar(a)
14 #define g() getchar()
15 #define mod 99999997
16 //by war
17 //2017.11.8
18 using namespace std;
19 int n;
20 int a[100010];
21 int b[100010];
22 int c[100010];
23 int t[100010];
24 int ans;
25 void in(int &x)
26 {
27     int y=1;
28     char c=g();x=0;
29     while(c<'0'||c>'9')
30     {
31     if(c=='-')
32     y=-1;
33     c=g();
34     }
35     while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
36     x*=y;
37 }
38 void o(int x)
39 {
40     if(x<0)
41     {
42         p('-');
43         x=-x;
44     }
45     if(x>9)o(x/10);
46     p(x%10+'0');
47 }
48 
49 void modify(int k)
50 {
51     for(;k<=n;k+=(-k)&k)
52     t[k]++;
53 }
54 
55 int get(int k)
56 {
57     int cnt=0;
58     for(;k>0;k-=(-k)&k)
59     cnt=(cnt+t[k])%mod;
60     return cnt;
61 }
62 
63 int main()
64 {
65     in(n);
66     For(i,1,n)
67     in(a[i]),c[a[i]]=i;
68     For(i,1,n)
69     in(b[i]),b[i]=c[b[i]];
70     For(i,1,n)
71     {
72         if(b[i]!=0)
73         {
74         modify(b[i]);
75         ans=(ans+i-get(b[i]))%mod;    
76         }
77         else
78         {
79         modify(n);
80         ans=(ans+i-get(n))%mod;    
81         }
82     }
83     o(ans%mod);
84      return 0;
85 }

 

posted @ 2017-11-08 19:35  WeiAR  阅读(153)  评论(0编辑  收藏  举报