UFBA Practice Session for Brazilian ICPC Regionals 2018
差两题AK。
题目链接:https://codeforces.com/gym/101962
B:
solver:czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const int maxn = 2e3 + 10; 15 char a[maxn], b[maxn]; 16 int len1, len2, ans = 0; 17 18 int main() { 19 scanf("%s%s", a, b); 20 len1 = strlen(a), len2 = strlen(b); 21 set<char>zero, one; 22 zero.clear(), one.clear(); 23 for (int i = 0; i <= len1 - len2; i++) { 24 zero.clear(), one.clear(); 25 for (int j = 0; j < len2; j++) 26 if (b[j] == '1') one.insert(a[i + j]); 27 else zero.insert(a[i + j]); 28 if ((int)zero.size() > 1 || (int)one.size() > 1) { 29 zero.clear(), one.clear(); 30 for (int j = 0; j < len2; j++) 31 if (b[j] == '1') one.insert(a[len2 + i - 1 - j]); 32 else zero.insert(a[len2 + i - 1 - j]); 33 if ((int)zero.size() > 1 || (int)one.size() > 1) continue; 34 else ans++; 35 } else { 36 ans++; 37 } 38 } 39 printf("%d\n", ans); 40 return 0; 41 }
C:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 ll mod = 1e9 + 7; 9 ll qp(ll base, ll b) { 10 ll res = 1; 11 while (b) { 12 if (b & 1) 13 res = res * base % mod; 14 base = base * base % mod; 15 b >>= 1; 16 } 17 return res; 18 } 19 20 int main() { 21 int t; 22 cin >> t; 23 while (t--) { 24 ll n; 25 cin >> n; 26 ll ans = ((n - 3) % mod * qp(2, n) % mod + (3 + n) % mod) % mod; 27 cout << ans << "\n"; 28 } 29 }
D:
solver:lzh、czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const int maxn = 2e3 + 10, maxm = 5e4 + 10; 15 int n, m, tot = 1, head[maxn], vis[maxn], cnt[maxn][maxn]; 16 vector<pair<int, int>>e, ans; 17 struct Edge { 18 int to, next; 19 } edge[maxm]; 20 21 void add(int from, int to) { 22 edge[++tot].to = to; 23 edge[tot].next = head[from]; 24 head[from] = tot; 25 } 26 27 bool bfs(int s, int t) { 28 for (int i = 0; i < maxn; i++) vis[i] = 0; 29 vis[s] = 1; 30 queue<int>q; 31 while (!q.empty()) q.pop(); 32 q.push(s); 33 while (!q.empty()) { 34 int curr = q.front(); 35 q.pop(); 36 for (int i = head[curr]; i; i = edge[i].next) { 37 int to = edge[i].to; 38 if ((curr == s && to == t) || vis[to]) continue; 39 q.push(to); vis[to] = 1; 40 if (to == t) return false; 41 } 42 } 43 return vis[t] ? false : true; 44 } 45 46 int main() { 47 scanf("%d%d", &n, &m); 48 for (int i = 1; i <= m; i++) { 49 int x, y; scanf("%d%d", &x, &y); 50 add(x, y); e.pb(mp(x, y)); cnt[x][y]++; 51 } 52 for (auto i : e) { 53 if (cnt[i.first][i.second] > 1) continue; 54 if (bfs(i.first, i.second)) ans.pb(i); 55 } 56 printf("%d\n", (int)ans.size()); 57 for (auto i : ans) printf("%d %d\n", i.first, i.second); 58 return 0; 59 }
E:
solver:czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 vector<int>a; 15 16 int main() { 17 int x; 18 while (~scanf("%1d", &x)) a.pb(x); 19 if ((int)a.size() == 1) return puts("YES"), 0; 20 int firstOne = a[0], back = 0; 21 for (int i = 1; i < (int)a.size(); i++) back ^= a[i]; 22 if (firstOne == back) puts("YES"); else puts("NO"); 23 return 0; 24 }
F:
solver:czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const int maxn = 1e5 + 10; 15 int n, minSize, maxSize, a[maxn]; 16 ll f[maxn]; 17 18 void init() { 19 for (int i = 0; i < maxn; i++) f[i] = 0; 20 } 21 22 void maintain(int l, int r) { 23 if (l > r) return; 24 f[l]++, f[r + 1]--; 25 } 26 27 bool check(int x) { 28 init(); 29 f[1] = 1, f[2] = -1; 30 queue<int>q; 31 while (!q.empty()) q.pop(); 32 for (int i = 1; i <= n; i++) if (a[i] >= x) q.push(i); 33 for (int i = 1; i <= n; i++) { 34 f[i] += f[i - 1]; 35 while (!q.empty() && i > q.front()) q.pop(); 36 if (!f[i] || q.empty()) continue; 37 if (i + maxSize - 1 < (int)q.front()) continue; 38 maintain(max((int)q.front(), i + minSize - 1) + 1, min(n + 1, i + maxSize - 1 + 1)); 39 } 40 f[n + 1] += f[n]; 41 return f[n + 1] > 0; 42 } 43 44 int main() { 45 scanf("%d%d%d", &n, &minSize, &maxSize); 46 for (int i = 1; i <= n; i++) scanf("%d", &a[i]); 47 int l = 0, r = INT_MAX, ans = 0; 48 while (l <= r) { 49 int mid = l + r >> 1; 50 if (check(mid)) { 51 ans = mid; 52 l = mid + 1; 53 } else r = mid - 1; 54 } 55 printf("%d\n", ans); 56 return 0; 57 }
G:
solver:czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const int maxn = 1e5 + 10; 15 const double pi = acos(-1); 16 struct Ship { 17 int visiable; 18 double beta; 19 ll x, y; 20 } a[maxn]; 21 int n; 22 double x, alpha, t, ans[maxn]; 23 ll d; 24 25 void fix(double &x) { 26 if (x < 0) x += 360; 27 if (x >= 360) x -= 360; 28 } 29 30 int main() { 31 scanf("%d%lf", &n, &x); 32 scanf("%lf%lf%lld", &alpha, &t, &d); 33 for (int i = 1; i <= n; i++) { 34 scanf("%lld%lld", &a[i].x, &a[i].y); 35 a[i].visiable = a[i].x * a[i].x + a[i].y * a[i].y <= d * d; 36 a[i].beta = atan2(a[i].y, a[i].x) / pi * 180; 37 fix(a[i].beta); a[i].beta += alpha / 2; fix(a[i].beta); 38 } 39 ll round = (ll)floor(x / t); 40 double timePerRound = alpha / 360 * t, remainTime = x - round * t; 41 for (int i = 1; i <= n; i++) { 42 ans[i] = round * timePerRound; 43 if (a[i].beta < alpha && round) ans[i] -= (alpha - a[i].beta) / alpha * timePerRound; 44 } 45 double minAlpha = remainTime / t * 360, maxAlpha = minAlpha + alpha; 46 for (int i = 1; i <= n; i++) { 47 if (a[i].beta < minAlpha) { 48 ans[i] += timePerRound; 49 if (a[i].beta < alpha && !round) ans[i] -= (alpha - a[i].beta) / alpha * timePerRound; 50 } else if (a[i].beta < maxAlpha) { 51 if (!round) ans[i] += (maxAlpha - alpha) / alpha * timePerRound; 52 else ans[i] += (maxAlpha - a[i].beta) / alpha * timePerRound; 53 } 54 // 如果转过去还大于360 55 if (maxAlpha > 360) { 56 double remainMaxAlpha = maxAlpha - 360; 57 if (a[i].beta < remainMaxAlpha) ans[i] += (remainMaxAlpha - a[i].beta) / alpha * timePerRound; 58 } 59 } 60 for (int i = 1; i <= n; i++) { 61 if (!a[i].visiable) ans[i] = 0; 62 printf("%.11f\n", ans[i]); 63 } 64 return 0; 65 }
H:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 int main() { 9 int t; 10 cin >> t; 11 while (t--) { 12 ll n; 13 cin >> n; 14 ll ans = 0; 15 for (ll base = 2, j = 1, p = 1; base <= n; base <<= 1, j++, p <<= 1) { 16 ans += n / base * j * p; 17 } 18 cout << ans << "\n"; 19 } 20 }
I:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 int val[100010 << 2], pre[100010]; 9 void upd(int x, int curl, int curr, int l, int v) { 10 if (l == curl && curr == curl) { 11 val[x] = v; 12 return; 13 } 14 15 int mid = curl + curr >> 1; 16 if (l <= mid) 17 upd(x << 1, curl, mid, l, v); 18 else 19 upd(x << 1 | 1, mid + 1, curr, l, v); 20 21 val[x] = max(val[x << 1], val[x << 1 | 1]); 22 } 23 int que(int x, int curl, int curr, int l, int r) { 24 if (l <= curl && curr <= r) { 25 //printf("que %d %d %d\n", curl, curr, val[x]); 26 return val[x]; 27 } 28 29 int mid = curl + curr >> 1; 30 if (r <= mid) 31 return que(x << 1, curl, mid, l, r); 32 else if (l > mid) 33 return que(x << 1 | 1, mid + 1, curr, l, r); 34 else 35 return max(que(x << 1, curl, mid, l, mid), 36 que(x << 1 | 1, mid + 1, curr, mid + 1, r)); 37 } 38 39 int main() { 40 int n, q; 41 scanf("%d%d", &n, &q); 42 for (int i = 1; i <= n; i++) 43 scanf("%d", &pre[i]); 44 for (int i = 1; i < n; i++) 45 upd(1, 1, n - 1, i, abs(pre[i] - pre[i + 1])); 46 while (q--) { 47 int x, y, z; 48 scanf("%d%d%d", &x, &y, &z); 49 if (x == 1) { 50 pre[y] = z; 51 if (y != 1) 52 upd(1, 1, n - 1, y - 1, abs(pre[y - 1] - pre[y])); 53 if (y != n) 54 upd(1, 1, n - 1, y, abs(pre[y] - pre[y + 1])); 55 } else { 56 int ans = 1; 57 if (y != 1) { 58 int l = 1, r = y - 1, tmp = y; 59 while (l <= r) { 60 int mid = l + r >> 1; 61 if (que(1, 1, n - 1, mid, y - 1) <= z) 62 r = mid - 1, tmp = min(tmp, mid); 63 else 64 l = mid + 1; 65 } 66 ans += y - tmp; 67 } 68 if (y != n) { 69 int l = y, r = n - 1, tmp = y - 1; 70 while (l <= r) { 71 int mid = l + r >> 1; 72 if (que(1, 1, n - 1, y, mid) <= z) 73 l = mid + 1, tmp = max(tmp, mid); 74 else 75 r = mid - 1; 76 } 77 ans += tmp - y + 1; 78 } 79 printf("%d\n", ans); 80 } 81 } 82 }
J:
solver:czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const int maxn = 1e5 + 10; 15 struct Street { 16 int l, r; 17 } str[maxn]; 18 int n, k, ans[maxn]; 19 vector<int>boss[maxn]; 20 21 /* 树上启发式合并 (CF 741D)----------------------------------------------------------- */ 22 // 以下内容全抄 23 int fa[maxn], _size[maxn], remain; 24 25 void init() { 26 for (int i = 0; i < maxn; i++) _size[i] = 1, fa[i] = i; 27 } 28 29 int findFa(int x) { 30 return x == fa[x] ? x : (fa[x] = findFa(fa[x])); 31 } 32 33 void cleanInfo(int x) { 34 fa[str[x].l] = str[x].l, fa[str[x].r] = str[x].r; 35 for (int i : boss[x]) cleanInfo(i); 36 } 37 38 void merge(int x, int y) { 39 int fx = findFa(x), fy = findFa(y); 40 if (fx != fy) fa[fx] = fy, remain--; 41 } 42 43 void solve(int x) { 44 merge(str[x].l, str[x].r); 45 for (auto i : boss[x]) solve(i); 46 } 47 48 void dfs(int x) { 49 int heavySon = -1; 50 // 从最小的size开始处理 51 for (auto i : boss[x]) if (_size[heavySon] < _size[i] || heavySon == -1) heavySon = i; 52 for (auto i : boss[x]) { 53 if (i == heavySon) continue; 54 remain = k; 55 dfs(i), cleanInfo(i); // dfs后不要忘记清除信息! 56 } 57 remain = k; 58 if (heavySon != -1) dfs(heavySon); 59 for (auto i : boss[x]) if (i != heavySon) solve(i); 60 merge(str[x].l, str[x].r); 61 ans[x] = remain; 62 } 63 64 /* ----------------------------------------------------------------------------------- */ 65 66 int main() { 67 init(); 68 scanf("%d%d", &n, &k); 69 for (int i = 2; i <= n; i++) { 70 int x; scanf("%d", &x); 71 boss[x].pb(i); 72 } 73 for (int i = 1; i <= n; i++) scanf("%d%d", &str[i].l, &str[i].r); 74 for (int i = n; i >= 1; i--) { 75 for (auto j : boss[i]) _size[i] += _size[j]; 76 } 77 dfs(1); 78 for (int i = 1; i <= n; i++) printf("%d\n", ans[i]); 79 return 0; 80 }
K:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 int a[100010]; 9 int main() { 10 int n; 11 scanf("%d", &n); 12 for (int i = 1; i <= n; i++) { 13 scanf("%d", &a[i]); 14 a[i] += a[i - 1]; 15 } 16 for (int i = 1; i <= n; i++) { 17 int ans = 0, j = i - 1, add = 3; 18 while (j <= n) { 19 int r = j + add; 20 if (r > n) 21 r = n; 22 ans += max(0, a[r] - a[j]); 23 j += add; 24 add += 3; 25 } 26 printf("%d\n", ans); 27 } 28 }
M:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 vector<pii> v[15]; 9 int main() 10 { 11 int n; 12 scanf("%d", &n); 13 int add = 64, j = 1; 14 if (add > n) { 15 printf("1\n1\n1 %d\n", n); 16 return 0; 17 } 18 while (add <= n) { 19 int cur = 1; 20 while (1) { 21 v[j].push_back({ cur, min(n, cur - 1 + add) }); 22 cur += add; 23 if (cur > n) 24 break; 25 } 26 add = add * 4; 27 j++; 28 } 29 v[j].push_back({ 1, n }); 30 printf("%d\n", j); 31 for (int i = 1; i <= j; i++) { 32 printf("%d\n", v[i].size()); 33 for (auto p : v[i]) 34 printf("%d %d\n", p.ff, p.ss); 35 } 36 }