D. Restore Permutation(权值线段树)
时间:2019-08-26
本文章向大家介绍D. Restore Permutation(权值线段树),主要包括D. Restore Permutation(权值线段树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题解:首先我们需要建立一个权值线段树,节点的权值分别是1~n,然后我就只需要逆序遍历si数组,找到大于s[i] + 1的数,这个数就是当前位置的值。注意的是,如果我们找到了那个数,就要将那个位置的权值赋为0,表示该数已经用过了。
#include <iostream> #include <cstdio> using namespace std; const int maxn = 2e5+7; typedef long long ll; ll s[maxn], ans[maxn], tree[maxn << 2]; void update(int root, int l, int r, int pos, ll val) { if(l == r) { tree[root]= val; return; } int mid = (l + r) >> 1; if(pos <= mid) { update(root << 1, l, mid, pos, val); } else { update(root << 1 | 1, mid + 1, r, pos, val); } tree[root] = tree[root << 1] + tree[root << 1 | 1]; } int query(int root, int l, int r, ll val) { if(l == r) { return tree[root]; } int mid = (l + r) >> 1; if(tree[root << 1] >= val) { return query(root << 1, l, mid, val); } else { return query(root << 1 | 1, mid + 1, r, val - tree[root << 1]); } } int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%I64d", &s[i]); update(1, 1, n, i, i * 1LL); //建立一颗权值线段树 } for(int i = n; i >= 1; i--) { ans[i] = query(1, 1, n, s[i] + 1LL); //找到大于si + 1的这个数 update(1, 1, n, ans[i], 0LL); //权值赋0 } for(int i = 1; i <= n; i++) { printf("%I64d ", ans[i]); } return 0; }
原文地址:https://www.cnblogs.com/buhuiflydepig/p/11410967.html
- 深度强化学习-DDPG算法原理和实现
- 你绝对想不到,数据地图还能这么玩~
- TensorFlow从0到1 - 17 - Step By Step上手TensorBoard
- 深度强化学习-Actor-Critic算法原理和实现
- 深度强化学习-Policy Gradient基本实现
- TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑
- 买卖股票算法题的后续!
- 一个例子教你如何与出题人斗智斗勇
- 用数据来聊聊国产电影~
- 如何买卖股票?不要慌,我有妙招!
- 2017.11.7解题报告
- TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
- 让priority_queue支持小根堆的几种方法
- 一招解决4道leetcode hard题,动态规划在字符串匹配问题中的应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解析 HashMap 源码之基本操作
- Docker手册
- 小知识:TFA收集日志报错空间不足
- Java SPI 居然这么多知名框架在用
- Ceph 入门到实战之 RBD 块存储接口
- 聊聊 Python 面试最常被问到的几种设计模式(下)
- 带你用 Python 实现自动化群控(入门篇)
- 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)
- 在kali linux中你应该知道的信息收集姿势(一)
- 【拓展】谈谈字符编码:Unicode编码与emoji表情编码
- TCP/IP 应用层协议解释
- Cisco Packet Tracer服务器模拟搭建
- Python3调用Google翻译
- 打造最强移动测试平台
- 微信小游戏背后的技术优化