A.
Example
Input
9
1 3 3 6 7 6 8 8 9
Output
4
1 #include <iostream> 2 3 using namespace std; 4 5 int main () { 6 int n; 7 cin >> n; 8 int a[10010]; 9 for(int i = 0;i < n;i++){ 10 cin >> a[i]; 11 } 12 int day = 0; 13 int t = 0; 14 for(int i = 1;i <= n;i++){ 15 t = max(a[i - 1],t); 16 if(i == t) 17 day++; 18 } 19 cout << day << endl; 20 return 0; 21 }
B
Example
Input
3
2
<>
3
><<
1
>
Output
1
0
0
1 // 本题问的是先删除后再按照上述判断 进而看是否能构成 2 #include <bits/stdc++.h> 3 4 using namespace std; 5 6 int main(){ 7 ios_base::sync_with_stdio(0); 8 cin.tie(0); 9 cout.tie(0); 10 int t; 11 cin >> t; 12 while (t--) { 13 int n; 14 cin >> n; 15 string s; 16 cin >> s; 17 int l = 0; 18 int r = n - 1; 19 while(l < n && s[l] == '<') 20 l++; 21 cout << "l :" << l << endl; 22 while(r >= 0 && s[r] == '>') 23 r--; 24 cout << "r " << r << endl; 25 cout << min(l, n - r - 1) << endl; 26 // 从左边开始‘<’的连续个数与从右边开始‘>’的连续个数 两者的最小值即为答案 27 // 因为除去这个边界之后的下一个数一定与它相反 通过它就可以实现转化 28 } 29 }
C
Examples
Input
4 3
4 7
15 1
3 6
6 8
Output
78
Input
5 3
12 31
112 4
100 100
13 55
55 50
Output
10000
#include<bits/stdc++.h> using namespace std; const int N = 3e5+1; long long n, k, x, y, s, A; pair<int,int>p[N]; priority_queue<int>q; // 优先队列就是大顶堆,队头元素最大 int main(){ cin >> n >> k; for (int i = 1; i <= n; i++) { // 从第一个开始进行存入 cin >> x >> y; p[i] = make_pair(y, x); } sort(p + 1, p + n + 1); // pair 默认对first升序,当first相同时对second升序(就是对beauty values进行排序) for(int i = n; i >= 1; i--) { s += p[i].second; // 将 lengths 从大到小相加 q.push(-p[i].second); // 将length的相反数放入队列中 if (q.size() > k) { // 当压入的数目超过最大个数时 s += q.top(); // s加上最上面压入的元素(正值最小的) q.pop(); // 弹出最上面的 } A = max(A, p[i].first * s); // p[i].first一定是该状态下的最大值 } cout << A << endl; return 0; }
D
// 一个多变形最多能被分成 n - 2个不重合的三角形 #include <bits/stdc++.h> using namespace std; int main () { int n; cin >> n; int sum = 0; for (int i = 2;i < n; i++) { sum += i * (i + 1); } cout << sum << endl; }
待补!!!
E
#include <bits/stdc++.h> using namespace std; #define MOD 998244353 int n, k, x[2], at; long long dp[2][2]; int ta; int main() { scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { at = i & 1; scanf("%d", &ta); if (ta == -1) { if (x[at] == 0) { x[at] = 1; dp[at][0] = dp[at][1] = 1; } else { long long tmp = dp[at][0]; dp[at][0] = (dp[at][0] * (k - 2) + dp[at][1]) % MOD; dp[at][1] = tmp * (k - 1) % MOD; } } else { if (x[at] == 0) dp[at][1] = 1; else if (ta == x[at]) dp[at][1] = dp[at][0] * (k - 1) % MOD; else dp[at][1] = (dp[at][0] * (k - 2) + dp[at][1]) % MOD; dp[at][0] = 0; x[at] = ta; } } for (int i = 0; i < 2; i++) dp[i][0] = (dp[i][0] * (k - 1) + dp[i][1]) % MOD; printf("%lld ", dp[0][0] * dp[1][0] % MOD); }
F
#include <bits/stdc++.h> using namespace std; #define ll long long #define f(i, x, n) for (int i = x; i < (int)(n); ++i) int const N = 300000; int q; vector<pair<int, int> > s[N << 2]; map<pair<int, int>, int> edtm; vector<pair<int, int> > p; ll an[N + 1]; void adsg(pair<int, int> e, int x, int y, int l = 1, int r = q, int id = 1){ if (l > y || r < x)return; if (l >= x && r <= y) { s[id].push_back(e); return; } int m = l + r >> 1, a = id << 1, b = a | 1; adsg(e, x, y, l, m, a); adsg(e, x, y, m + 1, r, b); } int pa[N << 1 | 1]; pair<int, int> sz[N << 1 | 1]; stack<pair<int, int> > st; ll can; int P(int p) { while (pa[p])p = pa[p]; return p; } void adan(pair<int, int> p) { can += (ll)p.first * p.second; } void sban(pair<int, int> p) { can -= (ll)p.first * p.second; } void fn(int l = 1, int r = q, int id = 1){ int undc = 0; for (auto &t: s[id]){ int a = P(t.first), b = P(t.second); if (a == b)continue; if (sz[a].first + sz[a].second < sz[b].first + sz[b].second)swap(a, b); pa[b] = a; sban(sz[a]); sban(sz[b]); sz[a].first += sz[b].first; sz[a].second += sz[b].second; adan(sz[a]); st.push(make_pair(a, b)); ++undc; } if (l == r)an[l] += can; else { int m = l + r >> 1, a = id << 1, b = a | 1; fn(l, m, a); fn(m + 1, r, b); } while (undc--){ int a = st.top().first, b = st.top().second; st.pop(); sban(sz[a]); sz[a].first -= sz[b].first; sz[a].second -= sz[b].second; adan(sz[a]); adan(sz[b]); pa[b] = 0; } }
G
#include <bits/stdc++.h> using namespace std; #define ll long long #define f(i, x, n) for (int i = x; i < (int)(n); ++i) ll const inf = 1e18; int const N = 300000, B = 19; ll wsd[N + 1], w[N + 1][B][2][2]; int pa[N + 1][B], dp[N + 1]; struct E{ int u; ll w[2]; E(int a, ll b, ll c):u(a) { w[0] = b, w[1] = c; } }; vector<E> tr[N + 1]; struct D{ ll w[2]; D(int v) { w[0] = w[1] = 0; w[v & 1] = inf; } void operator +=(ll c[][2]){ ll nw0 = min(w[0] + c[0][0], w[1] + c[1][0]); w[1] = min(w[0] + c[0][1], w[1] + c[1][1]); w[0] = nw0; } }; void J(ll a[][2], ll b[][2], ll c[][2]){ f(i, 0, 2)f(j, 0, 2)c[i][j] = inf; f(i, 0, 2)f(j, 0, 2)f(k, 0, 2)c[i][j] = min(c[i][j], a[i][k] + b[k][j]); } void pl1(int v = 1, int p = 0){ for (E &t: tr[v])if (t.u != p)pl1(t.u, v); for (E &t: tr[v])if (t.u != p)wsd[v] = min(wsd[v], wsd[t.u] + t.w[0] + t.w[1]); } void pl2(int v = 1, int p = 0) { for (E &t: tr[v])if (t.u != p)wsd[t.u] = min(wsd[t.u], wsd[v] + t.w[0] + t.w[1]), pl2(t.u, v); } void pl3(int v = 1, int p = 0){ pa[v][0] = p; dp[v] = dp[p] + 1; int k = 1, z; while (k < B && (z = pa[v][k - 1])){ pa[v][k] = pa[z][k - 1]; J(w[v][k - 1], w[z][k - 1], w[v][k]); ++k; } for (E &t: tr[v]){ if (t.u == p)continue; w[t.u][0][0][0] = min(t.w[0], t.w[1] + wsd[v] + wsd[t.u]); w[t.u][0][0][1] = min(t.w[0] + wsd[v], wsd[t.u] + t.w[1]); w[t.u][0][1][0] = min(t.w[1] + wsd[v], wsd[t.u] + t.w[0]); w[t.u][0][1][1] = min(t.w[1], t.w[0] + wsd[v] + wsd[t.u]); pl3(t.u, v); } } ll wan[2][2]; ll go(int a, int b){ D ca(a), cb(b); a = a + 1 >> 1, b = b + 1 >> 1; if (dp[a] < dp[b])swap(a, b), swap(cb, ca); int d = dp[a] - dp[b], j = 0; while (d){ if (d & 1)ca += w[a][j], a = pa[a][j]; ++j; d >>= 1; } if (a != b){ for (int i = B - 1; i >= 0; --i)if (pa[a][i] != pa[b][i])ca += w[a][i], cb += w[b][i], a = pa[a][i], b = pa[b][i]; ca += w[a][0], cb += w[b][0]; a = pa[a][0]; } ll an = inf; f(i, 0, 2)f(j, 0, 2)an = min(an, ca.w[i] + cb.w[j] + (i != j ? wsd[a] : 0)); return an; } int main(){ int n; scanf("%d", &n); f(i, 1, n + 1)scanf("%lld", wsd + i); f(i, 1, n){ int a, b; ll w1, w2; scanf("%d%d%lld%lld", &a, &b, &w1, &w2); tr[a].push_back(E(b, w1, w2)); tr[b].push_back(E(a, w1, w2)); } pl1(); pl2(); pl3(); int q; scanf("%d", &q); while (q--){ int a, b; scanf("%d%d", &a, &b); printf("%lld ", go(a, b)); } }