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\n", 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\n", (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 const int maxn = 4e5 + 10;
21 int n, m, a[maxn], k = 0, ans = int_inf, sum[maxn];
22 ll K;
23 
24 int main() {
25     scanf("%d%d", &n, &m); k = m * 8 / n;
26     if (k > 33) k = 33;
27     K = pow(2, k);
28     rep1(i, 1, n) scanf("%d", &a[i]);
29     sot(a, n);
30     vector<pair<int, int>>v; // num,times
31     int cnt = 1;
32     rep1(i, 2, n) {
33         if (a[i] == a[i - 1]) cnt++;
34         else {
35             v.pb(mp(a[i - 1], cnt));
36             cnt = 1;
37         }
38     }
39     v.pb(mp(a[n], cnt));
40     int vsize = v.size();
41     sum[0] = 0;
42     for (int i = 0; i < vsize; i++)
43         sum[i + 1] = sum[i] + v[i].second;
44     rep1(i, 1, n - K + 1) {
45         ans = min(ans, n - (sum[i + K - 1] - sum[i - 1]));
46     }
47     printf("%d\n", ans);
48     return 0;
49 }
View Code

D:

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

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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define up(i, a, b) for (int i = (a); i <= (b); i++)
 6 #define down(i, a, b) for (int i = (a); i >= (b); i--)
 7 #define mem(x, y) memset(x, (y), sizeof x)
 8 #define ff first
 9 #define ss second
10 #define mp(x, y) make_pair(x, y)
11 #define pb(x) push_back(x)
12 #define sc(a) scanf("%d", &a)
13 #define scl(a) scanf("%lld", &a)
14 #define scs(a) scanf("%s", a)
15 #define pr(a, b) printf("%d%c", a, b)
16 #define prl(a, b) printf("%lld%c", a, b)
17 #define PQ priority_queue
18 #define ld long double
19 #define all(v) v.begin(), v.end()
20 #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
21 
22 typedef pair<int, int> pii;
23 typedef vector<int> V;
24 
25 struct node {
26     int l, r, val, add;
27 } tr[800010];
28 int a[200010], ans[200010];
29 
30 void build(int x, int l, int r) {
31     tr[x].l = l, tr[x].r = r;
32     if (l == r) {
33         tr[x].add = 0;
34         tr[x].val = a[l];
35         return;
36     }
37     int mid = l + r >> 1;
38     build(x << 1, l, mid), build(x << 1 | 1, mid + 1, r);
39 }
40 
41 void update(int x, int q, int val) {
42     if (tr[x].l == q && tr[x].r == q) {
43         tr[x].val = val, tr[x].add = 0;
44         return;
45     }
46     int mid = tr[x].l + tr[x].r >> 1;
47     tr[x << 1].add = max(tr[x << 1].add, tr[x].add);
48     tr[x << 1 | 1].add = max(tr[x << 1 | 1].add, tr[x].add);
49     tr[x].add = 0;
50     if (q <= mid)update(x << 1, q, val);
51     else update(x << 1 | 1, q, val);
52 }
53 
54 void query(int x) {
55     if (tr[x].l == tr[x].r) {
56         ans[tr[x].l] = max(tr[x].val, tr[x].add);
57         return;
58     }
59     tr[x << 1].add = max(tr[x << 1].add, tr[x].add);
60     tr[x << 1 | 1].add = max(tr[x << 1 | 1].add, tr[x].add);
61     query(x << 1), query(x << 1 | 1);
62 }
63 
64 int main() {
65     int n;
66     sc(n);
67     up(i, 1, n)sc(a[i]);
68     build(1, 1, n);
69     int q;
70     sc(q);
71     up(i, 1, q) {
72         int x, y, z;
73         sc(x);
74         if (x == 1) {
75             sc(y), sc(z);
76             update(1, y, z);
77         } else sc(y), tr[1].add = max(tr[1].add, y);
78     }
79     query(1);
80     up(i, 1, n)pr(ans[i], ' ');
81 }
Code via. lzh12139

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/11273719.html