0%

CF 967D: Resource Distribution

题意

分析

设两种服务所需服务器数量分别为w1、w2,对应下限分别为p1、p2。假如p1 > p2,那么,我们应该将“优质”的服务器优先分给第一种服务,然后再将剩余的服务器分给第二种服务。并且,为了满足第二种服务,p1应该越大越好。因此,排序后,贪心for两次就行了。这道题的关键是要意识到“优质”服务器应连续分给某一种服务,而不能间断着分

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

#include<bits/stdc++.h>
#define x first
#define y second
#define ok cout << "ok" << endl;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const double PI = acos(-1.0);
const int INF=0x3f3f3f3f;
const ll LINF=0x3f3f3f3f3f3f3f3f;
const int N=3e5+9;
const int shift=1e3+9;
const double Eps=1e-7;

int n, x1, x2, p;
vi v[3];
bool flag;

struct node {
int val, id;
}a[N];

bool cmp(node a, node b) {
return a.val < b.val;
}

int check(int mid) {
int t = ceil(1.0 * x1 / mid);
if(t <= a[p - mid + 1].val)
return 0;
return 1;
}

int main(void) {
if(fopen("in", "r")!=NULL) {freopen("in", "r", stdin); freopen("out", "w", stdout);}
while(cin >> n >> x1 >> x2) {
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i].val);
a[i].id = i;
}
sort(a + 1, a + n + 1, cmp);
flag = false;
v[1].clear();
v[2].clear();
for(int i = 1; i < n; i++) {
int t = ceil(1.0 * x2 / i);
p = n - i;
if(a[p + 1].val >= t) {
int l;
for(int i = p; i >= 1; i--) {
if(check(i) == 0) {
l = i;
flag = true;
break;
}
}
if(flag) {
printf("Yes\n%d %d\n", l, n - p);
for(int i = p; i >= p - l + 1; i--)
printf("%d%c", a[i].id, i == p - l + 1 ? '\n' : ' ');
for(int i = p + 1; i <= n; i++)
printf("%d%c", a[i].id, i == n ? '\n' : ' ');
}
break;
}
}
if(flag) continue;
swap(x1, x2);
for(int i = 1; i < n; i++) {
int t = ceil(1.0 * x2 / i);
p = n - i;
if(a[p + 1].val >= t) {
int l;
for(int i = p; i >= 1; i--) {
if(check(i) == 0) {
l = i;
flag = true;
break;
}
}
if(flag) {
printf("Yes\n%d %d\n", n - p ,l);
for(int i = p + 1; i <= n; i++)
printf("%d%c", a[i].id, i == n ? '\n' : ' ');
for(int i = p; i >= p - l + 1; i--)
printf("%d%c", a[i].id, i == p - l + 1 ? '\n' : ' ');
}
break;
}
}
if(!flag)
printf("No\n");
}

return 0;
}