首页 > 其他分享 >『题解』UVA 10534 Wavio Sequence

『题解』UVA 10534 Wavio Sequence

时间:2022-11-26 21:57:18浏览次数:80  
标签:10534 int 题解 len maxn LIS 序列 Wavio

题目传送门


题意

\(Wavio\) 是整数序列,有如下特点:

  1. 它的长度总为奇数,即 \(2n + 1\);
  2. 前 \(n+1\) 个数构成一个严格的上升序列,后 \(n+1\) 个数构成一个严格下降的序列;
  3. 任意相邻两个数不会相同

多组输入,给出 \(n\),接下来 \(n\) 个数,求此数列中 \(Wavio\) 序列的最大长度。


分析

对于每个数, 求出它前面有多少数比他小,后面有多少数比他大,
两者取小,再乘 \(2\) 减 \(1\),然后就可以得到以这个点为中心 \(Wavio\) 序列的长度;

从前往后求一次 LIS,再从后往前求一次;
因为 \(d_i\) 表示到下标为 \(i\) 的数时 LIS 的长度;在第二次求的时候可以直接取小

最后循环一遍答案就是 \(ans = max(ans, d_i \times 2-1)\);

用 \(n^2\) 的方法求 LIS 会超时,要用 \(n \times \log n\) 的方法求。

\(Code\)

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 10010;
const int INF = 0x3f3f3f3f;

int d[maxn], a[maxn], h[maxn];

int BFind(int c[], int len, int x)
{
    int l = 0, r = len, mid;
    while (l <= r) {
        mid = (l+r)/2;
        if (x < c[mid]) r -= 1;
        else if (x > c[mid]) l += 1;
        else return mid;
    }
    return l;
}

int main()
{
    int n;
    while (scanf ("%d", &n) != EOF) {
        memset (h, 0, sizeof (h));
        for (int i = 1; i <= n; i ++)
            scanf ("%d", &a[i]);
        int len = 1;
        h[0] = -INF; h[1] = a[1];
        for (int i = 1; i <= n; i ++) {
            int x = BFind(h, len, a[i]);
            h[x] = a[i];
            len = max (len, x);
            d[i] = len;
        }
        h[0] = -INF; h[1] = a[n]; len = 1;
        for (int i = n; i >= 1; i --) {
            int x = BFind(h, len, a[i]);
            h[x] = a[i];
            len = max (len, x);
            d[i] = min(d[i], len);
        }
        int ans = 1;
        for (int i = 1; i <= n; i++) {
            ans = max (ans , d[i] * 2 - 1 );
        }
        printf ("%d\n", ans );
    }
    return 0;
}

标签:10534,int,题解,len,maxn,LIS,序列,Wavio
From: https://www.cnblogs.com/mrCrazyWolf/p/16928405.html

相关文章

  • 『题解』UVA 10795 A Different Task
    题目传送门双倍经验:LuoguP1242分析汉诺塔相信每一个合格的OIer都听说过并且实现过。这是一个递归的程序。汉诺塔本来就有两个规则:一次只能移动最上面的一个盘......
  • 『题解』UVA 148 Anagram checker
    题目传送门分析貌似除了递归式暴力搜索外,没有其它的有效算法了。这样的话,对代码性能的要求就比较高了,为了快速的判断一个短语是否包含某个单词,必须找出一种特定的数据结......
  • 『题解』UVA 12676 Inverting Huffman
    题目传送门题意静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由\(N\)个不同字符组成的特定长度的文本,算法选择\(N\)个编码,每个不同的字符一个编码。使......
  • 『题解』Codeforces 1743A Password
    Problem现有\(4\)位密码,满足以下条件:给定数位的集合\(S\),密码中没有用到这些数位。密码中恰好包含两个数位,每个数位出现了两次。求符合条件的密码个数。Solution......
  • 『题解』Codeforces 1742C Stripes
    Problem在\(8\times8\)的网格上,轮流染上红色和蓝色。红色只能染一整行。蓝色只能染一整列。问最后用的是哪种颜色。Solution题目说明了至少会染一个条纹,所以我......
  • 『题解』Codeforces 1702A Round Down the Price
    题意这道题其实就是让你求出当前数字与\(10\)的整数幂次的差值(注意不能向上取,只能向下取)。而且题目也标注了\(1\lek\le9\),所以我们可以让\(i\)从\(0\sim9\)......
  • IOS13及以上Fiddler不能抓包问题解决
    iOS 上一般情况下信任HTTPS证书即可抓HTTPS的包(除非APP开启了防止抓包),但最近发现iOS 13以上出现即使安装并信任了证书,当用safari浏览百度时仍出现是否信任该网站......
  • dp完全背包问题解组合问题——零钱兑换
    本题为完全背包问题,遍历容量需要顺序遍历classSolution{public:intchange(intamount,vector<int>&coins){//完全背包顺序遍历//背包容量为a......
  • 题解 P7623 [AHOI2021初中组] 收衣服
    我还在小学的时候以现在初中名义我大五十牛逼参加了这次,然后身败名裂死磕这道题不会,现在觉得自己好傻啊233333显然这是要统计每个区间的贡献,所以我们可以打出来这个暴力,......
  • [蓝桥杯 2022 省 A] 填空问题 题解
    题目传送门这是一道提交答案题,也可以说是一道数学题。第一题我们先来看第一题。由于二维码在纸的中间部分,所以一开始要先裁剪\(4\)刀,这点题目也说了。其次,题目中展......