前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >noip2018提高组初赛解析_noip小学组

noip2018提高组初赛解析_noip小学组

作者头像
全栈程序员站长
发布2022-09-23 10:18:24
2490
发布2022-09-23 10:18:24
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

【问题简述】

给定一个数n表示教室数 接下来n个数r[i],表示每天可以借用的教室数量。 有m份订单,每份订单有三个数d[i],s[i],t[i]。表示从S[i]天到t[i]天,借用d[i]个教室。 现在询问能否满足所有订单。 如果能,则输出0 不能,则输出-1,换行输出最早不能满足的订单。

【输入样例】

4 3 2 5 4 3 2 1 3 3 2 4 4 2 4

【输出样例】

-1 2


【分析】

从数据范围看(n,m≤1,000,000),算法的时间复杂度应在O(n)到O(nlogn)之间。可以用线段树维护,也可以用差分树状数组来维护。此处我们来使用一种神奇的算法。 大体思路是用二分答案二分时间,再用差分数组检验答案是否冲突。

二分答案不解释。。。

差分数组这块,懂得可以直接看代码。注意:差分本质是一种离线算法对于一个数列,我们用diff数组,表示后一个与前一个数的差值。例如:在[a,b]的区间中加上Δ(delta),我们可以使diff[a]+=Δ,并使diff[b+1]-=Δ。

完成差分数组的计算后,从左向右再计算一次即可得到每天的总共订单数的确切值。判断是否有一天的预定教室数>固有教室数

附上代码一份:

代码语言:javascript
复制
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000010;
struct node
{
    int d,s,t;
}q[maxn];
int n,m;
int r[maxn];
int read()
{
    int x=0;
    char tmp;
    tmp=getchar();
    while(tmp<'0'||tmp>'9') tmp=getchar();
    while(tmp>='0'&&tmp<='9')
    {
        x=(x<<1)+(x<<3)+tmp-'0';
        tmp=getchar();
    }
    return x;
}
int diff[maxn];
bool check(int x)
{
    memset(diff,0,sizeof(diff));
    for(int i=1;i<=x;i++)
    {
        diff[q[i].s]+=q[i].d;
        diff[q[i].t+1]-=q[i].d;
    }
    int tmp=0;
    for(int i=1;i<=n;i++)
    {
        tmp+=diff[i];
        if(tmp>r[i]) return 0;
    }
    return 1;
}
int main()
{
    freopen("classroom.in","r",stdin);
    freopen("classroom.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        r[i]=read();
    for(int i=1;i<=m;i++)
        q[i].d=read(),q[i].s=read(),q[i].t=read();
    int l=1,r=m,ans=0;
    while(l<=r)
    {
        int mid=l+r>>1;
        if(check(mid)) l=mid+1;
        else ans=mid,r=mid-1;
    }
    if(!ans) printf("0\n");
    else printf("-1\n%d",ans);
    return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172062.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【问题简述】
  • 【输入样例】
  • 【输出样例】
  • 【分析】
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档