[HDU5592] ZYB's Premutation
[HDU5592] ZYB's Premutation
题目大意:一个由\([1,n]\)组成的数列,但不知道具体排列,但给出每个前缀的逆序对数目,让你还原排列
Solution
创造一颗\([1,n]\)的权值线段树,初始权值都为\(1\),我们从后往前离线处理,每次拿到一个前缀的逆序对数\(p[i]\),说明在\(i\)上的这个数字\(a_i\)前面有\(sum=p[i]-p[i-1]\)个数字比它大,所以\(a_i\)是\(a_1,\cdots ,a_i\)中第\(i -sum\)大的数字,查询后这个\(a_i\)对前面就没有用了,需要在权值线段树上删去
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define sc(x) scanf("%d", &x)
#define pf(x) printf("%d\n",x)
#define lson cur << 1
#define rson (cur << 1) | 1
const int N = 50005;
int num[N << 2], val[N << 2];
int p[N], ans[N];
int n;
void build(int cur, int l, int r){
num[cur] = r - l + 1;
if(l == r){
val[cur] = l;
return;
}else{
int mid = l + ((r - l) >> 1);
build(lson, l, mid);
build(rson, mid + 1, r);
}
}
int query(int cur, int l, int r, int k){
int mid = l + ((r - l) >> 1);
if(l == r){
// pf(val[cur]);
return val[cur];
}else{
if(num[lson] >= k){
return query(lson, l, mid, k);
}else{
return query(rson, mid + 1, r, k - num[lson]);
}
}
}
void update(int cur, int l, int r, int k){
num[cur]--;
if(l == r){
val[cur] = 0;
return;
}else{
int mid = l + ((r - l) >> 1);
if(k <= mid){
update(lson, l, mid, k);
}else{
update(rson, mid + 1, r, k);
}
}
}
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
memset(num, 0, sizeof(num));
memset(val, 0, sizeof(val));
build(1, 1, n + 1);//l和r要和数组对应起来,不能建的时候是n+1,query和update时又变成了n
for(int i = 1, la; i <= n; ++i){
scanf("%d", &p[i]);
}
for(int i = n; i; --i){
ans[i] = query(1, 1, n + 1, i - p[i] + p[i - 1]);
update(1, 1, n + 1, ans[i]);
}
for(int i = 1; i < n; ++i){
printf("%d ", ans[i]);
}
printf("%d\n", ans[n]);
}
return 0;
}
Error
- \(l\)和\(r\)要和数组对应起来,不能建的时候是\(n+1\),\(query\)和\(update\)时又变成了\(n\)
[HDU5592] ZYB's Premutation的更多相关文章
- ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592 题目大意就是给了每个[1, i]区间逆序对的个数,要求复原原序列. 比赛的时候2B了一发. 首先 ...
- ZYB's Premutation(有逆序数输出原序列,线段树)
ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- BestCoder Round #65 (ZYB's Premutation)
ZYB's Premutation Accepts: 220 Submissions: 983 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- hdu 5592 ZYB's Premutation (权值线段树)
最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】
ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 线段树 - ZYB's Premutation
ZYB has a premutation P,but he only remeber the reverse log of each prefix of the premutation,now he ...
- Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- ZYB's Premutation POJ5592
Problem Description ZYBZYBZYB has a premutation PPP,but he only remeber the reverse log of each pref ...
- HDU 5592 ZYB's Premutation
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
随机推荐
- CODE_TEST-- gtest
gtest 提供了一套优秀的 C++ 单元测试解决方案,简单易用,功能完善,非常适合在项目中使用以保证代码质量. https://blog.csdn.net/jcjc918/article/detai ...
- canvas实现简易时钟效果
代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- CSS Multiple Columns
CSS Multiple Columns CSS layout column-count column-gap column-rule-style column-rule-width column-r ...
- project config generator
project config generator React, Vue, https://createapp.dev/ parcel https://parceljs.org/ https://git ...
- Datahero inc:区块链方案如何在现有食品溯源系统里实现落地?
在食品行业,区块链溯源平台的应用,主要是指围绕"从农田到餐桌"的安全管理理念,综合运用区块链技术.大数据技术和二维码技术等前沿技术,具有产品生产企业管理. 产品生产档案 (农药/防 ...
- ajax缺点
ajax请求在SEO中效率低,SEO就是关键字搜索的匹配度. 比如在百度搜索Java,一般来说内容中出现Java的次数越多排名越靠前,当使用ajax时,它的异步刷新导致必须是页面刷新出来才去刷新数据, ...
- UML类图介绍&类的六大关系
UML类图介绍&类的六大关系 官方定义 UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的方式 UML 图形化的语言 基本介绍 UML图: ...
- MySQL应用优化
MySQL应用优化 目录 MySQL应用优化 1.数据库连接池 2.减少对MySQL的访问 3.负载均衡 4.MySQL查询缓存优化 5.MySQL如何使用缓存 6.MySQL内存管理以及优化 原则 ...
- 使用 Tye 辅助开发 k8s 应用竟如此简单(五)
续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中实现对分布式链路追踪. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次 ...
- tomcat部署项目问题
tomcat部署项目的时候,报内存溢出,一种解决方案是直接添加内存,网上都有教程,如下: Windows下,在文件/bin/catalina.bat,Linux下,在文件/bin/catalina.s ...