zoukankan      html  css  js  c++  java
  • 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations

    题目传送门

      1 /*
      2     题意:不懂。。。
      3     线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面)。线段树维护最大值,树状数组维护区间是否是循环节,查找前面最左边不是循环节的可用二分。我还是云里雾里的,看懂了网上的解题报告但还是不是完全明白题意:(
      4     详细解释:http://blog.csdn.net/qq_24451605/article/details/47173933
      5 */
      6 /************************************************
      7 Author        :Running_Time
      8 Created Time  :2015-8-1 9:31:45
      9 File Name     :L.cpp
     10 *************************************************/
     11 
     12 #include <cstdio>
     13 #include <algorithm>
     14 #include <iostream>
     15 #include <sstream>
     16 #include <cstring>
     17 #include <cmath>
     18 #include <string>
     19 #include <vector>
     20 #include <queue>
     21 #include <deque>
     22 #include <stack>
     23 #include <list>
     24 #include <map>
     25 #include <set>
     26 #include <bitset>
     27 #include <cstdlib>
     28 #include <ctime>
     29 using namespace std;
     30 
     31 #define lson l, mid, rt << 1
     32 #define rson mid + 1, r, rt << 1 | 1
     33 typedef long long ll;
     34 const int MAXN = 1e5 + 10;
     35 const int INF = 0x3f3f3f3f;
     36 const int MOD = 1e9 + 7;
     37 int a[MAXN], pos[MAXN], ans[MAXN];
     38 int n;
     39 struct Segment_Tree {
     40     int mx[MAXN<<2];
     41     void push_up(int rt)    {
     42         mx[rt] = max (mx[rt<<1], mx[rt<<1|1]);
     43     }
     44     void build(int l, int r, int rt)    {
     45         if (l == r) {
     46             mx[rt] = a[l];  return ;
     47         }
     48         int mid = (l + r) >> 1;
     49         build (lson);   build (rson);
     50         push_up (rt);
     51     }
     52     void updata(int p, int l, int r, int rt)    {
     53         if (l == r) {
     54             mx[rt] = -a[l];    return ;
     55         }
     56         int mid = (l + r) >> 1;
     57         if (p <= mid)  updata (p, lson);
     58         else    updata (p, rson);
     59         push_up (rt);
     60     }
     61     int query(int ql, int qr, int l, int r, int rt) {
     62         if (ql <= l && r <= qr) {
     63             return mx[rt];
     64         }
     65         int mid = (l + r) >> 1; int ret = -INF;
     66         if (ql <= mid)  ret = max (ret, query (ql, qr, lson));
     67         if (qr > mid)   ret = max (ret, query (ql, qr, rson));
     68         return ret;
     69     }
     70 }st;
     71 struct BIT  {
     72     int c[MAXN];
     73     void init(void) {
     74         memset (c, 0, sizeof (c));
     75     }
     76     void updata(int i, int x)   {
     77         while (i <= n)  {
     78             c[i] += x;  i += i & (-i);
     79         }
     80     }
     81     int query(int i)    {
     82         int ret = 0;
     83         while (i)   {
     84             ret += c[i];    i -= i & (-i);
     85         }
     86         return ret;
     87     }
     88 }bit;
     89 
     90 int my_binary_search(int l, int r)   {
     91     int t = r;
     92     while (l != r)   {
     93         int mid = (l + r) >> 1;
     94         if (bit.query (t) - bit.query (mid) > 0)    l = mid + 1;
     95         else    r = mid;
     96     }
     97     return l + 1;
     98 }
     99 
    100 int main(void)    {       //HDOJ 5338 ZZX and Permutations
    101     int T;  scanf ("%d", &T);
    102     while (T--) {
    103         scanf ("%d", &n);
    104         for (int i=1; i<=n; ++i)    {
    105             scanf ("%d", &a[i]);    pos[a[i]] = i;
    106         }
    107         st.build (1, n, 1); bit.init ();
    108         for (int i=1; i<=n; ++i)    {
    109             int p = pos[i];
    110             if (bit.query (p) - bit.query (p-1) > 0)    {
    111                 ans[i] = a[p+1];    continue;
    112             }
    113             int v1 = -1;
    114             if (p != n && bit.query (p+1) - bit.query (p) == 0) v1 = a[p+1];
    115             int l = my_binary_search (0, p);
    116             int v2 = st.query (l, p, 1, n, 1);  int p2 = pos[v2];
    117             if (v2 > v1)    {
    118                 ans[i] = v2;    for (int i=p2; i<=p; ++i)   bit.updata (i, 1);
    119             }
    120             else    {
    121                 ans[i] = v1;    st.updata (p + 1, 1, n, 1);
    122             }
    123         }
    124         for (int i=1; i<=n; ++i)    {
    125             printf ("%d%c", ans[i], (i == n) ? '
    ' : ' ');
    126         }
    127     }
    128 
    129     return 0;
    130 }
    编译人生,运行世界!
  • 相关阅读:
    安装Linux应用软件的五种基本方法
    gprof使用介绍
    Linux内核对象模型(subsystem,kset,kobject)
    kernel 目录 解析
    linux板级设备的初始化过程(转)
    Linux下I2C驱动程序的分析
    I2C总线设备驱动解析
    linux proc文件系统学习 (转)
    cscope的用法
    mvc3 Razor PartialView视图中Html.DropDownList用法
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4693731.html
Copyright © 2011-2022 走看看