补题传送门
7127 Kanade Doesn't Want to Learn CG完全弹性碰撞,打板后新函数为原函数向右平移2d(d为碰撞点到原函数对称轴的水平距离)
#includeusing namespace std; double a,b,c; double x0,x1,y0,y1,y2; double cc; double d; double f(double x) { return a*x*x+b*x+c; } double ff(double x) { return a*(x-2*d)*(x-2*d)+b*(x-2*d)+c; } int main() { int t; cin>>t; while(t--) { scanf("%lf%lf%lf",&a,&b,&c); scanf("%lf%lf%lf%lf%lf",&x0,&x1,&y0,&y1,&y2); int flag=0; if(f(x0)>y0&&f(x1) y0&&f(x1)>y0&&f(x1)<=y2) { double xx=-b/(2*a); d=x1-xx; if(ff(x0)
7129 Primality Test打表。
#includeusing namespace std; int t; long long x; int main() { scanf("%d",&t); while(t--) { scanf("%lld",&x); if(x!=1)puts("NO"); else puts("YES"); } return 0; }
7131 Nun Heh Heh Aaaaaaaaaaadp[i][j]统计到i位置时前缀中第j个字母出现的次数,遍历每个位置,加上dp[i][j]*后面a数量的方案数
#include#define ll long long using namespace std; const int maxn = 1e5 + 10; const int mod = 998244353; ll pre[maxn][10], suf[maxn]; char s[maxn]; ll fast(ll a, int b) { ll ans = 1; while (b) { if (b & 1) ans = ans * a % mod; a = a * a % mod; b >>= 1; } return ans; } int main() { int t; cin >> t; while (t--) { ll ans = 0; scanf("%s", s + 1); int len = strlen(s + 1); memset(pre, 0, sizeof(pre)); memset(suf, 0, sizeof(suf)); for (int i = 1; i <= len; i++) { for (int j = 1; j <= 9; j++) pre[i][j] = pre[i - 1][j]; if (s[i] == 'h') { pre[i][4] = (pre[i - 1][4] + pre[i - 1][3]) % mod; pre[i][6] = (pre[i - 1][5] + pre[i - 1][6]) % mod; pre[i][7] = (pre[i - 1][7] + pre[i - 1][6]) % mod; pre[i][9] = (pre[i - 1][9] + pre[i - 1][8]) % mod; } if (s[i] == 'e') { pre[i][8] = (pre[i - 1][8] + pre[i - 1][7]) % mod; pre[i][5] = (pre[i - 1][4] + pre[i - 1][5]) % mod; } if (s[i] == 'n') { pre[i][3] = (pre[i - 1][3] + pre[i - 1][2]) % mod; pre[i][1] = (pre[i - 1][1] + 1) % mod; } if (s[i] == 'u') pre[i][2] = (pre[i - 1][2] + pre[i - 1][1]) % mod; } suf[len] = (s[len] == 'a'); for (int i = len - 1; i; i--) suf[i] = suf[i + 1] + (s[i] == 'a'); for (int i = 1; i <= len; i++) if (s[i] == 'a') ans = (ans + pre[i][9] * fast(2, suf[i]-1) % mod) % mod; printf("%lldn", ans); } return 0; }
7136 Jumping Monkey考虑删点权最大的点(设为u),那么此时与该点联通的所有点最终都能到达u。对剩下的连通块递归可得到答案。但我不会我只会并查集。反向考虑按点权从小到大枚举节点u,根据并查集关系将u作为所有与u相连的(之前枚举过的)连通块的根建一棵新树,每个节点的深度即为答案
#include#define ll long long using namespace std; const int maxn = 1e5 + 7; vector E[maxn],tu[maxn]; int n,fa[maxn],dep[maxn]; struct node { int x,val; }a[maxn]; bool cmp(node a,node b) { return a.val < b.val; } int fid(int x) { return x == fa[x] ? x : fa[x] = fid(fa[x]); } void dfs(int u,int fa) { dep[u] = dep[fa] + 1; for (auto v:tu[u]) { if(v == fa) continue; dfs(v,u); } } void solve() { int x,y; scanf("%d",&n); for (int i=1; i<=n; ++i) { E[i].clear(); tu[i].clear(); fa[i] = dep[i] = 0; } for (int i=1; i<=n-1; ++i) { scanf("%d%d",&x,&y); E[x].push_back(y); E[y].push_back(x); } for (int i=1; i<=n; ++i) { scanf("%d",&a[i].val); a[i].x = i; } sort(a+1,a+1+n,cmp); for (int i=1; i<=n; ++i) { fa[a[i].x] = a[i].x; for (auto v:E[a[i].x]) { if(fa[v]) { int V = fid(v); fa[V] = a[i].x; tu[V].push_back(a[i].x); tu[a[i].x].push_back(V); } } } // for(int i=1;i<=n;i++) // { // cout<



