C o d e F o r c e s 264 B CodeForces 264B CodeForces264B G o o d S e q u e n c e s Good Sequences GoodSequences
思路: 质因数分解后,求当前数的质因数种出现的最大次数,然后当前数的所有质因数赋值当前的最大,进行 d p dp dp即可,时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-06 13:40:49 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ //#include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; ll in[maxn], cnt, head[maxn]; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } map<int, int> mp; ll ksm(ll a, ll b) { ll res = 1; for (; b;) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } vector<int> f; int a[maxn]; int dp[maxn]; int solve(int x) { int k = x, res = 0; for (int i = 2; i * i <= x; i++) { bool fla = true; while (x % i == 0) { if (fla) dp[i]++, fla = false; x /= i; res = max(dp[i], res); } } if (x > 1) dp[x]++, res = max(dp[x], res); x = k; for (int i = 2; i * i <= x; i++) { bool fla = true; while (x % i == 0) { x /= i; if (fla) fla = false, dp[i] = res; } } if (x > 1) dp[x] = res; return res; } int main() { int n; read(n); for (int i = 1; i <= n; i++) { read(a[i]); } int ans = 1; for (int j = 1; j <= n; j++) { ans = max(ans, solve(a[j])); } //cout << endl; printf("%d\n", ans); }C o d e F o r c e s 246 D CodeForces 246D CodeForces246D C o l o r f u l G r a p h Colorful Graph ColorfulGraph
思路: 分组,染色,求贡献
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-06 19:56:23 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; int cnt, head[maxn], pos[maxn]; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } map<int, int> vis; //unordered_map<int,int>vis; ll ksm(ll a, ll b) { ll res = 1; for (; b;) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } struct node { int v, nex; } edge[maxn << 1]; void add(int u, int v) { edge[cnt].v = v, edge[cnt].nex = head[u]; head[u] = cnt++; } vector<int> vec[maxn], f; int main() { int n, m, color = 100000; read(n), read(m); for (int i = 1; i <= n; i++) { head[i] = -1; read(pos[i]); f.push_back(pos[i]); vec[pos[i]].push_back(i); if (pos[i] < color) color = pos[i]; } sort(f.begin(), f.end()); f.erase(unique(f.begin(), f.end()), f.end()); for (int i = 1; i <= m; i++) { int u, v; read(u), read(v); add(u, v), add(v, u); } int ans = 0, k = f.size(); for (int i = 0; i < k; i++) { int maxx = 0; vis.clear(); for (int j = 0; j < vec[f[i]].size(); j++) { int p = vec[f[i]][j]; for (int u = head[p]; ~u; u = edge[u].nex) { int v = edge[u].v; if ((pos[v] != pos[p]) && (!vis[pos[v]])) maxx++, vis[pos[v]] = 1; } if (maxx > ans) color = pos[p], ans = maxx; else if (maxx == ans && pos[p] < color) color = pos[p]; } } printf("%d\n", color); }C o d e F o r c e s 369 C CodeForces 369C CodeForces369C V a l e r a a n d E l e c t i o n s Valera and Elections ValeraandElections
思路: 枚举叶节点,边权转化,找最先出现的坏点 数据水了,被俩队友hack了,最坏时间复杂度是 O ( N 2 ) O(N^2) O(N2),但记录一下
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-11 12:08:33 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } //map<int, int> vis; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } struct node { int v, pos, nex, w; } edge[maxn << 1]; int cnt, head[maxn], pre[maxn], vis[maxn]; int dwn[maxn], in[maxn], color[maxn]; vector<int> f; void add(int u, int v, int w) { edge[cnt].v = v, edge[cnt].w = w; edge[cnt].nex = head[u], head[u] = cnt++; } void dfs(int u, int fa) { pre[u] = fa; for (int i = head[u]; ~i; i = edge[i].nex) { int v = edge[i].v; if (v != fa) { if (edge[i].w == 2) vis[v] = 1; dfs(v, u); } } } int main() { int n; read(n); for (int i = 1; i <= n; i++) head[i] = -1; for (int i = 1; i < n; i++) { int u, v, w; read(u), read(v), read(w); in[v]++, in[u]++; add(u, v, w), add(v, u, w); } dfs(1, 0); for (int i = 2; i <= n; i++) { if (in[i] == 1) { f.push_back(i); } } int m = f.size(); for (int i = 0; i < m; i++) { int k = f[i]; bool fla = false; while (k != 1) { if (color[k]) break; if (fla) color[k] = 1; if (vis[k]) { dwn[k]=1; fla = true; } k = pre[k]; } } f.clear(); int ans = 0; for (int i = 1; i <= n; i++) { if (dwn[i] == 1 && (!color[i])) ans++, f.push_back(i); } printf("%d\n", ans); bool fla=false; for (int i = 0; i < ans; i++) { fla=true; printf("%d ", f[i]); } if(fla) puts(""); }C o d e F o r c e s 815 A CodeForces 815A CodeForces815A K a r e n a n d G a m e Karen and Game KarenandGame 思路:考虑两种状况 , n > m n>m n>m和 n < = m n<=m n<=m
参考代码
#include<iostream> #include<vector> #include<stack> #include<queue> #include<map> #include<unordered_map> #include<unordered_set> #include<set> #include<cstdlib> #include<cmath> #include<cstdio> #include<cstring> #include<set> using namespace std; typedef long long ll; const int maxn=2e5+5; const int N=5e2+5; int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } ll ksm(ll a,ll b) { ll res=1; while(b) { if(b&1) res*=a; b>>=1,a=a*a; } return res; } int mp[105][105],sum=0; int ans[3][105]; int dp[105][105]; int dx[105][105]; void solve1(int n,int m)//先算行 { for(int i=1; i<=n; i++) { int minx=505; for(int j=1; j<=m; j++) minx=min(minx,mp[i][j]); if(minx) ans[0][i]=minx,sum+=minx; dp[i][1]-=minx,dp[i][m+1]+=minx; for(int j=1; j<=m; j++) mp[i][j]=dp[i][j]+mp[i][j-1]; } } void solve2(int n,int m)//先算列 { for(int i=1; i<=m; i++) { int minx=505; for(int j=1; j<=n; j++) minx=min(minx,mp[j][i]); if(minx) ans[1][i]=minx,sum+=minx; dx[1][i]-=minx,dx[n+1][i]+=minx; for(int j=1; j<=n; j++) mp[j][i]=dx[j][i]+mp[j-1][i]; } } void init1(int n,int m) { for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { dx[j][i]=mp[j][i]-mp[j-1][i]; } } } void init2(int n,int m) { for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { dp[i][j]=mp[i][j]-mp[i][j-1]; } } } int main() { int n,m; read(n),read(m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { read(mp[i][j]); } } if(n>m) { init1(n,m); solve2(n,m); init2(n,m); solve1(n,m); } else { init2(n,m); solve1(n,m); init1(n,m); solve2(n,m); } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(mp[i][j]) { puts("-1"); return 0; } } } printf("%d\n",sum); for(int i=1; i<=n; i++) { while(ans[0][i]--) { printf("row %d\n",i); } } for(int i=1; i<=m; i++) { while(ans[1][i]--) { printf("col %d\n",i); } } }C o d e F o r c e s 711 C CodeForces 711C CodeForces711C C o l o r i n g T r e e s Coloring Trees ColoringTrees 思路 暴力转移dp,用一个三维的 d p dp dp,记录第 i i i颗树,使用第 j j j种颜色,分了 k k k组的最小贡献,时间复杂度 O ( N 3 ) O(N^3) O(N3) 参考代码
#include<iostream> #include<vector> #include<stack> #include<queue> #include<map> #include<unordered_map> #include<unordered_set> #include<set> #include<cstdlib> #include<cmath> #include<cstdio> #include<cstring> #include<set> using namespace std; typedef long long ll; const int maxn=2e5+5; const int N=5e2+5; int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } ll ksm(ll a,ll b) { ll res=1; while(b) { if(b&1) res*=a; b>>=1,a=a*a; } return res; } ll dp[105][105][105]; int cost[105][105]; int color[105],reg[105][105]; int main() { int n,m,k; read(n),read(m),read(k); for(int i=1; i<=n; i++) read(color[i]); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { read(cost[i][j]); } } for(int i=0; i<=n; i++) { for(int j=0; j<=m; j++) { for(int l=0; l<=k; l++) { dp[i][j][l]=100000000000000000; } } } if(!color[1]) { for(int i=1; i<=m; i++) { dp[1][i][1]=cost[1][i]; } } else { dp[1][color[1]][1]=0; } for(int i=2; i<=n; i++) { if(!color[i]) { for(int j=1; j<=m; j++) { for(int a=1; a<=m; a++) { for(int b=1; b<=k; b++) { if(a!=j) dp[i][j][b]=min(dp[i-1][a][b-1]+cost[i][j],dp[i][j][b]); else dp[i][j][b]=min(dp[i-1][a][b]+cost[i][j],dp[i][j][b]); } } } } else { int j=color[i]; for(int a=1; a<=m; a++) { for(int b=1; b<=k; b++) { if(color[i]!=a) dp[i][j][b]=min(dp[i-1][a][b-1],dp[i][j][b]); else dp[i][j][b]=min(dp[i-1][a][b],dp[i][j][b]); } } } } ll minx=100000000000000000; for(int i=1;i<=m;i++) { minx=min(dp[n][i][k],minx); } if(minx==100000000000000000ll) puts("-1"); else printf("%lld\n",minx); }C o d e F o r c e s 409 H CodeForces 409H CodeForces409H A + B S t r i k e s B a c k A + B Strikes Back A+BStrikesBack 思路:没有 愚人节的一道题目,然而并没有什么思维上的考察
参考代码
#include<bits/stdc++.h> using namespace std; int main() { int a,b; scanf("%d %d",&a,&b); printf("%d\n",a+b); }C o d e F o r c e s 494 A CodeForces 494A CodeForces494A T r e a s u r e Treasure Treasure 思路 模拟栈,先将可以匹配的下标匹配,对剩下的下标进行操作即可 参考代码
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-11 09:42:28 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; int cnt, head[maxn], pos[maxn]; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } //map<int, int> vis; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } char s[maxn]; int sta[maxn], sum[maxn], ans[maxn]; int main() { scanf("%s", s + 1); int n = strlen(s + 1); int top = 0; for (int i = 1; i <= n; i++) { if (s[sta[top]] == '(' && s[i] == ')') top--; else if (s[i] != '#') sta[++top] = i; } for (int i = 1; i <= n; i++) { if (s[i] == '#') sta[++top] = i; } sort(sta + 1, sta + 1 + top); bool fla = true; for (int i = 1; i <= top; i++) { if (s[sta[i]] == ')') { fla = false; break; } if (s[sta[i]] == '(') sum[i] = sum[i - 1] + 1; else sum[i] = sum[i - 1]; } int res = sum[top]; int x = 0; for (int i = 1; i <= top; i++) { sum[i] -= x; if (s[sta[i]] == '#' && sum[i]) ans[sta[i]] = 1, x++, sum[i]--, res--; else if (s[sta[i]] == '#' && (!sum[i])) { fla = false; break; } } for (int i = top; i >= 1; i--) { if (s[sta[i]] == '(') { fla = false; break; } else { break; } } if (fla) { int x = 0; for (int i = top; i >= top; i--) { if (s[sta[i]] == '#') { ans[sta[i]] += res; break; } } for (int i = 1; i <= top; i++) { if (s[sta[i]] == '#') printf("%d\n", ans[sta[i]]); } } else { puts("-1"); } }C o d e F o r c e s 977 F CodeForces 977F CodeForces977F C o n s e c u t i v e S u b s e q u e n c e Consecutive Subsequence ConsecutiveSubsequence 思路 用 m a p map map进行离散化 d p dp dp 参考代码
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-12 21:26:12 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 2e5 + 20; const int mod = 998244353; int cnt, head[maxn], pos[maxn]; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } //map<int, int> vis; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } int sta[maxn], pre[maxn]; vector<int> f; map<int, int> dp; int main() { int n; read(n); for (int i = 1; i <= n; i++) read(sta[i]), pre[i] = -1; for (int i = 1; i <= n; i++) { dp[sta[i]] = max(dp[sta[i]],dp[sta[i] - 1] + 1); } int ans = 0, k; for (int i = 1; i <= n; i++) { if (dp[sta[i]] > ans) ans = dp[sta[i]], k = i; } printf("%d\n", ans); int x = sta[k]; for (int i = n; i >= 1; i--) { if (sta[i] == x) { f.push_back(i); x--; } } sort(f.begin(), f.end()); for (int i = 0; i < f.size(); i++) printf("%d ", f[i]); puts(""); }CodeForces 625A Guest From the Past
C o d e F o r c e s 279 C CodeForces 279C CodeForces279C L a d d e r Ladder Ladder 思路 差分构造+前缀和,当然有更简单的写法,我没有想到,太菜了
参考代码
#include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> #include <unordered_map> #include <unordered_set> using namespace std; typedef long long ll; #define ll long long //pedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; int cnt, head[maxn], pos[maxn]; //pedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } void read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; } int d[maxn],dp[maxn],a[maxn],sam[maxn]; int main() { int n,q; read(n),read(q); for(int i=1; i<=n; i++) { read(a[i]); if(a[i]==a[i-1]) sam[i]=sam[i-1]+1; if(a[i]>=a[i-1]) d[i]=0; else d[i]=1; } dp[0]=0; for(int i=1; i<=n; i++) dp[i]=dp[i-1]+d[i]; while(q--) { int l,r; read(l),read(r); if(dp[r]-dp[l]==0) puts("Yes"); else if(dp[r]-dp[l]==r-l) puts("Yes"); else { int x=dp[r]-dp[l]; r=r-sam[r]; if(dp[r]-dp[r-x]==x) puts("Yes"); else puts("No"); } } return 0; }C o d e F o r c e s 476 C CodeForces 476C CodeForces476C D r e a m o o n a n d S u m s Dreamoon and Sums DreamoonandSums 思路 数学题,推导公式 参考代码
/* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-11 16:49:16 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #include <bits/stdc++.h> #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 1000000007; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; double Max(double a, double b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return a * b / gcd(a, b); } void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; } int lowbit(int x) { return (x) & (-x); } //map<int, int> vis; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } struct node { int v, pos, nex, w; } edge[maxn << 1]; int cnt, head[maxn], pre[maxn], vis[maxn]; int dwn[maxn], in[maxn], color[maxn]; vector<int> f; void add(int u, int v, int w) { edge[cnt].v = v, edge[cnt].w = w; edge[cnt].nex = head[u], head[u] = cnt++; } void dfs(int u, int fa) { pre[u] = fa; for (int i = head[u]; ~i; i = edge[i].nex) { int v = edge[i].v; if (v != fa) { if (edge[i].w == 2) vis[v] = 1; dfs(v, u); } } } int main() { ll a, b; scanf("%lld %lld", &a, &b); ll ans = 0, res = (b * (b - 1) / 2) % mod; for (int i = 1; i <= a; i++) { ans = (ans + res * (i * b % mod + 1) % mod) % mod; } printf("%lld\n", ans); }CodeForces 833A The Meaningless Game N e w Y e a r a n d t h e P e r m u t a t i o n C o n c a t e n a t i o n New Year and the Permutation Concatenation NewYearandthePermutationConcatenation 思路 打表找规律 参考代码
#include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> //#include <unordered_map> using namespace std; typedef long long ll; #define ll long long //typedef unsigned long long uint; const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; //int sum[maxn]; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } int a[10]; vector<int>f; ll dp[1000005]; int main() { int n; ll sum=6; dp[1]=1,dp[2]=2,dp[3]=9; for(int i=4;i<=1000000;i++) { sum=(sum*i)%mod; dp[i]=((((dp[i-1]-1)%mod)*i%mod)+sum)%mod; } read(n); printf("%lld\n",dp[n]); return 0; }C o d e F o r c e s 584 C CodeForces 584C CodeForces584C M a r i n a a n d V a s y a Marina and Vasya MarinaandVasya 思路 构造相同字符,模拟 参考代码
#include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> #include <unordered_map> #include <unordered_set> using namespace std; typedef long long ll; #define ll long long const int N = 5000 + 20; const int maxn = 1e5 + 20; const int mod = 998244353; //pedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; ll ksm(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res % mod; } void read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; } vector<int>samq,difq; char s[maxn]; int check(char *s,string s1,string s2) { int n=s1.size(),ans=0; for(int i=0; i<n; i++) { if(s[i]!=s1[i]&&s[i]!=s2[i]) ans++; } return ans; } int main() { int n,t,ct; read(n),read(t); t=n-t; ct=t; string s1,s2; cin>>s1>>s2; for(int i=0; i<n; i++) { if(s1[i]==s2[i]) samq.push_back(i); else difq.push_back(i); } if(t==samq.size()) { for(int i=0; i<difq.size(); i++) { char c='a'; int k=0; while(s1[difq[i]]==c||s2[difq[i]]==c) { c=char(c+(++k)%26); } s[difq[i]]=c; } for(int i=0; i<samq.size(); i++) { s[samq[i]]=s1[samq[i]]; } printf("%s\n",s); } if(t<samq.size()) { for(int i=0; i<difq.size(); i++) { char c='a'; int k=0; while(s1[difq[i]]==c||s2[difq[i]]==c) { c=char(c+(++k)%26); } s[difq[i]]=c; } for(int i=0; i<samq.size(); i++) { if(t) { s[samq[i]]=s1[samq[i]]; --t; } else { char c='a'; int k=0; while(s1[samq[i]]==c) { c=char(c+(++k)%26); } s[samq[i]]=c; } } printf("%s\n",s); } if(t>samq.size()) { t-=samq.size(); int t1=t,t2=t; int ok=0; for(int i=0; i<difq.size(); i++) { char c='a'; int k=0; if(t1||t2) { if(ok%2==0&&t1) { c=s1[difq[i]]; t1--; } else if(t2) { c=s2[difq[i]]; t2--; } ok++; } else { while(s1[difq[i]]==c||s2[difq[i]]==c) { c=char(c+((++k)%26)); } } s[difq[i]]=c; } for(int i=0; i<samq.size(); i++) { s[samq[i]]=s1[samq[i]]; } if(t1||t2) puts("-1"); else printf("%s\n",s); } return 0; }C o d e F o r c e s 598 D CodeForces 598D CodeForces598D I g o r I n t h e M u s e u m Igor In the Museum IgorIntheMuseum 思路 预处理连通块贡献 参考代码
#include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <ctime> #include <cstring> #include <cstdlib> #include <math.h> #include <bitset> #include <unordered_map> using namespace std; typedef long long ll; #define ll long long const int N = 1000 + 20; const int maxn = 1e5 + 5; const int mod = 998244353; //typedef pair<ll, ll> p; //priority_queue<p, vector<p>, greater<p>> q; ll ksm(ll a, ll b) { ll res = 1; for (; b;) { if (b & 1) res = (res * a) % mod; b >>= 1, a = a * a % mod; } return res; } int read(int &v) { int k = 1; v = 0; int c = getchar(); while (c < '0' || c > '9') { if (c == '-') k = 0; c = getchar(); } while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar(); if (k == 0) v = -v; return c; } struct node { int x,y; } p; vector<node>f[maxn*10]; int dir[4][2]= {1,0,0,1,0,-1,-1,0}; char mp[N][N]; int vis[N][N]; int ans[100005][2],corrt[1000005]; int ck[N][N]; int sum=0,n,m; void check(int x,int y) { if(x-1>0&&mp[x-1][y]=='*') sum++; if(y-1>0&&mp[x][y-1]=='*') sum++; if(x+1<=n&&mp[x+1][y]=='*') sum++; if(y+1<=m&&mp[x][y+1]=='*') sum++; } void dfs(int x,int y,int block) { if(!vis[x][y]) { node p; p.x=x,p.y=y; f[block].push_back(p); check(x,y); vis[x][y]=1; } else { return; } for(int i=0; i<4; i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx<0||yy<0||xx>n||yy>m||mp[xx][yy]=='*'||vis[xx][yy]) continue; dfs(xx,yy,block); } } int main() { int k; read(n),read(m),read(k); for(int i=1; i<=n; i++) scanf("%s",mp[i]+1); for(int i=1; i<=k; i++) scanf("%d %d",&ans[i][0],&ans[i][1]); int block=0; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if((!vis[i][j])&&mp[i][j]=='.') { dfs(i,j,++block); corrt[block]=sum; sum=0; } } } for(int i=1;i<=block;i++) { int l=f[i].size(); for(int j=0;j<l;j++) { ck[f[i][j].x][f[i][j].y]=corrt[i]; } } for(int i=1;i<=k;i++) { printf("%d\n",ck[ans[i][0]][ans[i][1]]); } return 0; }