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