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

BZOJ1106 [POI2007]立方体大作战tet

时间:2014-10-31 23:36:56      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

考试前刷刷水感觉还是不错的。

 对于某两个相同的数,若中间未被匹配的数(即只出现一次的数)的数量为x,则至少要交换x次。

于是用树状数组维护1 - n中的未被匹配的数的个数即可。

(为什么蒟蒻觉得有O(n)的做法。。。不科学。。。)

 

bubuko.com,布布扣
 1 /**************************************************************
 2     Problem: 1106
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:164 ms
 7     Memory:1976 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11  
12 using namespace std;
13 const int N = 100005;
14 int n, ans;
15 int a[N], BIT[N], l[N];
16  
17 inline int read(){
18     int x = 0, sgn = 1;
19     char ch = getchar();
20     while (ch < 0 || ch > 9){
21         if (ch == -) sgn = -1;
22         ch = getchar();
23     }
24     while (ch >= 0 && ch <= 9){
25         x = x * 10 + ch - 0;
26         ch = getchar();
27     }
28     return sgn * x;
29 }
30  
31 inline int lowbit(int x){
32     return x & -x;
33 }
34  
35 inline int query(int x){
36     int res = 0;
37     for (; x; x -= lowbit(x))
38         res += BIT[x];
39     return res;
40 }
41  
42 inline void add(int x, const int del){
43     for (; x <= n; x += lowbit(x))
44         BIT[x] += del;
45 }
46  
47 int main(){
48     n = read(), n <<= 1;
49     int i;
50     for (i = 1; i <= n; ++i)
51         a[i] = read();
52     for (i = 1; i <= n; ++i)
53         if (!l[a[i]]) add(i, 1), l[a[i]] = i;
54         else{
55             ans += query(i) - query(l[a[i]]);
56             add(l[a[i]], -1);
57         }
58     printf("%d\n", ans);
59     return 0;
60 }
View Code

 

BZOJ1106 [POI2007]立方体大作战tet

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/rausen/p/4066166.html

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