HDU多校Round 4
Solved:3
rank:405.................................
B. Harvest of Apples
知道了S(n,m) 可以o(1)的求S(n - 1, m),S(n + 1,m),S(n,m - 1),S(n,m + 1) 天秀莫队
#include <stdio.h> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; const ll mod = 1e9 + 7; int blo = 200; ll ans; ll f[100005]; ll inv[100005]; ll anss[100005]; ll pow_mod(ll x, ll y) { ll res = 1; while(y) { if(y & 1) res = res * x % mod; x = x * x % mod; y >>= 1; } return res; } void prework() { f[0] = 1; inv[0] = 1; for(int i = 1; i <= 100000; i++) f[i] = f[i - 1] * 1LL * i % mod; for(int i = 1; i <= 100000; i++) inv[i] = pow_mod(f[i], mod - 2LL); } struct node { int n, m, id; }E[100005]; bool cmp(node A, node B) { int a = (A.n - 1) / blo; int b = (B.n - 1) / blo; if(a == b) return A.m < B.m; else return a < b; } int main() { ans = 1; prework(); int T; scanf("%d", &T); for(int i = 1; i <= T; i++) { scanf("%d%d", &E[i].n, &E[i].m); E[i].id = i; } sort(E + 1, E + 1 + T, cmp); ll n = 1, m = 0; for(int i = 1; i <= T; i++) { while(n < E[i].n) { ans *= 2LL; ll tmp = f[n] * inv[m] % mod * inv[n - m] % mod; ans = (ans - tmp + mod) % mod; n++; } while(m > E[i].m) { ll tmp = f[n] * inv[m] % mod * inv[n - m] % mod; ans = (ans - tmp + mod) % mod; m--; } while(n > E[i].n) { ll tmp = f[n - 1] * inv[m] % mod * inv[n - 1 - m] % mod; ans += tmp; ans = ans * inv[2] % mod; n--; } while(m < E[i].m) { ll tmp = f[n] * inv[m + 1] % mod * inv[n - m - 1] % mod; ans = (ans + tmp) % mod; m++; } anss[E[i].id] = ans; } for(int i = 1; i <= T; i++) printf("%lld\n", anss[i]); return 0; }
D. Nothing is Impossible
题意出锅 秒变签到题
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> using namespace std; typedef long long ll; struct node { int a, b; }E[105]; bool cmp(node A, node B) { return A.b < B.b; } int main() { int T; scanf("%d", &T); while(T--) { int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d%d", &E[i].a, &E[i].b); sort(E + 1, E + 1 + n, cmp); ll tmp = 1; int ans = n; for(int i = 1; i <= n; i++) { if(tmp * (E[i].b + 1LL) <= m) { tmp *= (E[i].b + 1LL); } else { ans = i - 1; break; } } printf("%d\n", ans); } return 0; }
J. Let Sudoku Rotate
玄学剪纸 把一个矩阵翻转的话就考虑换一种方法遍历 转四次相当于转一圈 dfs回来的时候要恢复状态
#include <stdio.h> #include <algorithm> #include <iostream> #include <cmath> #include <string.h> using namespace std; int ans; int num[20][20]; int tmp[20][20]; int vis[20]; int cal(char x) { if(x - '0' >= 0 && x - '0' <= 9) return x - '0'; else return 10 + x - 'A'; } void rotate(int x, int y) { int ix = x * 4 - 3; int iy = y * 4 - 3; for(int i1 = ix, i2 = iy; i2 <= iy + 3; i2++, i1++) for(int j1 = iy, j2 = ix + 3; j2 >= ix; j1++, j2--) tmp[i1][j1] = num[j2][i2]; for(int i = ix; i <= ix + 3; i++) for(int j = iy; j <= iy + 3; j++) num[i][j] = tmp[i][j]; } bool check(int x, int y) { int ix = x * 4 - 3; int iy = y * 4 - 3; for(int i = ix; i <= ix + 3; i++) { memset(vis, 0, sizeof(vis)); for(int j = 1; j <= y * 4; j++) { if(vis[num[i][j]]) return false; vis[num[i][j]] = 1; } } for(int j = iy; j <= iy + 3; j++) { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= x * 4; i++) { if(vis[num[i][j]]) return false; vis[num[i][j]] = 1; } } return true; } void dfs(int x, int y, int st) { if(x == 5) { ans = min(ans, st); return; } for(int i = 0; i <= 3; i++) { if(i != 0) rotate(x, y); if(check(x, y)) { if(y != 4) dfs(x, y + 1, st + i); else dfs(x + 1, 1, st + i); } } rotate(x, y); } int main() { int T; scanf("%d", &T); while(T--) { ans = 100; for(int i = 1; i <= 16; i++) { char s[20]; scanf("%s", s + 1); for(int j = 1; j <= 16; j++) num[i][j] = cal(s[j]); } dfs(1, 1, 0); printf("%d\n", ans); } return 0; }
K. Expression in Memories
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> using namespace std; char s[505]; int vis[505]; int main() { int T; scanf("%d", &T); while(T--) { memset(vis, 0, sizeof(vis)); scanf("%s", s); int len = strlen(s); bool f = true; for(int i = 0; i < len; i++) { if(s[i] == '+') { if(i == 0 || i == len - 1) f = false; if(i + 1 < len && s[i + 1] == '+') f = false; if(i + 1 < len && s[i + 1] == '*') f = false; } else if(s[i] == '*') { if(i == 0 || i == len - 1) f = false; if(i + 1 < len && s[i + 1] == '+') f = false; if(i + 1 < len && s[i + 1] == '*') f = false; } else if(s[i] - '0' > 0 && s[i] - '0' <= 9) vis[i] = 1; else if(s[i] == '0') { if(i - 1 >= 0 && vis[i - 1] == 1) vis[i] = 1; else { if(i + 1 < len && s[i + 1] - '0' >= 0 && s[i + 1] - '0' <= 9) f = false; else if(i + 1 < len && s[i + 1] == '?') s[i + 1] = '+'; } } else if(s[i] == '?') { if(i == 0 || i + 1 == len) s[i] = '1', vis[i] = 1; else if(i - 1 >= 0 && vis[i - 1] == 0) { if(s[i - 1] == '0') s[i] = '+'; else s[i] = '1', vis[i] = 1; } else { s[i] = '1', vis[i] = 1; } } } if(!f) puts("IMPOSSIBLE"); else printf("%s\n", s); } return 0; }
L. Graph Theory Homework
#include <stdio.h> #include <algorithm> #include <iostream> #include <cmath> using namespace std; int q[100005]; int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &q[i]); int ans = sqrt(abs(q[n] - q[1])); printf("%d\n", ans); } return 0; }