题目描述
小明最近在研究压缩算法。
他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比。
然而,要使数值很小是一个挑战。

最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面出现的数字很大可能是刚出现过不久的数字。对于这种特殊的序列,小明准备对序列做一个变换来减小数字的值。

变换的过程如下:
从左到右枚举序列,每枚举到一个数字,如果这个数字没有出现过,刚将数字变换成它的相反数,如果数字出现过,则看它在原序列中最后的一次出现后面(且在当前数前面)出现了几种数字,用这个种类数替换原来的数字。

比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在变换过程为:
a1: 1未出现过,所以a1变为-1;
a2: 2未出现过,所以a2变为-2;
a3: 2出现过,最后一次为原序列的a2,在a2后、a3前有0种数字,所以a3变为0;
a4: 1出现过,最后一次为原序列的a1,在a1后、a4前有1种数字,所以a4变为1;
a5: 2出现过,最后一次为原序列的a3,在a3后、a5前有1种数字,所以a5变为1。
现在,给出原序列,请问,按这种变换规则变换后的序列是什么。
输入
输入第一行包含一个整数n,表示序列的长度。
第二行包含n个正整数,表示输入序列。
输出
输出一行,包含n个数,表示变换后的序列。
样例输入
5
1 2 2 1 2
样例输出
-1 -2 0 1 1
思路:这个题目我不知道有没有别的做法,但是主席树是可以做的。这算是一个求区间不同数的个数的模板题了。注意区间端点的取值。
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxx=1e5+100;
struct node{int l,r,sum;
}p[maxx*40];
int root[maxx*40];
int a[maxx];
int n,rot=0;inline int build(int l,int r)
{int cur=++rot;p[cur].sum=0;p[cur].l=p[cur].r=0;if(l==r) return cur;int mid=l+r>>1;p[cur].l=build(l,mid);p[cur].r=build(mid+1,r);return cur;
}
inline int update(int pos,int lrot,int v,int l,int r)
{int cur=++rot;p[cur]=p[lrot];p[cur].sum+=v;if(l==r) return cur;int mid=l+r>>1;if(pos<=mid) p[cur].l=update(pos,p[lrot].l,v,l,mid);else p[cur].r=update(pos,p[lrot].r,v,mid+1,r);return cur;
}
inline int query(int pos,int lrot,int l,int r)
{if(l==r) return p[lrot].sum;int mid=l+r>>1;if(pos<=mid) return p[p[lrot].r].sum+query(pos,p[lrot].l,l,mid);else return query(pos,p[lrot].r,mid+1,r);
}
int main()
{scanf("%d",&n);map<int,int> mp;for(int i=1;i<=n;i++) scanf("%d",&a[i]);root[0]=build(1,n);for(int i=1;i<=n;i++){if(mp[a[i]]==0) root[i]=update(i,root[i-1],1,1,n);else{int t=update(mp[a[i]],root[i-1],-1,1,n);root[i]=update(i,t,1,1,n);}mp[a[i]]=i;}mp.clear();for(int i=1;i<=n;i++){if(mp[a[i]]==0) cout<<-a[i]<<" ";else cout<<query(mp[a[i]]+1,root[i-1],1,n)<<" ";mp[a[i]]=i;}return 0;
}

努力加油a啊,(o)/~

[蓝桥杯][2016年第七届真题]压缩变换(主席树求区间不同数的个数)相关推荐

  1. [蓝桥杯][2016年第七届真题]冰雹数(暴力打表找规律)

    题目描述 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复. 通过观察发现,这个数字会一会儿上升到很高, 一会儿 ...

  2. [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)

    题目描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其 ...

  3. 蓝桥杯2016年第七届真题——四平方和

    四平方和 一.题目内容 题目描述 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和,如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^2 + ...

  4. 蓝桥杯2016年第七届真题-路径之谜

    题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角. ...

  5. 问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区

    问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区 时间限制: 1Sec 内存限制: 128MB 提交: 310 解决: 211 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区 ...

  6. [蓝桥杯][2019年第十届真题]扫地机器人(二分+贪心)

    题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中. 已知扫地机器人每分钟可以移动到左右相邻的方 ...

  7. [蓝桥杯][2015年第六届真题]生命之树(树形dp)

    题目描述 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  8. [蓝桥杯][2015年第六届真题]密文搜索(排序+二分)

    题目描述 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  9. [蓝桥杯][2019年第十届真题]糖果(状压dp)

    题目描述 糖果店的老板一共有 M 种口味的糖果出售.为了方便描述,我们将 M 种 口味编号 1 ∼ M. 小明希望能品尝到所有口味的糖果.遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售. 幸 ...

最新文章

  1. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
  2. 百练OJ:3681与2796:数字求和
  3. e480换高分屏_全高清都不够用?是时候趁着双11上飞利浦的高分屏了
  4. Fedora 31 已经为 Python 3.8 做好了准备
  5. 人类为啥比小鼠发育更慢?同日两篇《科学》找到意想不到的原因
  6. DataView的ToTable方法,类似数据库Distinct。
  7. golang return要返回的参数太多_Golang中的Defer必掌握的7知识点
  8. 92.与上游服务建立连接
  9. git clone指定分支到本地
  10. 从零基础入门Tensorflow2.0 ----七、36. 文本生成之---2. 构建模型
  11. truffle和remix区别
  12. FirstApp,iphone开发学习总结3,UIButton简单的操作
  13. 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
  14. java的酒店房间管理系统
  15. 建筑企业数字化转型关键问题及解决方案
  16. 苹果新一代iPad发布,库克表示后PC时代已经来临
  17. 用python做一个飞机大战(一)
  18. 中国的高校计算机教育存在哪些问题?
  19. 驾校考试科目二完整流程
  20. 假期读好书——力荐《八位大学校长》

热门文章

  1. Android—AspectJ实践
  2. 怎么给自己的python换源_windows/linux下如何更换Python的pip源
  3. java nio is例子,Java Buffer isDirect()用法及代码示例
  4. mysql在计算机管理中的路径怎么修改_Rstudio中修改工作路径的三种方法
  5. java常用类总结_java——常用类的总结
  6. html5 sidetoggle,javascript-使用React.js实现SlideToggle功能
  7. php ftp rmdir,PHP中的ftp_rmdir()函数
  8. legend2---开发日志16
  9. JS引擎、运行时与调用栈概述
  10. IOS12上微信中点击不到表单的bug