如果没有必选的限制条件,就是水题了、、、

只要按照w + t排序就可以了,然后搞个堆来维护

于是有了限制条件,还是水题。。。

到了必选的时候强制选上,不加入堆中即可。

 

 1 /**************************************************************
 2     Problem: 1555
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:2228 ms
 7     Memory:10948 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cctype>
12 #include <algorithm>
13 #include <queue>
14  
15 using namespace std;
16 typedef long long ll;
17 const int N  = 600005;
18  
19 struct data {
20     int w, t, f;
21 }a[N];
22 bool operator < (const data &a, const data &b) {
23     return (ll) a.w + a.t < (ll) b.w + b.t;
24 }
25  
26 ll tot, V;
27 int n, m, w, ans;
28 priority_queue <int> q;
29  
30 inline ll read() {
31     ll x = 0;
32     char ch = getchar();
33     while (!isdigit(ch))
34         ch = getchar();
35     while (isdigit(ch)) {
36         x = x * 10 + ch - '0';
37         ch = getchar();
38     }
39     return x;
40 }
41  
42 inline void del_top() {
43     tot -= q.top(), q.pop();
44     --ans;
45 }
46  
47 inline void add(int x) {
48     tot += a[x].w, q.push(a[x].w);
49     ++ans;
50 }
51  
52 bool work() {
53     int i;
54     tot = 0;
55     for (i = 1; i <= n; ++i)
56         if (a[i].f == 1) {
57             while (tot > a[i].t) {
58                 if (q.empty()) return 0;
59                 del_top();
60             }
61             tot += a[i].w, ++ans;
62         }else {
63             if (!q.empty() && tot > a[i].t)
64                 if (q.top() < a[i].w || tot - q.top() > a[i].t)
65                     continue;
66             if (tot > a[i].t)
67                 del_top();
68             add(i);
69         }
70     return 1;
71 }
72  
73 int main() {
74     int i, X;
75     n = read(), m = read(), V = read();
76     for (i = 1; i <= n; ++i)
77         a[i].w = read(), a[i].t = read();
78     for (i = 1; i <= m; ++i) {
79         X = read(), a[X].f = 1;
80         tot += a[X].w;
81     }
82     sort(a + 1, a + n + 1);
83     a[++n].f = 1, a[n].t = V;
84     if (!work()) puts("Foolish SD!");
85     else printf("%d\n", ans - 1);
86     return 0;
87 }
View Code

(p.s. 怎么又想开fread二笔优化了呢、、、233)

posted on 2014-11-16 16:36  Xs酱~  阅读(355)  评论(0编辑  收藏  举报