今天的测试,让我知道自己还有很多很多知识点的掌握不牢,发现自己代码能力很差,思维也不够好,蒟蒻感到深深地难过。但不管怎么样,一切杀不死我的,都会使我变得强大,我不会放弃挣扎的!我相信只要肯钻研,就无论如何也不会差到哪里去。

但求耕耘,不问收获

难过的难过了,该敲的代码还得敲,下面不多说,上题。

先从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-树状数组+二分答案-排列相关推荐

  1. L3-002 堆栈 树状数组+二分答案

    题目详情点击这里 思路:用std::stack来表示题目中说的栈,现在关键问题就是如何找到中位数. 可以用二分答案+树状数组的方法 由于每个元素最大不超过1e5,因此开一个大小为1e5的树状数组来存储 ...

  2. 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 ...

  3. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  4. POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。

    题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...

  5. 树状数组 + 二分 - Query HDU - 4339

    树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...

  6. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  7. P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力,每次加入或删除一个战士,要求一个最大的kkk使得温度 ...

  8. POJ2182-Lost Cows【树状数组,二分】

    正题 题目链接:http://poj.org/problem?id=2182 题目大意 给出每头牛前面有多少个比它高的,求每头牛的最大高度. 解题思路 建立一个01序列,表示每个高度是否被占用过,然后 ...

  9. [HDU - 2852] KiKi's K-Number (树状数组+二分)

    链接 http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意 现在需要你对一个空序列做nnn次操作,操作分三种 0x0\ \ x0  x :向序列中加入一个 ...

最新文章

  1. 浅析企业网站应该如何选择适合自己的服务器?
  2. 如何在asp.net页面使用css和js
  3. mysql二进制日志被删除无法启动_mysql二进制日志文件出错导致mysql服务无法启动...
  4. php fpm error,关于启动php-fpm失败的解决办法
  5. spring零碎知识点(二)
  6. STL学习之一(栈(statck))
  7. github上的python爬虫_python爬虫入门(2):让你的github项目火起来
  8. 牛客练习赛31: D. 神器大师泰兹瑞与威穆(链表)
  9. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  10. echarts实现复合饼图
  11. 使用python绘制函数曲线
  12. PCL——点云特征描述与提取
  13. CAD如何输入指定角度的直线、AUTOCAD——渐变填充
  14. 实时语音变声技术原理解析:“大叔变小萝莉”
  15. 最新江西建筑八大员(材料员)模拟真题集及答案解析
  16. 第3章(3.11~3.16节)模型细节/Kaggle实战【深度学习基础】--动手学深度学习【Tensorflow2.0版本】
  17. 2016全球大数据战略版图剖析(6):应用篇下
  18. 运放振荡问题的个人理解
  19. 安卓系统导航测试软件,安卓战GPS 凯立德导航软件实测解析
  20. [渝粤教育] 浙江大学 概率论与数理统计 参考 资料

热门文章

  1. CWE-170: Improper Null Termination(NULL终止符错误)
  2. Screen output without connection to user
  3. python entry.stringvar_tkinter entry widg中的StringVar()错误
  4. 垂直滤波和水平滤波的区别_有源滤波与无源滤波的区别——帝森克罗德技术科普贴...
  5. 中质协和优思学院的六西格玛认证
  6. Kubesphere部署nacos
  7. 应用在飞机的导航系统上的计算机,2013年计算机三级考试PC技术试题及答案解析36...
  8. 程序员编程入门:应该从记事本开始,还是选好用的IDE?
  9. NB-IOT物联卡与物联流量卡的区别
  10. NOI / 1.5编程基础之循环控制——21:角谷猜想