0
点赞
收藏
分享

微信扫一扫

借教室 差分+二分答案

月孛星君 2022-05-27 阅读 60

题目描述

在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。

面对海量租借教室的信息,我们自然希望编程解决这个问题。

我们需要处理接下来借教室 差分+二分答案_#define

我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供借教室 差分+二分答案_#include_02

借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第借教室 差分+二分答案_i++_03

现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改订单。

输入输出格式

输入格式:

第一行包含两个正整数借教室 差分+二分答案_#define_04

第二行包含借教室 差分+二分答案_#define_05

接下来有借教室 差分+二分答案_#include_06

每行相邻的两个数之间均用一个空格隔开。天数与订单均用从借教室 差分+二分答案_#include_07

输出格式:

如果所有订单均可满足,则输出只有一行,包含一个整数借教室 差分+二分答案_#include_08

输出两行,第一行输出一个负整数借教室 差分+二分答案_i++_09

输入输出样例

输入样例#1:

复制

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

输出样例#1: 复制

-1 
2

说明

【输入输出样例说明】

借教室 差分+二分答案_i++_10

【数据范围】

对于10%的数据,有借教室 差分+二分答案_#define_11

对于30%的数据,有借教室 差分+二分答案_i++_12

对于 70%的数据,有借教室 差分+二分答案_i++_13

对于 100%的数据,有借教室 差分+二分答案_#include_14

NOIP 2012 提高组 第二天 第二题

答案具有单调性,所以我们可以二分来判断x组以前是否都满足;

由于是区间问题,所以我们用差分数组dt来修改,

最后求某一项就是前缀和即

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
//#pragma GCC optimize(2)
using namespace std;
#define maxn 1000005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-4
typedef pair pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair pii;
inline ll rd() {
ll x = 0;
char c = getchar();
bool f = false;
while (!isdigit(c)) {
if (c == '-') f = true;
c = getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
}

ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; }


/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1; y = 0; return a;
}
ans = exgcd(b, a%b, x, y);
ll t = x; x = y; y = t - a / b * y;
return ans;
}
*/
int n, m;
int rest[maxn];
int l[maxn], r[maxn], d[maxn];
int dt[maxn];
int tmp[maxn];
bool chk(int x) {
ms(dt); ms(tmp);
for (int i = 1; i <= x; i++) {
dt[l[i]] += d[i]; dt[r[i] + 1] -= d[i];
}
for (int i = 1; i <= n; i++) {
tmp[i] = tmp[i - 1] + dt[i];
if (tmp[i] > rest[i])return false;
}
return true;
}


int main() {
//ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)rdint(rest[i]);
for (int i = 1; i <= m; i++) {
rdint(d[i]);
rdint(l[i]); rdint(r[i]);
}
if (chk(m))cout << 0 << endl;
else {
int l = 1, r = m;
while (l <= r) {
int mid = (l + r) / 2;
if (chk(mid))l = mid + 1;
else r = mid - 1;
}
cout << -1 << endl << l << endl;
}
return 0;
}

 

可;

 

EPFL - Fighting

举报

相关推荐

0 条评论