ACM: 强化训练-Inversion Sequence-线段树 or STL·vector
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%lld & %llu
Description
For sequence i1, i2, i3, … , iN, we set aj to be the number of members in the sequence which are prior to j and greater to j at the same time. The sequence a1, a2, a3, … , aN is referred to as the inversion sequence of the original sequence (i1, i2, i3, … , iN). For example, sequence 1, 2, 0, 1, 0 is the inversion sequence of sequence 3, 1, 5, 2, 4. Your task is to find a full permutation of 1~N that is an original sequence of a given inversion sequence. If there is no permutation meets the conditions please output “No solution”.
Input
There are several test cases.
Each test case contains 1 positive integers N in the first line.(1 ≤ N ≤ 10000).
Followed in the next line is an inversion sequence a1, a2, a3, … , aN (0 ≤ aj < N)
The input will finish with the end of file.
Output
For each case, please output the permutation of 1~N in one line. If there is no permutation meets the conditions, please output “No solution”.
Sample Input
5
1 2 0 1 0
3
0 0 0
2
1 1
Sample Output
3 1 5 2 4
1 2 3
No solution 这题有两种做法,一开始直接用STL里的vector A掉了这个题目,然后基神让我试下用线段树来解这个题目,我就两种方法都写了 先来线段树: 从小到大插入到第k个格子。

/*/
线段树做法:
首先,弄个长度为n的线段树,维护sum,初始值为1
那么,sum[1]等于n,代表着空着的位置的数量
现在要把某个数字插入到p位置,就在线段树找到一个位置x,使得[x]里面的sum等于p;
然后把那个1修改为0,就表示那个位置不是空着的了。 /*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"algorithm"
#include"cmath"
using namespace std;
#define MX 11111
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[MX<<2]; void PushUp(int rt) {
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
} void Build(int l,int r,int rt) {
sum[rt]=1;
if(r==l)return ;
int m=(r+l)>>1;
Build(lson);
Build(rson);
PushUp(rt);
} int Query(int p,int l,int r,int rt) {
if(l==r) { //找到点,插入,返回点的位置值
sum[rt]--;
return l;
}
int m=(l+r)>>1,ret=0;
if(p<=sum[rt<<1]) ret=Query(p,lson);//点在左边,直接向左找
else ret=Query(p-sum[rt<<1],rson);// 减去左边没去找的点
PushUp(rt);
return ret;
}
int a[MX];
int ans[MX];
int main() {
int n;
while(~scanf("%d",&n)) {
Build(1,n,1);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
bool check=1;
for(int i=1; i<=n; i++) {
if(sum[1]<a[i]+1) {
check=0;
break;
} else {
int p= Query(a[i]+1,1,n,1);
ans[p]=i;
}
}
if(!check)printf("No solution\n");
else {
int first=1;
for(int i=1; i<=n; i++) {
if(first)first=0;
else printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
}
return 0;
}
然后是STL: 从大到小插入到第k个格子。

/*/
STL-vector:
从最大的数开始插入队列;
利用vector中的insert()函数去将数字插入相应的位置;
这种方法暴力,简单。。。
但是每一次插入复杂度是O(n);
数据有点放水,还是A了。
/*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"string"
#include"algorithm"
#include"vector" using namespace std;
#define MX 10050
int num[MX]; int main() {
int n;
while(~scanf("%d",&n)) {
for(int i=0; i<n; i++) {
scanf("%d",&num[i]);
}
int flag=1;
vector<int > v;
v.push_back(0);
for(int i=n-1;i>=0; i--) {
if(v.size()<=num[i]) {
printf("No solution\n");
flag=0;
break;
}
v.insert(v.begin()+num[i],i+1);
}
if(flag) {
int first=1;
vector<int>::iterator it;
for(it=v.begin(); it!=v.end()-1; it++) {
if(first) {
first=0;
printf("%d",(*it));
}
else printf(" %d",(*it));
}
printf("\n");
}
}
return 0;
}
ACM: 强化训练-Inversion Sequence-线段树 or STL·vector的更多相关文章
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- hdu1394Minimum Inversion Number(线段树,求最小逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu1394(Minimum Inversion Number)线段树
明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊. 还是先贴题吧 HDU-1394 Minimum Inversion Number Time ...
- HDU_1394_Minimum Inversion Number_线段树求逆序数
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
随机推荐
- zip 压缩文件 unzip查看zip压缩包内的内容
[root@GitLab tmp]# zip -r new.zip ./* adding: gitlab_key_file20161001-2668-1eu44mv (deflated 15%) ...
- Pyqt 音视频播放器
在寻找如何使用Pyqt做一个播放器时首先找到的是openCV2 openCV2 貌似太强大了,各种关于图像处理的事情它都能完成,如 读取摄像头.图像识别.人脸识别. 图像灰度处理 . 播放视频等,强 ...
- 【131031】struts 1 中 <html:form>
<DIV>来看看 使用 ActionForm 这个主题,当时使用了一个静态表单网页:<BR>* form.htm<BR><BR><BR>&l ...
- 【SQL Server】SQL Server基础之存储过程
SQL Server基础之存储过程 阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...
- SQL Server排序规则
在使用数据库的过程中,总会碰到一些特别的需求.有时候需要储存中文字符,区分大小写或者按照中文的比划顺序排序.这就涉及到了对数据库排列规则的选择. 我们一般可以选择数据库名称-->右键属性(Pro ...
- hdu 4049 2011北京赛区网络赛J 状压dp ***
cl少用在for循环里 #include<cstdio> #include<iostream> #include<algorithm> #include<cs ...
- php随机生成验证码
我们经常需要服务器向前端发送验证码,验证码需要随机产生,下面的用简单的代码实现了这一过程: <?php $pool='0123456789abcdefghijklmnopqrstuvwxyzAB ...
- 实现一种快速查找Richedit中可见区域内OLE对象的方法
Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...
- UI背景构建
个中原因不是很明白 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...
- HTML5_ScrollInToView方法
scrollIntoView(ture)元素上边框与视窗顶部齐平 scrollIntoView(false)元素下边框与视窗底部齐平 <html> <head> <tit ...