当前位置: 首页 > news >正文

线段树+树状数组+贪心 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) ? '\n' : ' ');
126         }
127     }
128 
129     return 0;
130 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4693731.html

相关文章:

  • 批处理命令拷贝文件
  • 我4年前写的第一个ruby程序
  • c# 调用c DLL 所传参数不正确
  • 离职那天我们复员——Leo网上答疑53
  • Spark工作机制-调度与任务分配
  • DT大数据梦工厂 第74讲
  • TCP SYN-Cookie背后的人和事
  • Unity3D NGUI 点击穿透问题的解决方案
  • C++ VS C#(4):枚举,结构体
  • 字节对齐问题 --- 莫名其妙的crash
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • 物联网系统设计初稿
  • Python xlsx 读取
  • S3C2440-启动分析
  • 2.3 js基础--DOM
  • 2017-09-12 前端日报
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android优雅地处理按钮重复点击
  • Angular 响应式表单之下拉框
  • axios 和 cookie 的那些事
  • css的样式优先级
  • Golang-长连接-状态推送
  • Less 日常用法
  • mongodb--安装和初步使用教程
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • V4L2视频输入框架概述
  • vue学习系列(二)vue-cli
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 力扣(LeetCode)357
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 线性表及其算法(java实现)
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用jquery写贪吃蛇
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 在Docker Swarm上部署Apache Storm:第1部分
  • FaaS 的简单实践
  • ​水经微图Web1.5.0版即将上线
  • #pragma 指令
  • #图像处理
  • #预处理和函数的对比以及条件编译
  • ${ }的特别功能
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (二)Linux——Linux常用指令
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (五)MySQL的备份及恢复
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Remoting学习笔记(三)信道
  • .NET 依赖注入和配置系统
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net中间语言BeforeFieldInit