树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!
HH:
输入
接下来n-1行:表示第二个数到第n个数前面有多少个数比它小。
(因为第一个数前面没有任何数,所以不需要输入)
输出
样例输入 Copy
5
1
2
1
0
样例输出 Copy
2
4
5
3
1
经过长时间的思考(瞎碰),我发现了一件事:
题目翻译成这样:给定每个点的逆序对的数量,求每个点。
我和廖半仙一开始进行了愉快的跳表操作。
事实证明它是完全错的。
总的来说,这题目被坑了的唯一原因就是: MAXN呐!MAXN呐!
+1=100
-1=60
maxn。。。
ANSWER:
我发现:最后一个值是可以确定的。
因为我们知道最后一个值前面有几个点比它小,于是这个点就是第n+1大的点。
把这个点塞到答案数组里面。
找前一个大小,我们发现:删去第一个点,再进行以上操作,就可以得到这个点的大小。
于是:算法确认:
1、找当前数字对应的第a[n]+1大
2、塞答案
3、删去这个数。
重点来了。
我们删去这个数,怎么实现呢?
如果只要数组硬爆就能解决的事,那还是wzy大佬出的蓝题吗?
不可能!
我需要一个数据结构,来维护这个东西。
想想看数据结构们,有什么可以删点呢?删点之后还要把后面的补上来....
我问到了邻接表删点,甚至想到了主席树删点(区间第k小,动态点删掉然后查询即可)
但是....都不行
平衡树吧,有删点操作。
但是我不会。
感谢shy大佬的shy树。
MAXN呐!MAXN呐!
+1=100
-1=60
maxn。。。
上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int n,a[maxn],ans[maxn];
struct tree
{
int ls,rs,size,pre;
}t[maxn*];
int tot=;
int build(int l,int r)
{
if(l==r)
{
t[++tot].size=;//子树大小,叶节点的子树大小=1
t[tot].pre=l;//节点的值=l,12345.....
return tot;//返回当前叶节点的编号
}
int mid=(l+r)>>;
int x=++tot;//树节点的编号
t[x].ls=build(l,mid);//同主席树建树模式,ls rs=下面的返回值
t[x].rs=build(mid+,r);
t[x].size=r-l+;//差分处理子树大小
return x;
}
int ask(int x,int l,int r,int k)
{
if(l==r)
{
t[x].size--;//叶节点,删除它
return t[x].pre;//返回叶节点的值
}
t[x].size--;//走一条边,删一个点
int mid=l+r>>;
int mik=mid+;
int q=k-t[t[x].ls].size;
if(k<=t[t[x].ls].size)return ask(t[x].ls,l,mid,k);//二叉搜索树部分,有点类似主席树,通过差分不停在节点上滑来滑去,直到找到相应的叶节点
else return ask(t[x].rs,mik,r,q);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);//n-1个
}
a[]=;//第一个数前面没有比它小的
build(,n);//建树
for(int i=n;i>;i--)
{
ans[i]=ask(,,n,a[i]+);
}
for(int i=;i<=n;i++) printf("%d\n",ans[i]);
return ;
}
思路就是二叉查找树,建树之后,根据a数组,大了往左找,小了往右找,然后找到这个值为止,删点。
膜拜shy树
%%%shy大佬,tql
(完)
树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!的更多相关文章
- LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #inclu ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
- P1412 经营与开发
题目描述 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发) ...
- 2014年年度工作总结--IT狂人实录
2014年也是我人生最重要的一年,她见证了我的成长与蜕变,让我从一个迷茫的旅者踏上一条柳暗花明的路. 春宇之行 从春宇短暂的9个月,却经历常人难以想想的风风雨雨,首先要感谢春宇公司给我带来了安逸宽松的 ...
- windows中的软链接硬链接等
学校嘛,有些时候还是得逆逆上网客户端啥的,并且学校的不少工作,这Windows的需求还是挺强的,之前Win10的体验并不是太好,不过时隔这么久,打算从7升级到10了,恰好系统也该换了. 首先是命令行的 ...
- php_1
简介:(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发,语言的风格有 ...
- NOI导刊集训感言
圆溜溜,尤其首先,集训的收获很大,远远比自学要来的快 其次,新知识点到时没怎么讲(A*,数论除外,倒是真的学会不少以前碰都不敢碰的定理呀,结论之类的东西),但是还是深深地感受到了集训的困难,七天的节奏 ...
- 「BJWC2010」模板严格次小生成树
题目描述 小 \(C\) 最近学了很多最小生成树的算法,\(Prim\) 算法.\(Kruskal\) 算法.消圈算法等等.正当小\(C\)洋洋得意之时,小\(P\)又来泼小\(C\)冷水了.小\(P ...
- 【牛客挑战赛32E】树上逆序对
题目 数据范围非常奇怪,询问的逆序对个数\(k\leq 30000\),我们应该可以把所有的情况都求出来 发现对于树上两点\(x,y\),如果\(x\)是\(y\)的祖先,那么绝对值较大的点的符号决定 ...
随机推荐
- Adobe PS常用快捷键
ps使用快捷键 新建图层 Ctrl+Shift+N 取消选择区 Ctrl + D 新建标题 Ctrl + N 图片放大 Alt+鼠标滑动 图片位置拖动 空格 + 鼠标拖动 移动图层 ...
- 利用Helm简化Kubernetes应用部署(2)
目录 定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts 回到之前的“charts”目录,我们依次进行解读并进行简单的修改. Chart.yaml 配置示例: a ...
- 帝国cms网站管理系统之安全设置最优化分享
首先我们来认识一下帝国CMS安全认证特性:帝国登录四重安全验证:第一重:密码双重MD5加密,密码不可破解,假如数据库被下载,也无法获取真实密码.第二重:后台目录自定义,假如对方知道密码也找不到登录后台 ...
- Kubernetes WebSSH终端窗口自适应Resize
追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...
- 【Java必修课】各种集合类的合并(数组、List、Set、Map)
1 介绍 集合类可谓是学习必知.编程必用.面试必会的,而且集合的操作十分重要:本文主要讲解如何合并集合类,如合并两个数组,合并两个List等.通过例子讲解几种不同的方法,有JDK原生的方法,还有使用第 ...
- 无情的Java 8 之 Stream和lambda表达式篇
不好意思,最近刷小视频刷的有点上头 看到这图就不自觉的要来一句:"卧槽,无情" 好了,我要开始正经了 JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样 ...
- JDK路径配置,tomcat可以直接启动
path classpath java_home 修改tomcat配置文件,直接写入jdk路径,不推荐
- R的安装
更新时间:2019.09.23 1. 序言 之前曾经用过一段时间的R(一直忍受着原生R那个超级"简洁"的界面),但是后来重装了系统并且学习了Python,就没有再怎么碰过R了.然而 ...
- 探究JavaScript闭包
什么是JavaScript闭包? 刚开始知道这个词,就误以为是自动执行的匿名函数块. 比如说+function(){}(); 然而并不是,那么请看下面的例子: function init() { va ...
- (day27)subprocess模块+粘包问题+struct模块+ UDP协议+socketserver
目录 昨日回顾 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议 socket套接字 今日内容 一.subprocess模块 二.粘包问题 三.struct模块 四.UDP 五.QQ聊天室 ...