赞
踩
(代码写的很烂。。。)
#include <bits/stdc++.h> using namespace std; #define int long long using i64 = long long; typedef pair<int, int> PII; typedef pair<int, char> PIC; typedef pair<double, double> PDD; typedef pair<int, PII> PIII; typedef pair<int, pair<int, bool>> PIIB; const int N = 1e6 + 10; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int mod1 = 954169327; const int mod2 = 906097321; const int INF = 0x3f3f3f3f3f3f3f3f; void solve() { int n, m, k; cin >> n >> m >> k; int x, y; char tt, type; cin >> x >> y >> tt; if ((x + y) & 1) { if (tt == 'A') type = 'B'; else type = 'A'; } else type = tt; int minn = n + m; int maxx = n + m; if (type == 'A') maxx += ((n - 1) * (m - 1) + 1) / 2; else maxx += (n - 1) * (m - 1) / 2; if (k < minn || k > maxx) { cout << "No" << '\n'; return; } cout << "Yes\n"; vector<vector<char>> g(n + 1, vector<char>(m + 1)); if (type == 'A') { for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { if ((i + j) & 1) g[i][j] = 'B'; else g[i][j] = 'A'; } } // b换a if (tt == 'A') { for (int i = 1; i <= n; i ++ ) { int start = 2; if (i % 2 == 0) start = 3; for (int j = start; j <= m; j += 2) { if (maxx != k) { g[i][j] = 'A'; maxx -- ; } } } } else // a换b { for (int i = 1; i <= n; i ++ ) { int start = 1; if (i % 2 == 0) start = 2; for (int j = start; j < m; j += 2) { if (maxx != k) { g[i][j] = 'B'; maxx -- ; } } } } } else { for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { if ((i + j) & 1) g[i][j] = 'A'; else g[i][j] = 'B'; } } // b换a if (tt == 'A') { for (int i = 1; i <= n; i ++ ) { int start = 3; if (i % 2 == 0) start = 2; for (int j = start; j <= m; j += 2) { if (maxx != k) { g[i][j] = 'A'; maxx -- ; } } } } else // a换b { for (int i = 1; i <= n; i ++ ) { int start = 1; if (i % 2 == 1) start = 2; for (int j = start; j < m; j += 2) { if (maxx != k) { g[i][j] = 'B'; maxx -- ; } } } } } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { cout << g[i][j]; } cout << '\n'; } } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { solve(); } }
#include <bits/stdc++.h> using namespace std; #define int long long using i64 = long long; typedef pair<int, int> PII; typedef pair<int, char> PIC; typedef pair<double, double> PDD; typedef pair<int, PII> PIII; typedef pair<int, pair<int, bool>> PIIB; const int N = 1e5 + 10; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int mod1 = 954169327; const int mod2 = 906097321; const int INF = 0x3f3f3f3f3f3f3f3f; int p[N]; bool st[N]; map<int, int> mp[N]; PIII edge[N]; void solve() { int n, m, q; cin >> n >> m >> q; for (int i = 0; i < m; i ++ ) { int a, b, c; cin >> a >> b >> c; if (a > b) swap(a, b); edge[i] = {c, {a, b}}; } sort(edge, edge + m); for (int i = 0; i < m; i ++ ) { int u = edge[i].second.first, v = edge[i].second.second; int w = edge[i].first; if (!mp[u].count(v)) mp[u][v] = i; } while (q -- ) { int k; cin >> k; vector<int> s(k); function<int(int)> find = [&](int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; }; for (int i = 0; i < k; i ++ ) { cin >> s[i]; p[s[i]] = s[i]; } sort(s.begin(), s.end()); int ans = 0; int cnt = 0; auto work1 = [&]() { vector<PIII> e; for (int i = 0; i < k; i ++ ) { int a = s[i]; for (int j = i + 1; j < k; j ++ ) { int b = s[j]; if (mp[a].count(b)) { int tmp = mp[a][b]; e.push_back({edge[tmp].first, {a, b}}); } } } sort(e.begin(), e.end()); for (auto t : e) { int a = t.second.first, b = t.second.second; int pa = find(a), pb = find(b); if (pa != pb) { p[pa] = pb; ans += t.first; cnt ++ ; } } }; auto work2 = [&]() { for (int i = 0; i < k; i ++ ) st[s[i]] = true; for (int i = 0; i < m; i ++ ) { int a = edge[i].second.first, b = edge[i].second.second; if (st[a] && st[b]) { int pa = find(a), pb = find(b); if (pa != pb) { ans += edge[i].first; p[pa] = pb; cnt ++ ; } } } for (int i = 0; i < k; i ++ ) st[s[i]] = false; }; if (k < 300) work1(); else work2(); if (cnt == k - 1) cout << ans << '\n'; else cout << -1 << '\n'; } } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
dp[0/1]
表示走到第 0 行和第 1 行当前的最大路径长度R
,就将 dp[0] ++
,第 1 行同理R
,dp[0] = max(dp[0], dp[1] + 1)
dp[1] = max(dp[1], dp[0] + 1)
ans
#include <bits/stdc++.h> using namespace std; #define int long long using i64 = long long; typedef pair<int, int> PII; typedef pair<int, char> PIC; typedef pair<double, double> PDD; typedef pair<int, PII> PIII; typedef pair<int, pair<int, bool>> PIIB; const int N = 1e6 + 10; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int mod1 = 954169327; const int mod2 = 906097321; const int INF = 0x3f3f3f3f3f3f3f3f; void solve() { int n; cin >> n; vector<string> s(2); cin >> s[0] >> s[1]; s[0] = " " + s[0], s[1] = " " + s[1]; vector<int> dp(2); int ans = 0; for (int i = 1; i <= n; i ++ ) { if (s[0][i] == 'R') dp[0] ++ ; else dp[0] = 0; if (s[1][i] == 'R') dp[1] ++ ; else dp[1] = 0; if (s[1][i] == 'R' && s[0][i] == 'R') { int tmp0 = dp[0], tmp1 = dp[1]; dp[0] = max(tmp0, tmp1 + 1); dp[1] = max(tmp1, tmp0 + 1); } ans = max({ans, dp[0], dp[1]}); } cout << max(ans - 1, 0ll) << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
#include <bits/stdc++.h> using namespace std; #define int long long using i64 = long long; typedef pair<int, int> PII; typedef pair<int, char> PIC; typedef pair<double, double> PDD; typedef pair<int, PII> PIII; typedef pair<int, pair<int, bool>> PIIB; const int N = 1e6 + 10; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int mod1 = 954169327; const int mod2 = 906097321; const int INF = 0x3f3f3f3f3f3f3f3f; void solve() { int y; cin >> y; auto lowbit = [&](int x) { return x & -x; }; int ans = y - lowbit(y); if (ans == 0) cout << -1 << '\n'; else cout << ans << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { solve(); } }
直接糊队友的码了
#include<cstdio> #include<map> std::map<std::pair<int,int>,std::map<int,bool> > hs; std::pair<int,int> co[1000005]; int main() { int n,x,y; long long ans=0; scanf("%d%d%d",&n,&x,&y); if(x==0&&y==0) { printf("%lld",1ll*n*(n+1)/2); return 0; } co[0]={0,0}; for(int i=1;i<=n;i++) { char c; do{scanf("%c",&c); }while(c!='A'&&c!='D'&&c!='W'&&c!='S'); co[i]=co[i-1]; if(c=='A') co[i].first--; if(c=='D') co[i].first++; if(c=='W') co[i].second++; if(c=='S') co[i].second--; if(!hs.count(co[i])) hs[co[i]]=std::map<int,bool>{}; hs[co[i]][i]=1; } for(int i=0;i<n;i++) { int X=co[i].first+x,Y=co[i].second+y; if(!hs.count({X,Y})) continue; auto id=hs[{X,Y}].lower_bound(i); if(id!=hs[{X,Y}].end()) { ans+=n-id->first+1; } } printf("%lld",ans); return 0; }
一个特殊的区间dp,可以作为trick积累一下
用 l i l_i li 和 r i r_i ri 表示两个 i i i 的坐标, d p [ i ] dp[i] dp[i] 表示 [ l i , r i ] [l_i,\ r_i] [li, ri] 这一段合并的最大贡献,很容易想到这一段贡献是可以由区间内的贡献更新的,所以我们先计算长度小的区间再计算长度大的区间
对于每一个区间 [ l i , r i ] [l_i,\ r_i] [li, ri],可以先将区间内每个元素的贡献看做 i i i,再看有没有在这一步之前合并过的小区间, g [ k ] g[k] g[k] 表示 [ l r , k ] [l_r,\ k] [lr, k] 的区间贡献,有这样两种更新方式:
d p [ i ] = g [ r i ] dp[i]=g[r_i] dp[i]=g[ri],为了方便统计答案,可以将数组两段填 0 0 0 ,最终答案就是 d p [ 0 ] dp[0] dp[0]
#include <bits/stdc++.h> using namespace std; #define int long long using i64 = long long; typedef pair<int, int> PII; typedef pair<int, char> PIC; typedef pair<double, double> PDD; typedef pair<int, PII> PIII; typedef pair<int, pair<int, bool>> PIIB; const int N = 1e6 + 10; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int mod1 = 954169327; const int mod2 = 906097321; const int INF = 0x3f3f3f3f3f3f3f3f; void solve() { int n; cin >> n; vector<int> a(n * 2 + 2); vector<PII> pos(n + 1, {-1, -1}); vector<PII> len(n + 1); a[0] = 0, a[n * 2 + 1] = 0; for (int i = 1; i <= n * 2; i ++ ) { cin >> a[i]; if (pos[a[i]].first == -1) pos[a[i]].first = i; else { pos[a[i]].second = i; len[a[i]] = {pos[a[i]].second - pos[a[i]].first + 1, a[i]}; } } len[0] = {n * 2 + 2, 0}; pos[0] = {0, n * 2 + 1}; sort(len.begin(), len.end()); vector<int> dp(n + 1); for (int i = 0; i <= n; i ++ ) { int v = len[i].second; int l = pos[v].first, r = pos[v].second; vector<int> g(n * 2 + 2); for (int j = l; j <= r; j ++ ) { int init = a[j]; if (j >= 1) g[j] = g[j - 1] + v; else g[j] = 0; if (pos[init].second == j && pos[init].first >= l && pos[init].first >= 1) { g[j] = max(g[j], g[pos[init].first - 1] + dp[init]); } } dp[v] = g[r]; } cout << dp[0] << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。