Codeforces Round #576 (Div. 2)

匿名 (未验证) 提交于 2019-12-02 23:52:01

英语场,手速场。

题目链接: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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!