Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest(线段树+模拟)

题目链接
大意:给你三个数组,你 可以把任意数组的任意 元素 放到 任意数组中,
使得第一个数组是前缀,第三个数组是后缀,剩下的元素在第二个数组。
我们把三个东西分别记为 1 , 2 , 3 1,2,3 1,2,3,那么相当于 1 n 1-n 1n的元素是连续 的1和连续的2和连续的3组成 。

我们用暴力的思想,就是枚举两个分界点嘛。

然后用数据结构优化这个暴力,先假设只有2,3,那么我们枚举2,3的分界点,记录每个分界点的需要的操作数,记为数组 t t t
t t t建线段树维护最小值。
然后就是遍历1,2的分界点,根据这个元素的值 对线段树进行 u p d a t e update update操作,维护全局最小值即可啦。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
#define fi first
#define se second
#define pb push_back
int len[4],a[N],n;
int f[N][2],b[N];
int T[N<<2];
#define mid (l+r>>1)
#define ls o<<1
#define rs o<<1|1
void build(int o,int l,int r){
    if(l==r){
        T[o]=b[l];
        return ;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    T[o]=min(T[ls],T[rs]);
}
int laz[N<<2];
void ud(int o,int l,int r,int x,int y){
    if(x<=l&&y>=r){
        T[o]--;
        laz[o]--;
        return ;
    }
    if(laz[o]!=0){
        laz[ls]+=laz[o];
        laz[rs]+=laz[o];
        T[ls]+=laz[o];
        T[rs]+=laz[o];
        laz[o]=0;
    }
    if(x<=mid)ud(ls,l,mid,x,y);
    if(y>mid)ud(rs,mid+1,r,x,y);
    T[o]=min(T[ls],T[rs]);
}
int main() {
    ios::sync_with_stdio(false);
    for(int i=1;i<=3;i++)cin>>len[i],n+=len[i];
    for(int i=1;i<=3;i++){
        for(int j=1;j<=len[i];j++){
            int x;
            cin>>x;
            a[x]=i;
        }
    }
    int ans=n-max({len[1],len[2],len[3]});
    int q=0,p=0;
    for(int i=1;i<=n;i++)q+=(a[i]!=3);
    for(int i=0;i<=n;i++){
        if(!i)b[i]=q;
        else{
            if(a[i]!=3)q--;
            if(a[i]!=2)p++;
            b[i]=p+q;
            ans=min(ans,b[i]);
        }
    }
    build(1,0,n);
    int tmp=0;
    for(int i=1;i<=n;i++){
        if(a[i]!=3)ud(1,0,n,0,i-1);
        if(a[i]!=2)ud(1,0,n,i,n);
        if(a[i]!=1)tmp++;
        ans=min(ans,tmp+T[1]);
    }
    cout<<ans<<'\n';
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
04-19 18:50
已编辑
长沙学院 Java
个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务