Codeforces Round #515 (Div. 3)
### Codeforces Round #515 (Div. 3) ###
Problem: http://codeforces.com/contest/1066
Tutorial: http://codeforces.com/blog/entry/62419
A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <cstdio> #include <vector> using namespace std; int main() { int tc; scanf("%d", &tc); while(tc--) { int L, v, l, r; scanf("%d%d%d%d", &L, &v, &l, &r); int ans = L/v; ans -= r/v; ans += (l-1)/v; printf("%d\n", ans); } return 0; } | cs |
>> 문제를 이해하기가 어려웠지만, 테케의 힌트를 통해 이해할 수 있었다.
>> lanterns 이 뭔진 모르겠지만, v 간격으로 있는데, 구간 [L, R] 에 있는 것은 제외해야한다.
>> (전체 갯수) - (R을 포함하는 구간까지의 갯수) + (L-1 을 포함하는 구간까지의 갯수) 가 정답이 된다.
B.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <cstdio> int h[1001]; int main() { int n, r; scanf("%d%d", &n, &r); int ans=0; for(int i=0; i<n; i++) scanf("%d", h+i); // [pos-r+1, pos+r-1] int cur = n-r; while(n > 0) { bool turn=0; for(int i=cur; i<n; i++) { if(i >= 0 && h[i]) { cur = i-r-r+1; n = i; ans++; turn = 1; break; } } if(!turn) { ans=-1; break; } if(cur+r <= 0) break; } printf("%d\n", ans); return 0; } | cs |
>> 대회 시간중에는 풀지 못한 문제.
>> 히터를 pos 위치에서 키면 히터가 켜지는 범위는 [pos-r+1, pos+r-1] 이 된다.
>> 여기서 14라인 이후 n은 n번째부터는 확실하게 히터가 켜진 상태라고 정의하였다.
>> 그렇다면 n-1번째까지 켜지게 하기 위해서는 n-r 번째 부터 확인을 해야한다. (15번 라인)
>> 다음으로 i번째 히터를 켰다고 가정하면, i번째 이후로는 모두 히터가 켜져있다고 생각하면 된다. n = i;
>> 현재 i-r+1 번째까지도 히터는 켜져 있는 상태. i-r+1 을 n'이라고 생각하면 n'-r번째. 즉, i-r-r+1 번째에 히터가 있으면 베스트다.
>> 하지만, [i-r-r+1, i-r+1) 구간까지 히터가 없다면, [i-r+1, i) 까지의 히터를 켜서라도 [i-r-r+1, i-r+1) 구간에 히터의 영향을 받게 해야한다.
>> 맨 우측부터, cur+r 까지는 히터의 영향을 받은 구간이므로, 이 값이 0이면 모두 히터의 영향을 받는 상태.
C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <cstdio> #include <vector> #include <map> using namespace std; int deq[500000]; int Min(int a, int b) { return a < b ? a : b; } int main() { int tc; scanf("%d", &tc); char cmd; int id, L, R; L = R = 250000; map<int, int> mii; while(tc--) { scanf(" %c%d", &cmd, &id); if(cmd == 'L') { deq[L] = id; mii[id] = L--; } else if(cmd == 'R') { deq[++R] = id; mii[id] = R; } else { // '?' int idx = mii[id]; int ans = idx-L-1; ans = Min(ans, R-idx); printf("%d\n", ans); } } return 0; } | cs |
>> 덱과 맵을 이용하여 해결했다. 간이덱을 만들긴 했지만, 실질적으로 덱을 위한 배열은 없어도 됐다.
>> 6, 27, 31 라인 삭제 후 32라인을 mii[id] = ++R; 로 수정해도 된다.
D.
E.
F.
'PS > Code Force' 카테고리의 다른 글
Codeforces Round #506 (Div. 3) // rated (0) | 2018.08.30 |
---|---|
Codeforces Round #496 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #498 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #501 (Div. 3) // Rated (0) | 2018.08.02 |
Codeforces Round #506 (Div. 3) // rated
### Codeforces Round #506 (Div. 3) ###
Problems : http://codeforces.com/contest/1029
Tutorial : http://codeforces.com/blog/entry/61439
A. Many Equal Substrings
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> int main() { int n, k; int cnt=0, idx=0; char *s, t[55]; scanf("%d%d%s", &n, &k, t); printf("%s", t); s = t+n-1; for(int i=0; i<n-1; i++) { int ok=1; for(int j=0; s[j]; j++) if(s[j] != t[j]) ok = 0; cnt++; s--; if(ok) idx = cnt; } for(int i=1; i<k; i++) printf("%s", t+idx); puts(""); return 0; } | cs |
>> input 으로 4 4 abab 를 넣으면 output 으로 ababababab 가 나와야 한다.
>> 함정이 있는 문제.
>> 최대로 서브스트링을 만들 수 있는 길이를 구한다음, 처음 문자열을 출력하고, 나머지 서브스트링만 k-1번 출력하였다.
B. Creating the Contest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <stdio.h> int a[200005]; int main() { int n; int s=0, e=1; int ans=0; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", a+i); int tmp=1; for(int i=0; i<n-1; i++) { if(a[i]*2 >= a[i+1]) tmp++; else { if(ans < tmp) ans = tmp; tmp = 1; } } if(ans < tmp) ans = tmp; printf("%d\n", ans); return 0; } | cs |
>> 조건을 만족하는 배열의 최대 길이? 를 찾는 문제.
>> a[i]*2 >= a[i+1] 가 조건인데, 문제를 a[s]*2 >= a[e] 로 잘못 이해해서 한번 틀렸다..(내 점수..ㅜ)
C. Maximal Intersection (Ref)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <cstdio> const int N = 300005; int L[N], R[N]; int preL[N], sufL[N]; int preR[N], sufR[N];; int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a < b ? a : b; } int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d%d", L+i, R+i); preL[0] = sufL[n] = 0; preR[0] = sufR[n] = 1e9; for(int i=0; i<n; i++) { preL[i+1] = Max(preL[i], L[i]); preR[i+1] = Min(preR[i], R[i]); sufL[n-1-i] = Max(sufL[n-i], L[n-1-i]); sufR[n-1-i] = Min(sufR[n-i], R[n-1-i]); } int ans=0; for(int i=0; i<n; i++) ans = Max(ans, Min(preR[i], sufR[i+1])-Max(preL[i], sufL[i+1])); printf("%d\n", ans); return 0; } | cs |
>> 많이 틀려서 해설보고 제출했다..
>> pSum 처럼 prefixL과 suffixL, prefixR, 과 suffixR 을 만든 다음 minR - MaxL 이 정답이 된다.
>> 아래는 해설.
Intersection of some segments is . If this segment has its left bound greater than its right bound then the intersection is empty.
Removing some segment makes the original sequence equal to . That can be split up to a prefix of length and a suffix of length . Intersections for them can be precalced separately and stored in some partial sum-like arrays. Finally, you have to iterate over the position of the removed segment and calculate the intersection of prefix and suffix without this segment.
Overall complexity: .
- 세그트리로도 될 것 같다. (된다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <stdio.h> int n, ans; int segL[1<<20]; int segR[1<<20]; int sIdx = 1<<19; int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a < b ? a : b; } int maxL(int L, int R, int nodeN, int nodeL, int nodeR) { int a, b; int mid = (nodeL+nodeR)/2; if(R < nodeL || nodeR < L) return 0; if(L <= nodeL && nodeR <= R) return segL[nodeN]; a = maxL(L, R, nodeN*2, nodeL, mid); b = maxL(L, R, nodeN*2+1, mid+1, nodeR); return Max(a, b); } int minR(int L, int R, int nodeN, int nodeL, int nodeR) { int a, b; int mid = (nodeL+nodeR)/2; if(R < nodeL || nodeR < L) return 1e9; if(L <= nodeL && nodeR <= R) return segR[nodeN]; a = minR(L, R, nodeN*2, nodeL, mid); b = minR(L, R, nodeN*2+1, mid+1, nodeR); return Min(a, b); } int main() { int s, e; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d%d", segL+sIdx+i, segR+i+sIdx); s = sIdx>>1; e = sIdx; while(s) { for(int i=s; i<e; i++) { segL[i] = Max(segL[i<<1], segL[(i<<1)+1]); segR[i] = Min(segR[i<<1], segR[(i<<1)+1]); } e = s; s = e>>1; } for(int i=0; i<n; i++) { int mL = Max(maxL(0, i-1, 1, 0, sIdx-1), maxL(i+1, n-1, 1, 0, sIdx-1)); int mR = Min(minR(0, i-1, 1, 0, sIdx-1), minR(i+1, n-1, 1, 0, sIdx-1)); ans = Max(ans, mR-mL); } printf("%d\n", ans); return 0; } | cs |
D.
E.
F.
'PS > Code Force' 카테고리의 다른 글
Codeforces Round #515 (Div. 3) (0) | 2018.10.16 |
---|---|
Codeforces Round #496 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #498 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #501 (Div. 3) // Rated (0) | 2018.08.02 |
Codeforces Round #496 (Div. 3)
Codeforces Round #496 (Div. 3) : http://codeforces.com/contest/1005
A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> int a[1002]; int cnt[1002]; int main() { int n, ans=0; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", a+i); a[n] = 1; int tmp=1; for(int i=1; i<=n; i++){ if(a[i] == 1) { cnt[ans++] = tmp; tmp = 1; } else tmp++; } printf("%d\n", ans); for(int i=0; i<ans; i++) printf("%d ", cnt[i]); puts(""); return 0; } | cs |
>> 1의 갯수 세기.
B.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #include <string.h> int main() { int sIdx, tIdx; char s[200005], t[200005]; scanf("%s%s", s, t); sIdx = strlen(s); tIdx = strlen(t); sIdx--; tIdx--; while(sIdx >= 0 && tIdx >= 0) { if(s[sIdx] == t[tIdx]) { sIdx--; tIdx--; } else break; } printf("%d\n", sIdx+tIdx+2); return 0; } | cs |
>> 뒤에서부터 비교해나가기.
C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <cstdio> #include <algorithm> using namespace std; int a[120001]; bool check[120001]; int b[35]; int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", a+i); sort(a, a+n); for(int i=0; i<31; i++) b[i] = 1<<i; int ans=0; for(int i=0; i<n; i++) { for(int k=0; k<31; k++) { if(b[k] > a[i]) { auto it = lower_bound(a, a+n, b[k]-a[i]); if(*it == b[k]-a[i] && it-a != i) check[i] = check[it-a] = 1; } } } for(int i=0; i<n; i++) if(!check[i]) ans++; printf("%d\n", ans); return 0; } | cs |
>> lower_bound를 이용한 이진탐색
D.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <stdio.h> int d[200005]; int max(int a, int b) { return a > b ? a : b; } int go(char *s, int idx) { int sum=0; int *ret = &d[idx]; if(*ret != -1) return *ret; *ret = 0; for(int i=idx; s[i]; i++) { sum += (s[i]-'0'); if(sum % 3 == 0) { *ret = max(*ret, go(s, i+1)+1); break; } *ret = max(*ret, go(s, i+1)); } return *ret; } int main() { char s[200005]; scanf("%s", s); for(int i=0; s[i]; i++) d[i] = -1; printf("%d\n", go(s, 0)); return 0; } | cs |
>> DP
E1.
E2.
F.
'PS > Code Force' 카테고리의 다른 글
Codeforces Round #515 (Div. 3) (0) | 2018.10.16 |
---|---|
Codeforces Round #506 (Div. 3) // rated (0) | 2018.08.30 |
Codeforces Round #498 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #501 (Div. 3) // Rated (0) | 2018.08.02 |
Codeforces Round #498 (Div. 3)
Codeforces Round #498 (Div. 3) : http://codeforces.com/contest/1006
A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main() { int n, k; scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%d", &k); if(k%2 == 0) k--; printf("%d ", k); } puts(""); return 0; } | cs |
B.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct P { int i, d; }; bool cmp(P a, P b) { return a.d > b.d; } int main() { int n, k; scanf("%d%d", &n, &k); vector<P> v; for(int i=0; i<n; i++) { int a; scanf("%d", &a); v.push_back((P){i, a}); } sort(v.begin(), v.end(), cmp); int sum=0; vector<int> ans; for(int i=0; i<k; i++) { sum += v[i].d; ans.push_back(v[i].i); } sort(ans.begin(), ans.end()); ans[ans.size()-1] = n-1; printf("%d\n", sum); printf("%d ", ans[0]+1); for(int i=1; i<ans.size(); i++) printf("%d ", ans[i]-ans[i-1]); puts(""); return 0; } | cs |
C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <cstdio> typedef long long int lli; int a[200005]; int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", a+i); int s=0, e=n-1; lli sSum=a[s], eSum=a[e]; int sIdx=-1, eIdx=-1; while(s < e) { if(sSum == eSum) { sIdx = s; eIdx = e; } if(sSum <= eSum) { sSum += a[++s]; } else eSum += a[--e]; } lli ans=0LL; if(sIdx != -1) { for(int i=0; i<=sIdx; i++) ans += a[i]; } printf("%lld\n", ans); return 0; } | cs |
>> Two Pointers
D.
E.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <cstdio> #include <vector> using namespace std; int cnt[200005]; vector<int> g[200005]; vector<int> order; int oIdx[200005]; int dfs(int s) { int ret=1; oIdx[s] = order.size(); order.push_back(s); for(int i=0; i<g[s].size(); i++) { int next = g[s][i]; cnt[next] = dfs(next); ret += cnt[next]; } return ret; } int main() { int n, q; scanf("%d%d", &n, &q); for(int i=2; i<=n; i++) { int p; scanf("%d", &p); g[p].push_back(i); } cnt[1] = dfs(1); while(q--) { int u, k; scanf("%d%d", &u, &k); if(cnt[u] < k) puts("-1"); else printf("%d\n", order[oIdx[u]+k-1]); } return 0; } | cs |
>> DFS order
F.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <cstdio> #include <cstring> #include <map> using namespace std; typedef long long int lli; int n, m, half; lli k, ans; lli g[21][21]; map<lli, int> d[21][21]; void goHalf(int r, int c, lli xr, int cnt) { xr = xr^g[r][c]; if(cnt == half) { d[r][c][xr]++; return ; } if(r+1 < n) goHalf(r+1, c, xr, cnt+1); if(c+1 < m) goHalf(r, c+1, xr, cnt+1); } void goEnd(int r, int c, lli xr, int cnt) { if(cnt == (n+m-2-half)) { ans += d[r][c][xr^k]; // a^b^b = k^b = a return ; } if(r-1 >= 0) goEnd(r-1, c, xr^g[r][c], cnt+1); if(c-1 >= 0) goEnd(r, c-1, xr^g[r][c], cnt+1); } int main() { scanf("%d%d%lld", &n, &m, &k); for(int i=0; i<n; i++) for(int j=0; j<m; j++) scanf("%lld", &g[i][j]); half = (n+m-2)/2; goHalf(0, 0, 0, 0); goEnd(n-1, m-1, 0, 0); printf("%lld\n", ans); return 0; } | cs |
>> Meet in the Middle
'PS > Code Force' 카테고리의 다른 글
Codeforces Round #515 (Div. 3) (0) | 2018.10.16 |
---|---|
Codeforces Round #506 (Div. 3) // rated (0) | 2018.08.30 |
Codeforces Round #496 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #501 (Div. 3) // Rated (0) | 2018.08.02 |
Codeforces Round #501 (Div. 3) // Rated
### Codeforces Round #501 (Div. 3) ###
### Rated : 1275 >> 1380 ###
< Solved > : 4 out of 7 ( A, B, C, E1)
A. Points in Segments
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <cstdio> int main() { int n, m; scanf("%d%d", &n, &m); int seg[101]={0}; while(n--) { int l, r; scanf("%d%d", &l, &r); for(int i=l; i<=r; i++) seg[i] = 1; } int ans=0; for(int i=1; i<=m; i++) if(!seg[i]) ans++; printf("%d\n", ans); for(int i=1; i<=m; i++) if(!seg[i]) printf("%d ", i); puts(""); return 0; } | cs |
B. Obtaining the String
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <cstdio> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); char s[55]; char t[55]; scanf("%s%s", s, t); int check[30]={0}; for(int i=0; s[i]; i++) { check[s[i]-'a']++; check[t[i]-'a']--; } for(int i=0; i<26; i++) { if(check[i]) { puts("-1"); return 0; } } vector<int> ans; for(int i=0; i<n; i++) { while(s[i] != t[i]) { for(int k=i; k<n; k++) { if(s[k] == t[i]) { char tmp = s[k-1]; s[k-1] = s[k]; s[k] = tmp; ans.push_back(k); break; } } } } int size = ans.size(); if(size > 10000) puts("-1"); else { printf("%d\n", size); for(int i=0; i<size; i++) printf("%d ", ans[i]); puts(""); } return 0; } | cs |
C. Songs Compression
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct P { int b, s; }; typedef long long int lli; bool cmp(P a, P b) { return (a.b-a.s) > (b.b-b.s); } int main() { int n, m; scanf("%d%d", &n, &m); vector<P> v; lli sum=0LL; for(int i=0; i<n; i++) { int b, s; scanf("%d%d", &b, &s); v.push_back((P){b, s}); sum += b; } sort(v.begin(), v.end(), cmp); int ans=0; for(int i=0; i<n; i++) { if(sum > m) { ans++; sum = sum - (v[i].b-v[i].s); } else break; } if(ans == n && sum > m) ans = -1; printf("%d\n", ans); return 0; } | cs |
E!. Stars Drawing (Easy Edition)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <cstdio> #include <vector> using namespace std; struct P { int r, c, n; }; int n, m; char g[1005][1005]; bool check[1005][1005]; int di[]={1, 0, -1, 0}; int dj[]={0, 1, 0, -1}; bool safe(int r, int c) { return (0 < r && r <= n) && (0 < c && c <= m); } int main() { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) scanf("%s", g[i]+1); vector<P> ans; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(g[i][j] == '*') { int size = 1; while(1) { bool ok = 1; for(int k=0; k<4; k++) { int ni = i+di[k]*size; int nj = j+dj[k]*size; if(!safe(ni, nj) || g[ni][nj] != '*') { ok = 0; break; } } if(ok) { for(int k=0; k<4; k++) { int ni = i+di[k]*size; int nj = j+dj[k]*size; check[ni][nj] = 1; } check[i][j] = 1; size++; } else { if(size > 1) { ans.push_back((P){i, j, size-1}); } break; } } } } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if((check[i][j] == 1 && g[i][j] == '.') || (check[i][j] == 0 && g[i][j] == '*')) { puts("-1"); return 0; } } } int sz = ans.size(); printf("%d\n", sz); for(int i=0; i<sz; i++) printf("%d %d %d\n", ans[i].r, ans[i].c, ans[i].n); return 0; } | cs |
>> '*' 을 찾으면 이 좌표 기준 상하좌우에 '*' 가 몇바퀴 나오는지, 이런 방식으로 구현했다.
>> 시간복잡도는 O(n^3) 정도 되는것 같다.
-------------
D 는 웬지 시간만 조금 더 있었으면 할 수 있었을 거 같았는데, 핵당한 유저들이 많았다. E1 먼저 풀길 잘한듯..
E2 에서는 E1 코드를 그대로 제출했더니, pretest 43 에서 TLE...
F 얼필 봤을때, 할만해 보였는데, 시간 없었다...ㅜㅜ
### Tutorial : http://codeforces.com/blog/entry/60949 ###
< Solution >
A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | vector<int> cnt(m + 2); for (int i = 0; i < n; ++i) { int l, r; cin >> l >> r; ++cnt[l]; --cnt[r + 1]; } for (int i = 1; i <= m; ++i) cnt[i] += cnt[i - 1]; vector<int> ans; for (int i = 1; i <= m; ++i) { if (cnt[i] == 0) ans.push_back(i); } | cs |
>> O(n+m) 풀이.
>> 쉽게 생각하면, L 번째에 1을 증가시키고, R+1 번째에 -1을 한다.
>> 그러고 난 다음 L 부터 R+1 까지의 pSum 을 구하면 [L, R] 까지는 1이되고, R+1 번째는 0이 되서 원하는 답을 구할 수 있게 된다.
B.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | vector<int> ans; for (int i = 0; i < n; ++i) { if (s[i] == t[i]) continue; int pos = -1; for (int j = i + 1; j < n; ++j) { if (s[j] == t[i]) { pos = j; break; } } if (pos == -1) { cout << -1 << endl; return 0; } for (int j = pos - 1; j >= i; --j) { swap(s[j], s[j + 1]); ans.push_back(j); } } | cs |
>> O(n^2)
>> 솔루션은 그위치를 찾은다음 i번째까지 거꾸로 스왑해나가는 풀이.
>> 반면에, 내 풀이는 한번스왑하면 다시 그곳을 찾아서 반복하는 것으로 좀 비효율적인 풀이다. (구현이 어렵지 않고, 시간이 시간인지라 이런식으로 해버렸다....ㅜㅜ)
C.
>> O(blogs) because of sort.
>> 솔루션과 풀이거 거의 비슷하다.
E1.
>> Um...
'PS > Code Force' 카테고리의 다른 글
Codeforces Round #515 (Div. 3) (0) | 2018.10.16 |
---|---|
Codeforces Round #506 (Div. 3) // rated (0) | 2018.08.30 |
Codeforces Round #496 (Div. 3) (0) | 2018.08.12 |
Codeforces Round #498 (Div. 3) (0) | 2018.08.12 |