写在前面

高考结束了, 很遗憾, 我是其中的失败者, zzu, 没有想过最后来到这个学校, 并且还是信息安全专业, 不过, 时间久了, 也慢慢适应了; 当我被这个学校的这个专业录取, 也就注定着, 我还要在大学是打acm, 不过, 幸运的是, 郑大的学长和同学还是挺多的, 在这个暑假里, 我己经和刘神, gcf, zsy打了一些比赛了, 效果还不错, 手感也慢慢回来了。 从今天起, 该博客正常使用, 来巩固我学的知识。


Wedding DJ

题目大意

一个长度为n的序列,(\(n \leq 10^5\)), 每次操作, 可以使所有数值为x的数全部替换为另一个数y, 求最少多少操作, 使这个序列单调不下降


emmmmmm, 这是在那场比赛中唯一没有A掉的题目, 首先应该想到, 两个相同数字之间最后的值一定是相同的, 所以我们把该序列分成若干个区间, 每个区间的值最终相同, 这个还是挺容易实现的, 我们可以记录每个值的右端点, 我们可以把该序列从左向右扫描, 每次都取最大的右端点, 当扫描的数与右端点重合是, 这个区间就完成了, 假如这个区间的种类数是num, 那先把他们变成一样的数的代价就是num-1, 这个就可以先统计到答案中, 这样我们得到n个区间, 每个区间都能取一定的值, 且这些值互不相同。 当时在赛场上想的就是, 都取最小值, 然后求一个最长上升子序列(假设长度为l)再把答案加上n-l就是结果, 当时时间紧迫, 最后也没有调出来, 但这个思路显然不对, 前面的数要尽可能小, 后面的数要尽可能大, 后来就有点卡住了。 再后来, 我问了银牌爷zyz, 得出了方案, 用f[i]表示当前前i个区间所能构成的最长上升子序列, 在把所有的取值从小到大排序, 每取出一个值, 获得它的区间标号pos, 那么f[pos] = max(f[pos], max(f[1...pos-1]) + 1);至于前i个f[i]的最大值, 可以用树状数组或者线段树维护, 把数从小到大扫描也就能够统计所有可行的方案, 那么这个问题就解决了

(PS: 1.线段树被卡, 疑惑???? 2.在TLE多次之后, 得出一个结论, 尽量不要在循环中写memset, 否则在特殊数据中, 复杂度会变成\(O(n^2)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int INF = 0x3f3f3f3f;
  5. const int MAXN = 1e6 + 10;
  6. const int MAXM = 2e3 + 10;
  7. const int mod = 1e6 + 7;
  8. const double eps = 1e-6;
  9. template < typename T > inline void read(T &x) {
  10. x = 0; T ff = 1, ch = getchar();
  11. while (!isdigit(ch)) {
  12. if (ch == '-') ff = -1;
  13. ch = getchar();
  14. }
  15. while (isdigit(ch)) {
  16. x = (x << 1) + (x << 3) + (ch ^ 48);
  17. ch = getchar();
  18. }
  19. x *= ff;
  20. }
  21. int n, b[MAXN], a[MAXN], vis[MAXN], num[MAXN * 10];
  22. int m[MAXN * 10];
  23. vector < pair < int, int > > v;
  24. int top = 1, ans1 = 0, ans2 = 0;
  25. inline int query(int x) {
  26. int ans = 0;
  27. for (; x; x -= x & -x) ans = max(ans, a[x]);
  28. return ans;
  29. }
  30. inline void change(int x, int y) {
  31. for (; x <= n; x += x & -x) a[x] = max(a[x], y);
  32. return;
  33. }
  34. int main() {
  35. read(n);
  36. for (int i = 1; i <= n; ++i) {
  37. read(a[i]);
  38. int x = Hash(a[i]);
  39. m[x] = i;
  40. }
  41. int l = 1, r = 0, cnt = 0, mi = INF;
  42. for (int i = 1; i <= n; ++i) {
  43. int u = Hash(a[i]);
  44. r = max(r, m[u]);
  45. mi = min(mi, a[i]);
  46. if (!vis[u]) {
  47. vis[u] = true;
  48. v.push_back({a[i], top});
  49. ++cnt;
  50. }
  51. if (r == i) {
  52. ans1 += cnt - 1;
  53. l = r = i + 1;
  54. cnt = 0;
  55. mi = INF;
  56. ++top;
  57. // memset(vis, false, sizeof(vis));
  58. }
  59. }
  60. --top;
  61. sort(v.begin(), v.end());
  62. n = v.size();
  63. memset(a, 0, sizeof(a));
  64. for (int i = 0; i < n; ++i) {
  65. int x = v[i].second;
  66. int v = query(x - 1);
  67. if (a[x] < v + 1) {
  68. a[x] = v + 1;
  69. ans2 = max(ans2, v + 1);
  70. change(x, v + 1);
  71. }
  72. }
  73. printf("%d", ans1 - ans2 + top);
  74. return 0;
  75. }

Wedding DJ题解 (回归OI)的更多相关文章

  1. 洛谷 P6573 [BalticOI 2017] Toll 题解

    Link 算是回归OI后第一道自己写的题(考CSP的时候可没回归) 写篇题解纪念一下 题目大意: \(n\) 个点,\(m\) 条单向边,每条边的两端点 \(x\),\(y\)必定满足 \(\left ...

  2. SXOI2018 游记

    noilinux@Capella:~$ cd /Memories/ noilinux@Capella:/Memories$ rm *SXOI* rm:是否删除有写保护的普通文件 "SXOI2 ...

  3. Nowcoder | [题解-N210]牛客OI月赛2-提高组

    比赛连接戳这里^_^ 我才不会说这是我出的题(逃) 周赛题解\((2018.10.14)\) \(T1\) \(25\sim50\)分做法\(:\)直接爆搜 作为一个良心仁慈又可爱的出题人当然\(T1 ...

  4. Nowcoder | [题解-N189]牛客OI赛制测试赛3

    这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...

  5. OI队测题解:

    Test 17   T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未 ...

  6. 牛客OI月赛12-提高组题解

    牛客OI月赛12-提高组 当天晚上被\(loli\)要求去打了某高端oj部分原创的模拟赛,第二天看了牛客的题觉得非常清真,于是就去写了 不难发现现场写出\(260\text{pts}\)并不需要动脑子 ...

  7. 洛谷【P5004 专心OI - 跳房子】 题解

    题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...

  8. 题解——牛客网OI赛制测试赛2

    T1 规律题 考虑先全部选中再去重即可 #include <cstdio> #include <algorithm> #include <cstring> #inc ...

  9. 牛客OI赛制测试赛1 题解

    A 斐波那契 数竞生:这不是送分的常识吗? 这里引入一个叫卡西尼恒等式的玩意. 公式表达就是 设$fib[i]$为斐波那契数列的第$i$项$(i>0,i \in N_+)$ 则有 $fib[i+ ...

随机推荐

  1. Java跨平台原理(字节码文件,虚拟机)

    介绍 C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机 ...

  2. php nginx 路径批量配置

    * 假设 E:\upload 作为图片上传的位置 nginx 做web服务 * 创建文件conf.php 放到这个目录下 <?php function handleDir($it, &$ ...

  3. django如何加载外部文件

    django如何加载外部文件(环境:pycharm python2.7 django1.11) 有一份新的文件夹名为:py_aiplat_demo,内含有多个文件夹(SDK,demo,data). 1 ...

  4. [转载]Windows 2008多用户同时远程登陆配置方法

    有些朋友需要在在使用Windows 2008远程登录功能时,进行多用户登录,那么就可以采用以下配置方法: 首先要启用远程桌面这一功能:右击"我的电脑"→ 属性 → 远程配置 → 远 ...

  5. SVN--代码状态检查(图文并茂)

    接下来,我们用客户端去检出代码,在桌面空白处单击右键,选择SVN检出(check out),在弹出的对话框中填写版本库URL(具体获取方式,上面讲上传项目到版本库的时候讲过),选择检出目录,点击确定. ...

  6. 被校园网限速限流的日子 | 路由代理ipv6访问的操作手册

    一 前 言 你是否还在为校园网的收费而小心翼翼?你是否还在为网速不够快而影响科研进程? 你是否还在为处理舍友关系而费经心思? 你是否还在为不能给舍友提供价值而苦恼? 那么,叶子团队或许能够帮助到你解决 ...

  7. 三千字介绍Redis主从+哨兵+集群

    一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ...

  8. Spring技术内幕笔记2--我懒不写了哈哈哈哈。

    目录 1.1 关于IOC容器设计的线路区别 1.1.1 BeanFactory 1.1.2 ApplicationContext 2.1 FileSystemXmlApplicationContext ...

  9. 踩坑系列《十一》完美解决阿里云vod视频点播无法播放音频和视频点播控制台里的媒资库里面的视频无法播放

    刚开始项目部署的时候,音频还是正常播放,后面直接报了 获取m3u8文件失败(manifestLoadError) 的错误,原因是 我的域名 xxx.com 这个域名没有解析到点播提供的CNAME上,所 ...

  10. Stream之高级函数

    上回文说到了有关Stream一些数学函数的用法.今天来说下Stream一些高级的函数用法,这些函数在日常工作中也是必不可少的,测试数据还是引用上一篇的数据. Map 这个方法我个人称之为转换函数,把一 ...