首页 > 其他分享 >P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室

时间:2024-02-29 21:59:50浏览次数:26  
标签:二分 10 NOIP2012 int 教室 long 订单 P1083 rm

题目链接:

本题由于是对某一段区间的数统一进行删除某个数的操作,很容易想到差分

对于能否二分,有一个界定标准:状态的决策过程或者序列是否满足单调性或者可以局部舍弃性。在本题中,由于随着订单数量的增加,每天可用教室的数量一定单调下降。也即,如果前一份订单都不满足,那么之后的所有订单都不用继续考虑;而如果后一份订单都满足,那么之前的所有订单一定都可以满足,符合局部舍弃性,所以可以二分订单数量。

注:计算前缀和的时候最坏情况下是 \(10^6 \cdot 10^9=10^{15}\) 可能会爆 \(\rm int\),因此差分数组要开 \(\rm long\) \(\rm long\)。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int N = 1e6 + 5;

int n, m, r[N], d[N], s[N], t[N];
LL b[N];//差分数组

bool check(int x) {//二分出第一个不满足题意的数
    for (int i = 1; i <= n; i++) b[i] = r[i] - r[i - 1];//由于要
    for (int i = 1; i <= x; i++) {
        b[s[i]] -= d[i];
        b[t[i] + 1] += d[i];
    }//对[l,x]范围内的订单操作
    for (int i = 1; i <= n; i++) {
        b[i] += b[i - 1];//前缀和,恢复原数据
        if (b[i] < 0) return true;//订单不满足要求
    }
    return false;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &r[i]);
    for (int i = 1; i <= m; i++) scanf("%d%d%d", &d[i], &s[i], &t[i]);

    int l = 1, r = m;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    if (!check(m)) puts("0");//一直到最后一个订单全部都满足就输出0
    else printf("-1\n%d", l);//否则输出二分出的答案
    return 0;
}

标签:二分,10,NOIP2012,int,教室,long,订单,P1083,rm
From: https://www.cnblogs.com/pangyou3s/p/18045584

相关文章

  • 洛谷题单指南-贪心-P1080 [NOIP2012 提高组] 国王游戏
    原题链接:https://www.luogu.com.cn/problem/P1080题意解读:通过不同的排队方式,让获得最多奖赏的大臣金额尽可能的少。此题如果没有思路,用全排列枚举可以“骗”分,更好的做法直觉上是某种贪心策略,另外基于数据规模考虑,要拿满分,需要上高精度。下面就由浅入深一步一步的解决。解题思......
  • P1082 [NOIP2012 提高组] 同余方程
    原题链接扩展欧几里得算法的应用,关于原理性的讲解这里就略去了,这边给出学习链接即模板。intexgcd(inta,intb,int&x,int&y){if(b==0){x=1;y=0;returnx;}intd=exgcd(b,a%b,x,y);x=y;y=d-a/b*y;returnx;}文......
  • 换教室
    虽然我们知道,数学期望DP很多时候是要靠感性理解的但是这道题目显然可以列出所有样本空间去考虑,在这种情况下我们就严谨一点我们先设\(f[i][j]\)表示前\(i\)个课程申请了\(j\)个课程的最小期望路径我们先考虑第\(i\)个课程不申请,那么\(j\)个课程全部都申请到了前\(i-1\)个课程里......
  • [NOIP2012 提高组] 借教室
    原题链接一道二分+差分的题目,作为学习前缀和和差分的引入题目非常合适。首先检验其单调性,如果一个申请人订单不用修改,那么其前面的申请人也不用修改,符合单调性。接着,这道题暴力的思路就很简单,但是看到运算量(n,m高达1e6),暴力的时间复杂度为O(n*m)显然超时。那么就是运用差分思想......
  • [NOIP2012 提高组] 借教室
    [NOIP2012提高组]借教室题目描述在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来天的借教室......
  • P1082 [NOIP2012 提高组] 同余方程
    求关于\(x\)的同余方程\(ax\equiv1(\bmodb)\)的最小正整数解。根据取模的性质,这个方程相当于\(ax+by=1\),其中\(y\)为负数,形式类似于扩展欧几里得的经典形式\(ax+by=\gcd(a,b)\)。方程\(ax+by=m\)有整数解的必要条件是\(\gcd(a,b)|m\),此处\(m=1\),所以有\(\gcd(a,......
  • P1084 [NOIP2012 提高组] 疫情控制
    题意:H国有$n$个城市,这\(n\)个城市用$n-1$条双向道路相互连通构成一棵树,$1$号城市是首都,也是树中的根节点。H国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境......
  • P1084 [NOIP2012 提高组] 疫情控制
    首先军队可以原地不动,时间越多越容易合法,先套上二分。在不回到根的情况下,军队深度肯定越小越好。所以军队能往上移就移,如果能回到根就暂时在根对应的儿子那里驻扎。这个过程用树上倍增优化。做完这一步后,我们找出需要军队驻扎的根的儿子(向下不经过军队就能到达叶子),现在就是要让......
  • P1081 [NOIP2012 提高组] 开车旅行
    题目有点长,一步一步来。预处理出每座城市两人分别会选择的下一座城市用set即可实现。倍增优化DP令\(f_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天会到达的城市。令\(ga_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天,小A行驶的路程。\(gb_{i,j}\)同理。答案枚......
  • [NOIP2012 提高组] 开车旅行
    题目描述小AA和小BB决定利用假期外出旅行,他们将想去的城市从11到nn编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市ii的海拔高度为hihi​,城市ii和城市jj之间的距离di,jdi,j​恰好是这两个城市海拔高度之差的绝对值,即di,j=∣h......