P14971 『GTOI - 2B』DDoS题解
P14971 『GTOI - 2B』DDoS
题目描述
现在有 nnn 个人提交代码给洛谷,其中第 iii 个人提交代码的时间是第 lil_ili 秒至第 rir_iri 秒 (包括第 li,ril_i,r_ili,ri 秒)。
小 H 可以进行若干次操作,每次操作选择两个正整数 x,yx,yx,y 满足 x≤yx\le yx≤y,用 y−x+1y-x+1y−x+1 的代价在区间 [x,y][x,y][x,y] 所对应的时间,即第 xxx 秒到第 yyy 秒内 (包括第 x,yx,yx,y 秒) 向洛谷发起 DDoS 攻击。小 H 可使用的总代价为 mmm。
小 H 希望所有的 nnn 个人在提交代码时都全程受到 DDoS 攻击。
我们认为第 iii 个人提交代码时全程受到 DDoS 攻击,当且仅当对于 ∀j∈[li,ri]\forall j\in[l_i,r_i]∀j∈[li,ri],第 jjj 秒有 DDoS 攻击。
由于小 H 讨厌不连续的攻击,所以他问你,他至少要进行几次操作,才能使得这 nnn 个人提交代码时都全程受到 DDoS 攻击。
如果无论如何都不能使得这 nnn 个人提交代码时都全程受到 DDoS 攻击,输出 −1-1−1。
输入格式
第一行,两个正整数 n,mn,mn,m。
接下来 nnn 行,每行两个正整数 li,ril_i,r_ili,ri。
输出格式
一个整数,表示最小的操作次数,无解输出 -1\text{-1}-1。
输入输出样例 #1
输入 #1
5 12
2 4
11 12
6 8
1 3
10 13
输出 #1
2
输入输出样例 #2
输入 #2
5 12
1 3
6 9
4 5
2 4
10 12
输出 #2
1
输入输出样例 #3
输入 #3
2 14
1 10
2 15
输出 #3
-1
说明/提示
【数据范围】
本题采用捆绑测试。
对于 100%100\%100% 的数据,保证 1≤n≤106,1≤m,li,ri≤1091 \le n \le 10^6,1 \le m,l_i,r_i \le 10^91≤n≤106,1≤m,li,ri≤109。
| Subtask\text{Subtask}Subtask | nnn | m,li,rim,l_i,r_im,li,ri | 分值 |
|---|---|---|---|
| 111 | ≤10\le10≤10 | ≤106\le10^6≤106 | 202020 |
| 222 | ≤105\le10^5≤105 | ≤106\le10^6≤106 | 303030 |
| 333 | ≤106\le10^6≤106 | ≤109\le10^9≤109 | 505050 |
思路
直接暴力。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,m,dl=1,db=0,op=0,b[1000006],de=0,fk=0;
struct one{
long long l,r;
}a[1000006];
bool cmp(one a1,one b1){
return a1.l<b1.l;
}
map<long long,long long> mp;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(db<=a[i].l-2){
op+=(db-dl+1);
if(i!=1) b[++de]=(a[i].l-db-1);
dl=a[i].l;
db=a[i].r;
fk++;
}
else{
db=max(db,a[i].r);
}
}
op+=(db-dl+1);
//fk++;
if(m<=op-1){
cout<<-1<<endl;
}
else{
sort(b+1,b+de+1);
for(int i=1;i<=de;i++){
if(op+b[i]<=m){
op+=b[i];
fk--;
}
// else{
// break;
// }
}
cout<<fk<<endl;
}
return 0;
}

浙公网安备 33010602011771号