Codeforces Round #576 (Div. 2)

英语场,手速场。

题目链接:http://codeforces.com/contest/1199


A:

O(n)扫一遍,对于每个a[i],往前扫x个往后扫y个完事。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 1e5 + 10;
21 int n, x, y, a[maxn];
22 
23 int main() {
24     scanf("%d%d%d", &n, &x, &y);
25     rep1(i, 1, n) scanf("%d", &a[i]);
26     rep1(i, 1, n) {
27         int flag1 = 1, flag2 = 1;
28         for (int j = i - 1; j >= 1 && j >= i - x; j--)
29             if (a[j] < a[i]) {
30                 flag1 = 0; break;
31             }
32         for (int j = i + 1; j <= n && j <= i + y; j++)
33             if (a[j] < a[i]) {
34                 flag2 = 0; break;
35             }
36         if (flag1 && flag2) {
37             printf("%d
", i);
38             return 0;
39         }
40     }
41     return 0;
42 }
View Code

B:

给定H和L,求解r^2-(r-H)^2=L^2,并输出r-H。

小学数学。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int H, L;
21 
22 int main() {
23     scanf("%d%d", &H, &L);
24     double h = H, l = L;
25     printf("%.6f
", (l * l + h * h) / 2.0 / h - h);
26     return 0;
27 }
View Code

C:

题意巨恶心的一题。

给定一个数组,定义数组大小为数组元素个数*数组所含数字种类数。给定一个压缩算法,该压缩算法选择一个区间[l,r],然后逐个检查数组元素是否在区间内。若<l,则使之变为l;若>r,则使之变为r。

题目给定n(数组长度)和b,问在执行该压缩算法后,最少变几个元素,使得数组大小<=8*b。

一开始没认真思考压缩算法的作用,盲目贪心导致wa11。贪心显然是错的,不能保证压缩后的数组所有元素都在区间内。

用一个vector<pair<int,int>>来记录数字和出现次数。尺取维护当前区间元素个数。对于给定的b,显然有k=8*b/n,K=pow(2,k)。这样就确定了算法结束后最终剩余多少种数字。O(n)判一遍完事。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int n, I, k, K = 1, total = 0, ans;
21 map<int, int>cnt;
22 vector<pair<int, int>>v;
23 
24 int main() {
25     scanf("%d%d", &n, &I); k = (I << 3) / n;
26     rep1(i, 1, k) {
27         K <<= 1;
28         if (K > n) break;
29     }
30     for (int i = 0, a; i < n; i++) {
31         scanf("%d", &a);
32         cnt[a]++;
33     }
34     for (auto i : cnt) v.pb(i);
35     for (int i = 0; i < min(K, (int)v.size()); i++)
36         total += v[i].second;
37     ans = total;
38     for (int i = K; i < (int)v.size(); i++)
39         total = total + v[i].second - v[i - K].second, ans = max(ans, total);
40     printf("%d
", n - ans);
41     return 0;
42 }
View Code

D:

给定一个数组和q次操作,操作分为两类:1、把数组某个元素修改为给定值val;2、检查整个数组,若某元素小于给定值val,变为val。输出q次操作之后的数组。

一眼线段树。单点修改很简单,区间修改就上lazy tag。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 2e5 + 10;
21 int n, m, a[maxn], ans[maxn];
22 struct SegmentTree {
23     struct Node {
24         int val, add;
25     } mem[maxn << 2];
26     SegmentTree() {}
27 
28     void build(int *a, int curpos, int curl, int curr) {
29         if (curl == curr) {
30             mem[curpos].val = a[curl];
31             mem[curpos].add = 0;
32             return;
33         }
34         int mid = curl + curr >> 1;
35         build(a, lson, curl, mid); build(a, rson, mid + 1, curr);
36     }
37 
38     void update(int curpos, int pos, int curl, int curr, int val) {
39         if (curl == curr) {
40             mem[curpos].val = val;
41             mem[curpos].add = 0;
42             return;
43         }
44         int mid = curl + curr >> 1;
45         mem[lson].add = max(mem[curpos].add, mem[lson].add);
46         mem[rson].add = max(mem[curpos].add, mem[rson].add);
47         mem[curpos].add = 0;
48         if (pos <= mid) update(lson, pos, curl, mid, val);
49         else update(rson, pos, mid + 1, curr, val);
50     }
51 
52     void maintain(int curpos, int curl, int curr) {
53         if (curl == curr) {
54             ans[curl] = max(mem[curpos].val, mem[curpos].add);
55             return;
56         }
57         mem[lson].add = max(mem[lson].add, mem[curpos].add);
58         mem[rson].add = max(mem[rson].add, mem[curpos].add);
59         int mid = curl + curr >> 1;
60         maintain(lson, curl, mid); maintain(rson, mid + 1, curr);
61     }
62 } st;
63 
64 int main() {
65     scanf("%d", &n);
66     rep1(i, 1, n) scanf("%d", &a[i]);
67     st.build(a, 1, 1, n);
68     scanf("%d", &m);
69     while (m--) {
70         int op; scanf("%d", &op);
71         if (op == 1) {
72             int pos, val; scanf("%d%d", &pos, &val);
73             st.update(1, pos, 1, n, val);
74         } else {
75             int val; scanf("%d", &val);
76             st.mem[1].add = max(st.mem[1].add, val);
77         }
78     }
79     st.maintain(1, 1, n);
80     rep1(i, 1, n) printf("%d ", ans[i]);
81     return 0;
82 }
View Code
原文地址:https://www.cnblogs.com/JHSeng/p/11273719.html