zoukankan      html  css  js  c++  java
  • [NOIP2013]火柴排队

    嘟嘟嘟

    首先可以想到,最小距离一定是a中第 i 大的和b中第 i 大的在同一行。

    然后先把a,b分别离散化,然后开一个标记数组,map[i]记录a中第 i 小的数在哪一个位置出现,然后对b数组处理一遍。

    题中说交换次数,自然想到逆序对,于是我们对新的b数组求一遍逆序对就行了。

     1     #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<cstdlib>
     7 #include<cctype>
     8 #include<stack>
     9 #include<queue>
    10 #include<vector>
    11 using namespace std;
    12 #define enter puts("")
    13 #define space putchar(' ')
    14 #define Mem(a, x) memset(a, x, sizeof(a))
    15 #define rg register
    16 typedef long long ll;
    17 typedef double db;
    18 const int INF = 0x3f3f3f3f;
    19 const db eps = 1e-8;
    20 const ll mod = 99999997;
    21 const int maxn = 1e5 + 5;
    22 inline ll read()
    23 {
    24   ll ans = 0;
    25   char ch = getchar(), las = ' ';
    26   while(!isdigit(ch)) las = ch, ch = getchar();
    27   while(isdigit(ch)) ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar();
    28   if(las == '-') ans = -ans;
    29   return ans;
    30 }
    31 inline void write(ll x)
    32 {
    33   if(x < 0) putchar('-'), x = -x;
    34   if(x >= 10) write(x / 10);
    35   putchar(x % 10 + '0');
    36 }
    37 
    38 int n;
    39 int a[maxn], b[maxn];
    40 ll ta[maxn], tb[maxn], f[maxn];
    41 ll c[maxn], sum = 0;
    42 
    43 int lowbit(int x)
    44 {
    45   return x & -x;
    46 }
    47 void add(int pos)
    48 {
    49   while(pos <= n)
    50     {
    51       c[pos]++;
    52       pos += lowbit(pos);
    53     }
    54 }
    55 ll query(int pos)
    56 {
    57   ll ret = 0;
    58   while(pos)
    59     {
    60       ret += c[pos];
    61       ret %= mod;
    62       pos -= lowbit(pos);
    63     }
    64   return ret;
    65 }
    66 
    67 int main()
    68 {
    69   n = read();
    70   for(int i = 1; i <= n; ++i) a[i] = read(), ta[i] = a[i];
    71   for(int i = 1; i <= n; ++i) b[i] = read(), tb[i] = b[i];
    72   sort(ta + 1, ta + n + 1);
    73   sort(tb + 1, tb + n + 1);
    74   for(int i = 1; i <= n; ++i) a[i] = lower_bound(ta + 1, ta + n + 1, a[i]) - ta;
    75   for(int i = 1; i <= n; ++i) b[i] = lower_bound(tb + 1, tb + n + 1, b[i]) - tb;
    76   for(int i = 1; i <= n; ++i) f[a[i]] = i;
    77   for(int i = 1; i <= n; ++i) b[i] = f[b[i]];
    78   for(int i = n; i; --i)
    79     {
    80       sum += query(b[i]); sum %= mod;
    81       add(b[i]);
    82     }
    83   write(sum); enter;
    84   return 0;
    85 }
    View Code
  • 相关阅读:
    oracle 分页sql
    Oracle 11g数据库详细安装步骤图解
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    MY SQL 两种安装方式
    在本地库不连接远远程库的情况下操作远程库-----sql server
    学习Java泛型(记得通配符)
    学习java泛型(还是集合)
    学习java011902迭代器
    学习Java-继续集合
  • 原文地址:https://www.cnblogs.com/mrclr/p/9720650.html
Copyright © 2011-2022 走看看