0629-树状数组+二分答案-排列
今天的测试,让我知道自己还有很多很多知识点的掌握不牢,发现自己代码能力很差,思维也不够好,蒟蒻感到深深地难过。但不管怎么样,一切杀不死我的,都会使我变得强大,我不会放弃挣扎的!我相信只要肯钻研,就无论如何也不会差到哪里去。
但求耕耘,不问收获
难过的难过了,该敲的代码还得敲,下面不多说,上题。
先从T2开始吧
2、排列(premu.cpp)
【题目描述】
对于一个 1 到 n 的排列,逆序数的定义为:排列中第i 位 ai 的逆序数就是 a1..ai-1 中比
ai 大的数的个数。另外用 pi 表示 a1,…,ai 的逆序数和(即 pi 为逆序数的前缀和)。若知道 n 和 pi,则就能求得原排列。
现在对于排列{ai},给出 n 和{pi},请你还原这个排列。
【输入格式】
第一行输入一个数正整数 n。
第二行输入n 个正整数,表示pi 。
【输出格式】
输出一行,共有 n 个数,表示排列 ai。
【样例输入】
3
0 1 2
【样例输出】3 1 2
【数据范围】
对于前 10%的数据:n≤10。对于前 30%的数据:n≤1,000。
对于 100%的数据:n≤100,000;pi≤100,000,000。
蒟蒻的心路历程:
拿到这道题后,发现暴力很容易,是的很容易超时。n^2的复杂度不是100000可以玩的,那怎么办呢,不管先写个暴力再说(大佬请无视此操作)大概可以骗50分左右。(暴力的代码就不放上来了,思路大致如下:首先根据它给的pi可以求出ai;其次从后往前扫,ai就代表该数是剩余序列(除去该数后面的序列)中的第几大数;然后再从n到1循环放数,然后就凉了,就TLE了)
那么现在来考虑是什么导致了n^2的复杂度,然后对其进行修改就是正解啦。
没错就是每次从n到1放数的时候炸掉了,那么就想个方便快捷的方法来找到第i大的值就ok啦
蒟蒻后来用的是树状数组(不会的同学,自己上网搜,蒟蒻本人口齿不清无法详细讲解),就AC啦,下面直接上代码
(树状数组每次跳跳跳很快的)
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
inline int read(){char ch;int flag=1;while((ch=getchar())<'0'||ch>'9'){if(ch=='-') flag=-1;}int res=0;while(ch>='0'&&ch<='9') {res=res*10+ch-48;ch=getchar();}if(flag==-1) res=-res;return res;
}
int n,p[100009],a[100009],t[100009],ans[100009];
int Lowbit(int i)
{return i&(-i);
}
void add(int i,int c){while(i<=n){t[i]+=c;i=i+Lowbit(i);}
}
int query(int i){int res=0;while(i>0) {res+=t[i];i=i-Lowbit(i);}return res;
}
int main(){n=read();p[0]=0;int i,j;for(i=1;i<=n;++i){p[i]=read();a[i]=p[i]-p[i-1];}for(i=1;i<=n;++i) add(i,1);for(i=n;i>=1;--i){int x=i-a[i],l=0,r=n;while(l<r-1){int mid=l+r>>1;if(query(mid)<x) l=mid;else r=mid;}ans[i]=r;add(r,-1);}for(i=1;i<=n;++i){printf("%d ",ans[i]);}return 0;
}
下面总结一下二分答案的模板,因为真的很容易死循环!
注意注意二分的序列一定是有序的
如果是找单调递增序列中>=x的最小的那一个(最大值的前驱)
while(l<r){int mid=l+r>>1 //就是除以二
if(a(mid)<x) l=mid+1;
else r=mid;
}
最终答案在l中
那么如果是单调递增序列中<=x的最大的那一个(最小值的后继)
while(l<r)
{int mid=l+r+1>>1;//不要问我为什么加1,反正不加会死
if(a[mid]<=x) l=mid;
else r=mid-1;
}最终答案还是在l中
还有两道题,T1和T3
等我下次更新~
0629-树状数组+二分答案-排列相关推荐
- L3-002 堆栈 树状数组+二分答案
题目详情点击这里 思路:用std::stack来表示题目中说的栈,现在关键问题就是如何找到中位数. 可以用二分答案+树状数组的方法 由于每个元素最大不超过1e5,因此开一个大小为1e5的树状数组来存储 ...
- VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分
http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。
题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...
- 树状数组 + 二分 - Query HDU - 4339
树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...
- 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...
- P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】
正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力,每次加入或删除一个战士,要求一个最大的kkk使得温度 ...
- POJ2182-Lost Cows【树状数组,二分】
正题 题目链接:http://poj.org/problem?id=2182 题目大意 给出每头牛前面有多少个比它高的,求每头牛的最大高度. 解题思路 建立一个01序列,表示每个高度是否被占用过,然后 ...
- [HDU - 2852] KiKi's K-Number (树状数组+二分)
链接 http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意 现在需要你对一个空序列做nnn次操作,操作分三种 0x0\ \ x0 x :向序列中加入一个 ...
最新文章
- 浅析企业网站应该如何选择适合自己的服务器?
- 如何在asp.net页面使用css和js
- mysql二进制日志被删除无法启动_mysql二进制日志文件出错导致mysql服务无法启动...
- php fpm error,关于启动php-fpm失败的解决办法
- spring零碎知识点(二)
- STL学习之一(栈(statck))
- github上的python爬虫_python爬虫入门(2):让你的github项目火起来
- 牛客练习赛31: D. 神器大师泰兹瑞与威穆(链表)
- JDK动态代理运行期生成的字节码文件class,获取反编译方法
- echarts实现复合饼图
- 使用python绘制函数曲线
- PCL——点云特征描述与提取
- CAD如何输入指定角度的直线、AUTOCAD——渐变填充
- 实时语音变声技术原理解析:“大叔变小萝莉”
- 最新江西建筑八大员(材料员)模拟真题集及答案解析
- 第3章(3.11~3.16节)模型细节/Kaggle实战【深度学习基础】--动手学深度学习【Tensorflow2.0版本】
- 2016全球大数据战略版图剖析(6):应用篇下
- 运放振荡问题的个人理解
- 安卓系统导航测试软件,安卓战GPS 凯立德导航软件实测解析
- [渝粤教育] 浙江大学 概率论与数理统计 参考 资料
热门文章
- CWE-170: Improper Null Termination(NULL终止符错误)
- Screen output without connection to user
- python entry.stringvar_tkinter entry widg中的StringVar()错误
- 垂直滤波和水平滤波的区别_有源滤波与无源滤波的区别——帝森克罗德技术科普贴...
- 中质协和优思学院的六西格玛认证
- Kubesphere部署nacos
- 应用在飞机的导航系统上的计算机,2013年计算机三级考试PC技术试题及答案解析36...
- 程序员编程入门:应该从记事本开始,还是选好用的IDE?
- NB-IOT物联卡与物联流量卡的区别
- NOI / 1.5编程基础之循环控制——21:角谷猜想