首页 > 其他分享 >洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室

洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室

时间:2024-07-31 15:52:54浏览次数:7  
标签:NOIP2012 int 洛谷题 sum 教室 long 订单 满足 P1083

原题链接:https://www.luogu.com.cn/problem/P1083

题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。

解题思路:

1、朴素做法

枚举1~m个订单,通过差分减去1~i个订单所需要的教室数量,设a[]为差分数组

a[s[i]] += d[i];
a[t[i] + 1] -= d[i];

再还原前缀和数组s[],逐项比较r[i]和sum[i],如果出现r[i] < sum[i],则找到了不满足需求的订单。

45分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
int n, m;
long long r[N], a[N], sum[N];

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> r[i];
    int d, s, t;
    for(int i = 1; i <= m; i++) 
    {
        cin >> d >> s >> t;
        a[s] += d;
        a[t + 1] -= d;

        for(int j = 1; j <= n; j++)
        {
            sum[j] = sum[j - 1] + a[j];
            if(r[j] < sum[j])
            {
                cout << -1 << endl << i;
                return 0;
            }
        }
    }
    
    cout << 0;
    return 0;
}

2、二分

通过枚举订单,来计算1~i个订单所需的教室数量是否符合条件,必须从头遍历所有订单

是否可以二分来求最后一个满足需求的订单编号呢?

单调性分析:订单越少越可能满足需求,订单越多不难以满足需求

设二分到最后一个满足需求的订单编号是x,如果此时1~i号订单所需教室数都能满足,说明订单可以更多一点,x往更大范围找,否则x往更小范围找。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
int n, m;
int d[N], s[N], t[N];
long long r[N], a[N], sum[N];

bool check(int x)
{
    memset(a, 0, sizeof(a));
    for(int i = 1; i <= x; i++)
    {
        a[s[i]] += d[i];
        a[t[i] + 1] -= d[i];
    }
    for(int i = 1; i <= n; i++)
    {
        sum[i] = sum[i - 1] + a[i];
        if(r[i] < sum[i]) return false;
    }
    return true;
}

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];
    
    int l = 1, r = m, ans = 1; //所有订单都不满足时答案默认是第1个订单
    while(l <= r)
    {
        int mid = l + r >> 1;
        if(check(mid))
        {
            ans = mid + 1;
            l = mid + 1;
        }
        else r = mid - 1;
    }
   
    if(ans <= m) cout << -1 << endl << ans;
    else cout << 0;

    return 0;
}

 

标签:NOIP2012,int,洛谷题,sum,教室,long,订单,满足,P1083
From: https://www.cnblogs.com/jcwy/p/18334812

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • P1081 [NOIP2012 提高组] 开车旅行
    思路:首先令\(nxt1_i\)表示右侧最近的城市距离(\(id1_i\)为编号),令\(nxt2_i\)表示右侧第二近的城市编号(\(id2_i\)为编号);可以使用set找出离这个城市最近的\(4\)个城市(前面两个,后面两个)。定义:\(f_{i,j}\)表示从\(i\)点出发走\(2^j\)轮最后到达的位置。\(dp1_{i,......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • P1082 [NOIP2012 提高组] 同余方程
    [NOIP2012提高组]同余方程解法在这个问题中,我们想要找到......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......
  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......