Wedding DJ题解 (回归OI)
写在前面
高考结束了, 很遗憾, 我是其中的失败者, 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)\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 10;
const int MAXM = 2e3 + 10;
const int mod = 1e6 + 7;
const double eps = 1e-6;
template < typename T > inline void read(T &x) {
x = 0; T ff = 1, ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') ff = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= ff;
}
int n, b[MAXN], a[MAXN], vis[MAXN], num[MAXN * 10];
int m[MAXN * 10];
vector < pair < int, int > > v;
int top = 1, ans1 = 0, ans2 = 0;
inline int query(int x) {
int ans = 0;
for (; x; x -= x & -x) ans = max(ans, a[x]);
return ans;
}
inline void change(int x, int y) {
for (; x <= n; x += x & -x) a[x] = max(a[x], y);
return;
}
int main() {
read(n);
for (int i = 1; i <= n; ++i) {
read(a[i]);
int x = Hash(a[i]);
m[x] = i;
}
int l = 1, r = 0, cnt = 0, mi = INF;
for (int i = 1; i <= n; ++i) {
int u = Hash(a[i]);
r = max(r, m[u]);
mi = min(mi, a[i]);
if (!vis[u]) {
vis[u] = true;
v.push_back({a[i], top});
++cnt;
}
if (r == i) {
ans1 += cnt - 1;
l = r = i + 1;
cnt = 0;
mi = INF;
++top;
// memset(vis, false, sizeof(vis));
}
}
--top;
sort(v.begin(), v.end());
n = v.size();
memset(a, 0, sizeof(a));
for (int i = 0; i < n; ++i) {
int x = v[i].second;
int v = query(x - 1);
if (a[x] < v + 1) {
a[x] = v + 1;
ans2 = max(ans2, v + 1);
change(x, v + 1);
}
}
printf("%d", ans1 - ans2 + top);
return 0;
}
Wedding DJ题解 (回归OI)的更多相关文章
- 洛谷 P6573 [BalticOI 2017] Toll 题解
Link 算是回归OI后第一道自己写的题(考CSP的时候可没回归) 写篇题解纪念一下 题目大意: \(n\) 个点,\(m\) 条单向边,每条边的两端点 \(x\),\(y\)必定满足 \(\left ...
- SXOI2018 游记
noilinux@Capella:~$ cd /Memories/ noilinux@Capella:/Memories$ rm *SXOI* rm:是否删除有写保护的普通文件 "SXOI2 ...
- Nowcoder | [题解-N210]牛客OI月赛2-提高组
比赛连接戳这里^_^ 我才不会说这是我出的题(逃) 周赛题解\((2018.10.14)\) \(T1\) \(25\sim50\)分做法\(:\)直接爆搜 作为一个良心仁慈又可爱的出题人当然\(T1 ...
- Nowcoder | [题解-N189]牛客OI赛制测试赛3
这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...
- OI队测题解:
Test 17 T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未 ...
- 牛客OI月赛12-提高组题解
牛客OI月赛12-提高组 当天晚上被\(loli\)要求去打了某高端oj部分原创的模拟赛,第二天看了牛客的题觉得非常清真,于是就去写了 不难发现现场写出\(260\text{pts}\)并不需要动脑子 ...
- 洛谷【P5004 专心OI - 跳房子】 题解
题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...
- 题解——牛客网OI赛制测试赛2
T1 规律题 考虑先全部选中再去重即可 #include <cstdio> #include <algorithm> #include <cstring> #inc ...
- 牛客OI赛制测试赛1 题解
A 斐波那契 数竞生:这不是送分的常识吗? 这里引入一个叫卡西尼恒等式的玩意. 公式表达就是 设$fib[i]$为斐波那契数列的第$i$项$(i>0,i \in N_+)$ 则有 $fib[i+ ...
随机推荐
- PTA 面向对象程序设计 6-2 逆序字符串
6-2 逆序字符串 设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序.例如,给定字符串为"hello",逆序后为"olleh&quo ...
- 【原创】自制string类型(已完成)
这篇文章首发于360doc http://www.360doc.com/content/21/0526/17/73755266_979099504.shtml ,其实360doc里面的那个也是我的帐号 ...
- 学习PHP中Fileinfo扩展的使用
今天来学习的这个扩展其实现在也已经是标配的一个扩展了,为什么呢?因为 Laravel 框架在安装的时候它就是必须的一个扩展,没有打开它的话,连 Laravel 框架都是无法使用的. Fileinfo ...
- 简单了解Phar代码打包工具的使用
简单了解Phar代码打包工具的使用 Phar 是在 PHP5 之后提供的一种类似于将代码打包的工具.本质上是想依照 Java 的 Jar 文件那种形式的代码包,不过本身由于 PHP 是不编译的,所以这 ...
- ecshop二次开发秒杀、限时折扣、清仓等功能
限时抢购,秒杀商品的二次开发 1,先在后台admin/templates 中找goods_info.htm文件到促销部分,改为一个下拉列表的分别是促销,限时,秒杀,值分别是1,2,3这样,代码如下: ...
- js 模板方法模式
* 分离出共同点 function Beverage() {} Beverage.prototype.boilWater = function() { console.log("把水煮沸&q ...
- command ' cl.exe' failed: No such file or directory解决办法
1.安装C ++编译器 https://pan.baidu.com/s/1D1-tM-mWO4TVLdTrh3k1GA 提取码:ym67 2.找到安装文件夹:Visual C++ Build T ...
- openEuler 20.03/21.03 - 华为欧拉开源版(CentOS 8 华为版开源版)下载
开始 openEuler 之旅吧 openEuler 通过社区合作,打造创新平台,构建支持多处理架构.统一和开放的操作系统,推动软硬件应用生态繁荣发展. 好玩的活动停不下来 openEuler 社区不 ...
- 开源框架 - 新 代码生成器 WebFirst / .NET Core
框架描述 WebFirst 是一新代的 代码生成器,用法简单,功能强大,支持多种数据库 ,具体功能如下: 一. 建库.CodeFirst方式在线建表,没用到CodeFirst的用户可以用工具轻松体验 ...
- Java实现红黑树(平衡二叉树)
前言 在实现红黑树之前,我们先来了解一下符号表. 符号表的描述借鉴了Algorithms第四版,详情在:https://algs4.cs.princeton.edu/home/ 符号表有时候被称为字典 ...