[写在前面感(乱)叹(七)人(八)生(糟)的话]
本想借此机会一口气玩到蓝名,结果,A题写炸(少判了一种情况),C题写炸(辜负了我5分钟狂敲出来的线段树),结果又掉Rating...内心好绝望。。。
Problem#A Carrot Cakes
vjudge链接[here]
(偷个懒,cf链接就不给了)
题目大意是说,烤面包,给出一段时间内可以考的面包数,建第二个炉子的时间,需要达到的面包数,问建炉子是否合理。
玄学 & 智商题,可能是因为我智商不够,所以在我决定休息的时候被hank掉了。。。
输NO的情况大概是当炉子建好后,考完第一波的时间,任务已经或刚好完成。
Code
1 /** 2 * Codeforces 3 * Problem#799A 4 * Accepted 5 * Time:15ms 6 * Memory:8k 7 */ 8 #include<iostream> 9 #include<fstream> 10 #include<sstream> 11 #include<algorithm> 12 #include<cstdio> 13 #include<cstring> 14 #include<cstdlib> 15 #include<cctype> 16 #include<cmath> 17 #include<ctime> 18 #include<map> 19 #include<stack> 20 #include<set> 21 #include<queue> 22 #include<vector> 23 using namespace std; 24 typedef bool boolean; 25 #define inf 0xfffffff 26 #define smin(a, b) (a) = min((a), (b)) 27 #define smax(a, b) (a) = max((a), (b)) 28 template<typename T> 29 inline boolean readInteger(T& u) { 30 char x; 31 int aFlag = 1; 32 while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1); 33 if(x == -1) { 34 ungetc(x, stdin); 35 return false; 36 } 37 if(x == ‘-‘) { 38 aFlag = -1; 39 x = getchar(); 40 } 41 for(u = x - ‘0‘; isdigit((x = getchar())); u = u * 10 + x - ‘0‘); 42 u *= aFlag; 43 ungetc(x, stdin); 44 return true; 45 } 46 47 int n, t, k, d; 48 49 inline void work() { 50 readInteger(n); 51 readInteger(t); 52 readInteger(k); 53 readInteger(d); 54 int turns = d / t + 1; 55 if(turns * k > n) 56 puts("NO"); 57 else if(turns * k == n && (d == t || turns * t <= d + t)) 58 puts("NO"); 59 else 60 puts("YES"); 61 } 62 63 int main() { 64 work(); 65 return 0; 66 }
Problem#A
Problem#B T-shirt buying
vjudge链接[here]
题目大意是说,每件衣服有两面,每面有个颜色,有些人要来买,他只买存在一面有他喜欢的颜色且价格最低的一个,输出每个人付的钱,没有买到输出-1。
用个set,依题意乱搞就好了。(每场比赛貌似都是b题稳AC)
Code
1 /** 2 * Codeforces 3 * Problem#799B 4 * Accepted 5 * Time:296ms 6 * Memory:14964k 7 */ 8 #include<iostream> 9 #include<fstream> 10 #include<sstream> 11 #include<algorithm> 12 #include<cstdio> 13 #include<cstring> 14 #include<cstdlib> 15 #include<cctype> 16 #include<cmath> 17 #include<ctime> 18 #include<map> 19 #include<stack> 20 #include<set> 21 #include<queue> 22 #include<vector> 23 using namespace std; 24 typedef bool boolean; 25 #define inf 0xfffffff 26 #define smin(a, b) (a) = min((a), (b)) 27 #define smax(a, b) (a) = max((a), (b)) 28 template<typename T> 29 inline boolean readInteger(T& u) { 30 char x; 31 int aFlag = 1; 32 while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1); 33 if(x == -1) { 34 ungetc(x, stdin); 35 return false; 36 } 37 if(x == ‘-‘) { 38 aFlag = -1; 39 x = getchar(); 40 } 41 for(u = x - ‘0‘; isdigit((x = getchar())); u = u * 10 + x - ‘0‘); 42 u *= aFlag; 43 ungetc(x, stdin); 44 return true; 45 } 46 47 typedef class Tshirt { 48 public: 49 int p; 50 int id; 51 52 Tshirt() { } 53 Tshirt(int p, int id):p(p), id(id) { } 54 55 boolean operator < (Tshirt b) const { 56 if(p != b.p) return p < b.p; 57 return id < b.id; 58 } 59 }Tshirt; 60 61 int n, m; 62 int* prices; 63 int *color1, *color2; 64 65 multiset<Tshirt> ps[3]; 66 67 inline void init() { 68 readInteger(n); 69 prices = new int[(const int)(n + 1)]; 70 color1 = new int[(const int)(n + 1)]; 71 color2 = new int[(const int)(n + 1)]; 72 for(int i = 1; i <= n; i++) 73 readInteger(prices[i]); 74 for(int i = 1; i <= n; i++) { 75 readInteger(color1[i]); 76 ps[color1[i] - 1].insert(Tshirt(prices[i], i)); 77 } 78 for(int i = 1; i <= n; i++) { 79 readInteger(color2[i]); 80 if(color1[i] != color2[i]) 81 ps[color2[i] - 1].insert(Tshirt(prices[i], i)); 82 } 83 } 84 85 inline void solve() { 86 int c; 87 readInteger(m); 88 while(m--) { 89 readInteger(c); 90 c--; 91 if(ps[c].size() == 0) { 92 printf("-1 "); 93 } else { 94 multiset<Tshirt>::iterator t = ps[c].begin(); 95 printf("%d ", t->p); 96 if(color1[t->id] != c + 1) { 97 ps[color1[t->id] - 1].erase(ps[color1[t->id] - 1].find(Tshirt(t->p, t->id))); 98 } else if (color2[t->id] != c + 1) { 99 ps[color2[t->id] - 1].erase(ps[color2[t->id] - 1].find(*t)); 100 } 101 ps[c].erase(t); 102 } 103 } 104 } 105 106 int main() { 107 init(); 108 solve(); 109 return 0; 110 }
Problem#B
Problem#C Fountains
vjudge链接[here]
C题思路不是很难,很好想,结果写炸了。。。
第一种情况,买两个不同购买方式的物品,贪心就好了。
第二种情况,买两个购买方式相同的物品,先按价格从小到大拍一道序,然后记录一个能延伸到的一个最远的物品r,每次i++时要用while循环去更新r,接着剩下的事交给线段树查最大值就好了。两种购买方式的物品都做一下就好了。
当然,写炸的缘故
1.自己坑自己。。sort的cmpare函数改了后没有改for循环的顺序(第一种情况比较懒,开始就写了就不想改了)
2.少特判当某种购买方式的物品不存在的情况,然后建树就挂了,MLE。
Code
1 /** 2 * Codeforces 3 * Problem#799C 4 * Accepted 5 * Time:62ms 6 * Memory:6300k 7 */ 8 #include<iostream> 9 #include<fstream> 10 #include<sstream> 11 #include<algorithm> 12 #include<cstdio> 13 #include<cstring> 14 #include<cstdlib> 15 #include<cctype> 16 #include<cmath> 17 #include<ctime> 18 #include<map> 19 #include<stack> 20 #include<set> 21 #include<queue> 22 #include<vector> 23 using namespace std; 24 typedef bool boolean; 25 #define inf 0xfffffff 26 #define smin(a, b) (a) = min((a), (b)) 27 #define smax(a, b) (a) = max((a), (b)) 28 template<typename T> 29 inline boolean readInteger(T& u) { 30 char x; 31 int aFlag = 1; 32 while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1); 33 if(x == -1) { 34 ungetc(x, stdin); 35 return false; 36 } 37 if(x == ‘-‘) { 38 aFlag = -1; 39 x = getchar(); 40 } 41 for(u = x - ‘0‘; isdigit((x = getchar())); u = u * 10 + x - ‘0‘); 42 u *= aFlag; 43 ungetc(x, stdin); 44 return true; 45 } 46 47 typedef class MyPair { 48 public: 49 int c; 50 int p; 51 52 MyPair(int c = 0, int p = 0):c(c), p(p) { } 53 }MyPair; 54 55 typedef class SegTreeNode { 56 public: 57 int val; 58 SegTreeNode* l, *r; 59 60 SegTreeNode():val(0), l(NULL), r(NULL) { } 61 62 inline void pushUp() { 63 val = max(l->val, r->val); 64 } 65 }SegTreeNode; 66 67 typedef class SegTree { 68 public: 69 SegTreeNode* root; 70 71 SegTree() { } 72 SegTree(int n, MyPair*& lis) { 73 build(root, 1, n, lis); 74 } 75 76 void build(SegTreeNode*& node, int l, int r, MyPair*& lis) { 77 node = new SegTreeNode(); 78 if(l == r) { 79 node->val = lis[l].c; 80 return; 81 } 82 int mid = (l + r) >> 1; 83 build(node->l, l, mid, lis); 84 build(node->r, mid + 1, r, lis); 85 node->pushUp(); 86 } 87 88 int query(SegTreeNode*& node, int l, int r, int ql, int qr) { 89 if(ql > qr) return 0; 90 if(l == ql && r == qr) { 91 return node->val; 92 } 93 int mid = (l + r) >> 1; 94 if(qr <= mid) return query(node->l, l, mid, ql, qr); 95 if(ql > mid) return query(node->r, mid + 1, r, ql, qr); 96 int a = query(node->l, l, mid, ql, mid); 97 int b = query(node->r, mid + 1, r, mid + 1, qr); 98 return max(a, b); 99 } 100 101 void clear(SegTreeNode*& node) { 102 if(node->l) clear(node->l); 103 if(node->r) clear(node->r); 104 delete node; 105 } 106 }SegTree; 107 108 int n; 109 int C, D; 110 MyPair *cs, *ds; 111 int cnc = 0, cnd = 0; 112 int bc = -1, bd = -1; 113 SegTree stc, stdd; 114 115 inline void init() { 116 readInteger(n); 117 readInteger(C); 118 readInteger(D); 119 cs = new MyPair[(const int)(n + 1)]; 120 ds = new MyPair[(const int)(n + 1)]; 121 int a, b; 122 char x; 123 for(int i = 1; i <= n; i++) { 124 readInteger(a); 125 readInteger(b); 126 getchar(); x = getchar(); 127 if(x == ‘C‘ && b <= C) 128 cs[++cnc] = MyPair(a, b); 129 else if(x == ‘D‘ && b <= D) 130 ds[++cnd] = MyPair(a, b); 131 } 132 } 133 134 boolean cmp1(const MyPair& a, const MyPair& b) { 135 if(a.c != b.c) return a.c > b.c; 136 return a.p < b.p; 137 } 138 139 boolean cmp2(const MyPair& a, const MyPair& b) { 140 if(a.p != b.p) return a.p < b.p; 141 return a.c > b.c; 142 } 143 144 int res = 0; 145 146 inline void solve() { 147 if(cnc > 0) 148 sort(cs + 1, cs + cnc + 1, cmp1); 149 if(cnd > 0) 150 sort(ds + 1, ds + cnd + 1, cmp1); 151 for(int i = 1; i <= cnc; i++) 152 if(cs[i].p <= C) { 153 bc = cs[i].c; 154 break; 155 } 156 for(int i = 1; i <= cnd; i++) 157 if(ds[i].p <= D) { 158 bd = ds[i].c; 159 break; 160 } 161 if(bc != -1 && bd != -1) 162 res = bc + bd; 163 164 if(cnc > 0) 165 sort(cs + 1, cs + cnc + 1, cmp2); 166 if(cnd > 0) 167 sort(ds + 1, ds + cnd + 1, cmp2); 168 int r = cnc; 169 if(cnc) { 170 stc = SegTree(cnc, cs); 171 for(int i = 1; i <= r; i++) { 172 int a0 = 0, a1 = 0; 173 while(cs[i].p + cs[r].p > C) r--; 174 if(i > r) break; 175 if(i > 1) 176 a0 = stc.query(stc.root, 1, cnc, 1, i - 1); 177 if(i < cnc) 178 a1 = stc.query(stc.root, 1, cnc, i + 1, r); 179 if(a0 == 0 && a1 == 0) continue; 180 smax(res, max(a0, a1) + cs[i].c); 181 } 182 } 183 184 r = cnd; 185 if(cnd) { 186 stdd = SegTree(cnd, ds); 187 for(int i = 1; i <= r; i++) { 188 int a0 = 0, a1 = 0; 189 while(ds[i].p + ds[r].p > D) r--; 190 if(i > r) break; 191 if(i > 1) 192 a0 = stdd.query(stdd.root, 1, cnd, 1, i - 1); 193 if(i < cnd) 194 a1 = stdd.query(stdd.root, 1, cnd, i + 1, r); 195 if(a0 == 0 && a1 == 0) continue; 196 smax(res, max(a0, a1) + ds[i].c); 197 } 198 } 199 printf("%d", res); 200 } 201 202 int main() { 203 init(); 204 solve(); 205 return 0; 206 }
Problem#C
时间: 2024-10-31 00:41:12