首页 > 其他分享 >CF1848B Vika and the Bridge 题解

CF1848B Vika and the Bridge 题解

时间:2023-09-03 12:22:18浏览次数:49  
标签:pre Bridge ci 颜色 int 题解 大值 maxn Vika

CF1848B Vika and the Bridge 题解

题目大意

给个题目传送门吧,感觉题意已经很清楚了

题目传送门

分析

我不会告诉你我第一眼看过去是二分

因为我们只能改一块木板的颜色,所以可以考虑贪心。大概算了下复杂度,也没有问题。

题解

我们要去求每种颜色最大距离的最小值,那我们可以先去求每种颜色的最大值。

求完以后,直接将每种颜色的最大值减半,就是我们的最远距离 \(\dots\) 了吗?

并不是,因为有可能最大值减半后,这个新的值比原来的次大值小,那么最远距离就成了次大值。所以我们一开始也要求出每种颜色的次大值。最后将每种颜色最大值的一半与次大值取较大的一个,也就是这个颜色的最远距离,再取所有颜色的最远距离的最小值,就是答案啦。

好多最值,自己差点绕进去 qwq

时间复杂度: \(O(n + m)\)

代码

#include <bits/stdc++.h>
#define M 200005

using namespace std;

int T, m, n, c[M], maxn[M], pre[M], ci_maxn[M], ans;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> T;
    for(int t = 1; t <= T; ++ t) {
        ans = INT_MAX;
        cin >> n >> m;
        for(int i = 1; i <= m; ++ i)    
            pre[i] = maxn[i] = ci_maxn[i] = 0;
        for(int i = 1; i <= n; ++ i) {
            cin >> c[i];
            if(i - pre[c[i]] - 1 > maxn[c[i]]) {
                ci_maxn[c[i]] = maxn[c[i]];
                maxn[c[i]] = i - pre[c[i]] - 1;
            }
            else
                if(i - pre[c[i]] - 1 > ci_maxn[c[i]])
                    ci_maxn[c[i]] = i - pre[c[i]] - 1;
            pre[c[i]] = i;
        }
        for(int i = 1; i <= m; ++ i) {
            if(n - pre[i] > maxn[i]) {
                ci_maxn[i] = maxn[i];
                maxn[i] = n - pre[i];
            }
            else
                if(n - pre[i] > ci_maxn[i])
                    ci_maxn[i] = n - pre[i];
            ans = min(max(maxn[i] / 2, ci_maxn[i]), ans);
        }
        cout << ans << '\n';
    }
}

标签:pre,Bridge,ci,颜色,int,题解,大值,maxn,Vika
From: https://www.cnblogs.com/Meteor-streaking/p/17674847.html

相关文章

  • 有关Vue-Cli5.X工程中ESLint组件命名检查问题解决
    个人开发环境简介,工具用的VisualStudioCode,因为每个人的开发环境不同,不可能所有解决方案通用,防止踩坑。PSF:\VueWorkSpace\vue_router_test>node-vv16.12.0PSF:\VueWorkSpace\vue_router_test>npm-v8.1.0PSF:\VueWorkSpace\vue_router_test>npmeslint-v8.1.0......
  • P3604 美好的每一天题解
    传送门好题!首先说这道题的时间复杂度:\(O(26n\sqrtn)\)。因为转移是的常数是\(O(26)\)并非\(O(1)\),这启示我们,看数据范围,不要被O(1)给限制了,O(1)是一般情况,有些题不一般首先,回文串能出现的条件是所有的字符都出现偶数次\(or\)仅有一个字符出现奇数次,所以我们并不关心每个......
  • 【题解】AtCoder Beginner Contest 318(D - Ex)
    赛时过了A-G,Ex仿佛猜到了结论但是完全不懂多项式科技,就炸了。大家好像都秒了A,B,C就不写了。D.GeneralWeightedMaxMatching题目描述:给你一个加权无向完全图,图中有\(N\)个顶点,编号从\(1\)到\(N\)。连接顶点\(i\)和\(j\)的\((i<j)\)的权重为\(D_{i,j}\)。在......
  • P4198 楼房重建题解
    传送门一眼数据结构。考虑线段树,记录该区间能看到最多的建筑数量\(ans_{wz}\)以及看到区间中最大的斜率(或者说,该区间内最后看到的建筑)\(xl_{wz}\)。很明显,假如我现在的修改操作是\((x,y)\),那么会改变\(\log_n\)个节点,即包含\(x\)的节点,考虑如何修改他们的\(ans\)和\(......
  • AT_abc318_e 题解
    AT_abc318_eSandwiches题解Links洛谷AtCoderDescription给定一个长度为\(n\)的序列\(a\),找到满足以下条件的三元组\((a,b,c)\)的数量。\(i<j<k\);\(a_{i}=a_{k}\);\(a_{i}\neqa_{j}\)。数据范围:\(1\leqn\leq3\times10^{5}\),\(1\leqa_{i}\leqn......
  • ABC317题解报告
    我直接从第三题开始讲了。T3把数组\(A\)从大到小排序。然后从前往后把前\(q\)个数加起来,然后判断这\(q\)个数的和与\(d\)的大小关系,如果大了就变成\(d\)。然后有些细节就看代码吧。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintm......
  • 龙芯平台Hadoop集群搭建问题解决
    这几天一直在困扰我pycurl版本和本机的版本不符合他连接又连接的自己自带的版本与系统不相同低级也会报错 https://blog.csdn.net/u010910682/article/details/89496550/?ops_request_misc=&request_id=&biz_id=102&utm_term=pycurl7.45.2%20%E6%90%AD%E9%85%8Dlibcurl%E6%......
  • 【题解】NOIP2021
    咕咕咕的东西总是要补的。A.报数题目描述:报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是\(7\)的倍数,或十进制表示中含有数字\(7\),就必须跳过这个数,否则就输掉了游戏。在一个风和日丽的下午,刚刚结束SPC20nn比赛的小r和......
  • 【题解】Luogu[P7706] 「Wdsr-2.7」文文的摄影布置
    Link一道很有意思的线段树题。第一步分析,我们要求最大的\(a_i+a_k-\min{(b_j)}\),事实上我们可以直接省去这个\(\min\)因为要最大化这个东西,选出来的\(b_j\)必然是最小的,所以原题转化为给定\(l,r\)求\(\max{(a_i-b_j+a_k)}\)其中\(i<j<k\)。第二步分析,我们发现这是一......
  • 【题解】Educational Codeforces Round 153(CF1860)
    每次打都想感叹一句,Educational名不虚传。A.NotaSubstring题目描述:有\(t\)组数据,对于每一组数据,你需要判断能否构造一个只由左右括号组成且长度为已经给定字符串的\(2\)倍且已经给定的字符串不是子串的合法字符串。注:合法的字符串是左右括号能完全匹配的字符串。如果能,......