码蹄集部分题目(2024OJ赛17期;二分+差分+ST表+单调队列+单调栈)

1🐋🐋小码哥处理订单(钻石;二分+差分)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

【码蹄集进阶塔全题解07】算法基础:二分 MT2070 -- MT2079_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e6+10;
int n,m,r[N],d[N],s[N],t[N],sub[N],need[N];
int le,ri,mid,ans;
​
bool check(int num)
{
    memset(sub,0,sizeof(sub));
    for(int i=1;i<=num;i++)
    {
        sub[s[i]]+=d[i];
        sub[t[i]+1]-=d[i];
    }
    for(int i=1;i<=n;i++)
    {
        need[i]=need[i-1]+sub[i];
        if(need[i]>r[i]) return true;
    }
    return false;
}
​
int main( )
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>r[i];
    for(int i=1;i<=m;i++) cin>>d[i]>>s[i]>>t[i];
    le=1,ri=m;
    if(!check(m))
    {
        cout<<0<<endl;
        return 0;
    }
    while(le<=ri)
    {
        mid=le+(ri-le)/2;
        if(check(mid)) 
        {
            ri=mid-1;
            ans=mid;
        }
        else le=mid+1;
    }
    cout<<"-1"<<endl;
    cout<<ans<<endl;
    return 0;
}

2🐋🐋礼物(钻石;二分)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

【码蹄集进阶塔全题解07】算法基础:二分 MT2070 -- MT2079_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
int cnt1,cnt2,x,y;
​
bool check(int num)
{
    if(num-num/(x*y)<cnt1+cnt2) return 0;
    if(num-num/x<cnt1) return 0;
    if(num-num/y<cnt2) return 1;
    return 1;
}
​
int main( )
{
    cin>>cnt1>>cnt2>>x>>y;
    int l=1,r=2e9;
    int ans,cnt=0;
    while(l<=r)
    {
        int mid=l+(r-l)/2;
        if(check(mid)) 
        {
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    cout<<ans<<endl;
    return 0;
}

🧀🧀🧀ST表

ST表(Sparse Table)是一种用于高效处理区间查询的数据结构。它可以在O(1)的时间复杂度内回答某一区间的最值查询(最小值、最大值等)。ST表使用动态规划的思想,通过预处理的方式来快速计算出各个区间的最值。

推荐这篇:ST表(保姆级,简单易懂)-CSDN博客

3🐋🐋区间按位与(钻石;ST表)

时间限制:2秒

占用内存:64M

🐟题目描述

🐟题目思路

MT3049 区间按位与_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
const int N=2e5+10;
int m,n,a[N],mn[N][50],Lg[N],ans;
​
void pre()
{
    Lg[1]=0;
    for(int i=2;i<=n;i++) Lg[i]=Lg[i>>1]+1;
}
​
void ST_create()
{
    for(int i=1;i<=n;i++) mn[i][0]=a[i];
    for(int j=1;j<=Lg[n];j++)
    {
        for(int i=1;i<=n-(1<<j)+1;i++) mn[i][j]=mn[i][j-1]&mn[i+(1<<(j-1))][j-1];
    }
}
​
int ST_query(int l,int r)
{
    int k=Lg[r-l+1];
    return mn[l][k]&mn[r-(1<<k)+1][k];
}
​
int main( )
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    pre();
    ST_create();
    while(m--)
    {
        int a1,a2;
        cin>>a1>>a2;
        cout<<ST_query(a1,a2)<<'\n';//cout endl会超时
    }
    return 0;
}

4🐋🐋区间按位或(钻石;ST表)

时间限制:2秒

占用内存:128M

🐟题目描述

🐟题目思路

MT3048 区间按位或_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
const int N=2e5+10;
int m,n,a[N],mn[N][50],Lg[N],ans;
​
void pre()
{
    Lg[1]=0;
    for(int i=2;i<=n;i++) Lg[i]=Lg[i>>1]+1;
}
​
void ST_create()
{
    for(int i=1;i<=n;i++) mn[i][0]=a[i];
    for(int j=1;j<=Lg[n];j++)
    {
        for(int i=1;i<=n-(1<<j)+1;i++) mn[i][j]=mn[i][j-1] | mn[i+(1<<(j-1))][j-1];
    }
}
​
int ST_query(int l,int r)
{
    int k=Lg[r-l+1];
    return mn[l][k] | mn[r-(1<<k)+1][k];
}
​
int main( )
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    pre();
    ST_create();
    while(m--)
    {
        int a1,a2;
        cin>>a1>>a2;
        cout<<ST_query(a1,a2)<<'\n';//cout endl会超时
    }
    return 0;
}

5🐋🐋松鼠接松果(钻石;单调队列)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

MT3045 松鼠接松果_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+10;
int n,D,ans=0x3f3f3f3f;
struct POS
{
    int x,y;
    bool operator<(const POS &t) const {return x<t.x;}
}p[N];
deque<int> maxm,minm;
​
int main( )
{
    scanf("%d %d",&n,&D);
    for(int i=1;i<=n;i++) scanf("%d %d",&p[i].x,&p[i].y);
    sort(p+1,p+1+n);
    int L=1;
    for(int i=1;i<=n;i++)
    {
        while(!maxm.empty()&&p[maxm.back()].y<p[i].y) maxm.pop_back();
        maxm.push_back(i);
        while(!minm.empty()&&p[minm.back()].y>p[i].y) minm.pop_back();
        minm.push_back(i);
        while(L<i&&p[maxm.front()].y-p[minm.front()].y>=D)
        {
            ans=min(ans,p[i].x-p[L].x);
            L++;
            while(!maxm.empty()&&maxm.front()<L) maxm.pop_front();
            while(!minm.empty()&&minm.front()<L) minm.pop_front();
        }
    }
    if(ans==0x3f3f3f3f) printf("-1\n");
    else printf("%d\n",ans);
    return 0;
}

单调栈做法:

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
const int maxn=1e5+10;
int q1[maxn],q2[maxn];
struct node
{
    int loc,h;
}Node[maxn];
bool cmp(node a,node b) {return a.loc<b.loc;}
​
int main( )
{
    int N,D;
    scanf("%d %d",&N,&D);
    for(int i=1;i<=N;i++) scanf("%d %d",&Node[i].loc,&Node[i].h);
    sort(Node+1,Node+1+N,cmp);
    int l=1,r=1;
    q1[0]=-1e9;
    q1[1]=Node[1].h;
    q2[1]=Node[1].loc;
    int min_=1e9;
    for(int i=2;i<=N;i++)
    {
        for(int j=r;j>=l;j--)
        {
            if(Node[i].h-q1[j]>=D)
            {
                min_=min(min_,Node[i].loc-q2[j]);
                break;
            }
        }
        r+=1;
        while(r>=l)
        {
            if(q1[r-1]<Node[i].h)
            {
                q1[r]=Node[i].h;
                q2[r]=Node[i].loc;
                break;
            }
            else r--;
        }
    }
    for(int i=1;i<=N/2;i++)
    {
        swap(Node[i].h,Node[N-i+1].h);
        swap(Node[i].loc,Node[N-i+1].loc);
    }
    l=1,r=1;
    q1[0]=-1e9;
    q1[1]=Node[1].h;
    q2[1]=Node[1].loc;
    for(int i=2;i<=N;i++)
    {
        for(int j=r;j>=l;j--)
        {
            if(Node[i].h-q1[j]>=D)
            {
                min_=min(min_,-Node[i].loc+q2[j]);
                break;
            }
        }
        r+=1;
        while(r>=l)
        {
            if(q1[r-1]<Node[i].h)
            {
                q1[r]=Node[i].h;
                q2[r]=Node[i].loc;
                break;
            }
            else r--;
        }
    }
    if(min_==1e9) printf("-1");
    else printf("%d",min_);
    return 0;
}

6🐋🐋排序(星耀;单调栈)

时间限制:1秒

占用内存:256M

🐟题目描述

🐟题目思路

MT3043 排序_哔哩哔哩_bilibili

🐟代码

cpp 复制代码
#include<bits/stdc++.h> 
​
using namespace std;
#define int long long
const int N=2e5+5;
int n,m,a[N],b[N],top;
struct node
{
    int k,x;
}st[N];
signed main( )
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];
    }
    while(m--)
    {
        int k,x;
        cin>>k>>x;
        while(top&&st[top].x<=x) top--;
        st[++top]={k,x};
    }
    int nn=st[1].x;
    sort(b+1,b+1+nn);
    int l=1,r=nn;
    st[top+1].x=0;
    for(int i=1;i<=top;i++)
    {
        int t=st[i].x-st[i+1].x;
        if(st[i].k==1)
        {
            while(t--) a[nn--]=b[r--];
        }
        else
        {
            while(t--) a[nn--]=b[l++];
        }
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}

抱歉uu们,这周有些不太舒服,没有给大家写题解,大家可以先看看视频的讲解,后续有机会我再补一下这期的题解~

有问题我们随时评论区见~

⭐点赞收藏不迷路~

相关推荐
CV-King8 分钟前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家39 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain39 分钟前
算法 | 位运算(哈希思想)
算法
slomay1 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
小飞猪Jay2 小时前
C++面试速通宝典——13
jvm·c++·面试
做网站建设制作设计小程序推广2 小时前
海南网站建设提升网站用户体验实用技巧
经验分享
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家2 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
rjszcb3 小时前
一文说完c++全部基础知识,IO流(二)
c++