首页 > 其他分享 >ACWING 503. 借教室 二分+前缀和

ACWING 503. 借教室 二分+前缀和

时间:2024-11-06 10:45:13浏览次数:4  
标签:return 前缀 int mid long 订单 checked 503 ACWING

题目描述

输入格式

输出格式

数据范围

输入样例:
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
输出样例:
-1
2

题目分析 

每个订单都是对第s到t这个区间进行操作,所以可以用差分和前缀来实现对这段区间的快速修改。

在1-m个订单中一定会有最后一个能被处理的订单,因此可将1-m分为两个区间,即可被处理的订单,和不可被处理的订单。因此可以使用二分法找到最后一个能被处理的订单。

这里贴一个luogu大佬的详解题解 P1083 【借教室】 - 洛谷专栏

具体实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int w[N];//每天教室的数量
int d[N], s[N], t[N];
long long b[N];//差分数组

 

二分查找
 int l = 0, r = m;//l=0,防止出现一个订单都不符合的情况
    while (l < r)
    {
        int mid = (l + r + 1) / 2;
        if (checked(mid))
        {
            l = mid;
        }
        else
        {
            r = mid - 1;
        }
    }
    if (r == m)//如果可以处理所有订单
        puts("0");
    else
    {
        printf("-1\n%d", r + 1);//因为二分查找的是最后一个可以满足的订单,因此要+1指向下一个订单
                                //即第一个不满足条件的订单
    }
checked代码的具体实现 
bool checked(int mid)
{
    memset(b, 0, sizeof b);//每次计算前都要清空差分数组
    for (int i = 1; i <= mid; i++)//将前mid(包括mid)个订单需要的教室数量进行差分操作,实现前mid个订单每天需要的教室数量
    {
        b[s[i]] += d[i];
        b[t[i]+1] -= d[i];
    }
    long long S=0;前缀和
    for (int i = 1; i <= n;i++)
    {
        S += b[i];//将差分做一次前缀进行还原
        if(S>w[i])//如果某一天的订单不能满足需要就返回false
            return false;
    }
    return true;
}
完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int w[N];
int d[N], s[N], t[N];
long long b[N];
bool checked(int mid)
{
    memset(b, 0, sizeof b);
    for (int i = 1; i <= mid; i++)
    {
        b[s[i]] += d[i];
        b[t[i]+1] -= d[i];
    }
    long long S=0;
    for (int i = 1; i <= n;i++)
    {
        S += b[i];
        if(S>w[i])
            return false;
    }
    return true;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &w[i]);
    }
    for (int i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &d[i], &s[i], &t[i]);
    }
    int l = 0, r = m;
    while (l < r)
    {
        int mid = (l + r + 1) / 2;
        if (checked(mid))
        {
            l = mid;
        }
        else
        {
            r = mid - 1;
        }
    }
    if (r == m)
        puts("0");
    else
    {
        printf("-1\n%d", r + 1);
    }
    return 0;
}

本蒟蒻第一次题解有不足的地方请dalao们谅解

标签:return,前缀,int,mid,long,订单,checked,503,ACWING
From: https://blog.csdn.net/m0_71238556/article/details/143558334

相关文章

  • ACWing1207_大臣的旅费(bfs)
    有一些自己的理解不知道大家能不能看懂1207.大臣的旅费-AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1209/很久以前,TT 王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,TT 国的大臣们经过......
  • 【无标题】Acwing1238_日志统计(双指针)
    原题链接 :1238.日志统计-AcWing题库https://www.acwing.com/problem/content/1240/题目要求:/***小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有N行。*其中每一行的格式是:tsid表示在ts时刻编号id的帖子收到一个”赞”。*现在小明......
  • 最长公共前缀
    最长公共前缀题目链接:牛客描述给你一个大小为n的字符串数组strs,其中包含n个字符串,编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。示例输入:["abca","abc","abca","abc","abcc"]返回值:"abc"思路step1:确定第i个与第i+1个字符串子串相同的公共......
  • jmeter压测接口报出现503解决办法
    jmeter界面还有503报错2024/10/3017:53:54[error]6522#0:*60199372limitingconnectionsbyzone"perip",client:116.25.118.145,server:rider-mall.test3.fnjkj.cn,request:"POST/rider/order/userBrowse/userOrderQueryHTTP/1.1",host:&quo......
  • 二维前缀和模板
    二维前缀和模板题目描述:输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式:第一行包含三个整数n,m,q接下来n行,每行包含m个整数,表示整数矩阵。接下来......
  • 【算法】前缀树
    基本内容以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀入门例子PHONELST-PhoneList-洛谷|计算机科学教育新生态题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”,“91140”,“20”,“912”}中,“911”......
  • AcWing 802:区间和 ← 离散化
    【题目来源】https://www.acwing.com/problem/content/804/【题目描述】假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行n次操作,每次操作将某一位置x上的数加c。接下来,进行m次询问,每个询问包含两个整数l和r,你需要求出在区间[l,r]之间的所......
  • 算法笔记:Day-04(二维前缀和)
    二维数组及滚动数组304.二维区域和检索-矩阵不可变classNumMatrix{privatefinalint[][]sum;publicNumMatrix(int[][]matrix){intm=matrix.length;intn=matrix[0].length;sum=newint[m+1][n+1];for(in......
  • 20241023 模拟赛(GCD,包含,前缀,移动)
    看题戳这里总结20min自习。上来30min先把t1写了。然后t2没看明白,先打了个暴力?然后发现值域很离谱,dfs就行了。t3t4看了一眼就跑路了。解析A.GCD难度:黄注意到只有当\(n=\)素数\(p\)的正整数次幂时,有\(f(n)=p\),其他情况都是\(f(n)=1\)。所以用欧拉筛筛一遍......
  • 每日OJ题_牛客_DP10最大子矩阵_二维前缀和_C++_Java
    目录牛客_DP10最大子矩阵_二维前缀和题目解析C++代码Java代码牛客_DP10最大子矩阵_二维前缀和最大子矩阵_牛客题霸_牛客网(nowcoder.com)描述:        已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1*1)子矩......