英语场,手速场。
题目链接: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 }
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 }
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 }
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 }