nowcoder 180 牛客练习赛26
A. 平面
用$2n$条直线将平面分割成尽可能多的部分
$n \le 10^9$
设$x=2n$,答案就是$\frac{x(x+1)}{2}+1$
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct FastIO { 5 static const int S = 1e7; 6 int wpos; 7 char wbuf[S]; 8 FastIO() : wpos(0) {} 9 inline int xchar() { 10 static char buf[S]; 11 static int len = 0, pos = 0; 12 if (pos == len) 13 pos = 0, len = fread(buf, 1, S, stdin); 14 if (pos == len) exit(0); 15 return buf[pos++]; 16 } 17 inline int operator () () { 18 int c = xchar(), x = 0; 19 while (c <= 32) c = xchar(); 20 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 21 return x; 22 } 23 inline ll operator ! () { 24 int c = xchar(); ll x = 0; 25 while (c <= 32) c = xchar(); 26 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 27 return x; 28 } 29 inline void wchar(int x) { 30 if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0; 31 wbuf[wpos++] = x; 32 } 33 inline void operator () (ll x) { 34 if (x < 0) wchar('-'), x = -x; 35 char s[24]; 36 int n = 0; 37 while (x || !n) s[n++] = '0' + x % 10, x /= 10; 38 while (n--) wchar(s[n]); 39 wchar('\n'); 40 } 41 ~FastIO() 42 { 43 if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0; 44 } 45 } io; 46 47 int main() { 48 ll n = 2 * io(); 49 cout << (n * (n + 1) / 2 + 1) << endl; 50 }
B. 烟花
第一问:$a+b$问题
第二问:背包问题
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct FastIO { 5 static const int S = 1e7; 6 int wpos; 7 char wbuf[S]; 8 FastIO() : wpos(0) {} 9 inline int xchar() { 10 static char buf[S]; 11 static int len = 0, pos = 0; 12 if (pos == len) 13 pos = 0, len = fread(buf, 1, S, stdin); 14 if (pos == len) exit(0); 15 return buf[pos++]; 16 } 17 inline int operator () () { 18 int c = xchar(), x = 0; 19 while (c <= 32) c = xchar(); 20 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 21 return x; 22 } 23 inline ll operator ! () { 24 int c = xchar(); ll x = 0; 25 while (c <= 32) c = xchar(); 26 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 27 return x; 28 } 29 inline void wchar(int x) { 30 if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0; 31 wbuf[wpos++] = x; 32 } 33 inline void operator () (ll x) { 34 if (x < 0) wchar('-'), x = -x; 35 char s[24]; 36 int n = 0; 37 while (x || !n) s[n++] = '0' + x % 10, x /= 10; 38 while (n--) wchar(s[n]); 39 wchar('\n'); 40 } 41 ~FastIO() 42 { 43 if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0; 44 } 45 }; // io; 46 47 const int N = 1e5 + 10; 48 49 double p[N], f[N][101]; int n, k; 50 51 int main() { 52 scanf("%d%d", &n, &k); 53 double sum = 0; 54 for(int i = 1 ; i <= n ; ++ i) scanf("%lf", &p[i]), sum += p[i]; 55 printf("%.4lf\n", sum); 56 f[0][0] = 1; 57 for(int i = 1 ; i <= n ; ++ i) { 58 f[i][0] = f[i - 1][0] * (1 - p[i]); 59 for(int j = 1 ; j <= k ; ++ j) { 60 f[i][j] = f[i - 1][j] * (1 - p[i]) + f[i - 1][j - 1] * p[i]; 61 } 62 } 63 printf("%.4lf\n", f[n][k]); 64 }
C. 城市规划
暴力做法:按照右端点排序后贪心的能放就放
然后每个位置只需要维护最大$x_i$就行了,于是就线性复杂度了
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 49 #include <bits/stdc++.h> 50 using namespace std; 51 typedef long long ll; 52 53 #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++) 54 char buf[(1 << 22)], *p1 = buf, *p2 = buf; 55 inline int read() { 56 char c = getchar(); int x = 0, f = 1; 57 while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();} 58 while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); 59 return x * f; 60 } 61 62 const int N = 1e6 + 10, M = 1e7 + 10; 63 int n, m; 64 65 int x[M], y[M]; 66 67 int mx[N]; 68 69 //inline void add(int u, int v) { to[++ t] = v, rest[t] = head[u], head[u] = t; } 70 71 #define io read 72 73 int main() { 74 n = io(), m = io(); 75 for(int i = 1 ; i <= m ; ++ i) { 76 x[i] = io(), y[i] = io(); 77 if(x[i] > y[i]) swap(x[i], y[i]); 78 mx[y[i]] = max(mx[y[i]], x[i]); 79 } 80 int last = 0, ans = 0; 81 // for(int t = 1 ; t <= m ; ++ t) { 82 // int i = id[t]; 83 // if(last <= x[i]) { 84 // last = y[i]; 85 // ++ ans; 86 // } 87 // } 88 for(int i = 1 ; i <= n ; ++ i) { 89 if(mx[i]) { 90 if(last <= mx[i]) { 91 last = i; 92 ++ ans; 93 } 94 } 95 } 96 printf("%d\n", ans); 97 }
D. xor序列
线性基板子
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct FastIO { 5 static const int S = 1e7; 6 int wpos; 7 char wbuf[S]; 8 FastIO() : wpos(0) {} 9 inline int xchar() { 10 static char buf[S]; 11 static int len = 0, pos = 0; 12 if (pos == len) 13 pos = 0, len = fread(buf, 1, S, stdin); 14 if (pos == len) exit(0); 15 return buf[pos++]; 16 } 17 inline int operator () () { 18 int c = xchar(), x = 0; 19 while (c <= 32) c = xchar(); 20 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 21 return x; 22 } 23 inline ll operator ! () { 24 int c = xchar(); ll x = 0; 25 while (c <= 32) c = xchar(); 26 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 27 return x; 28 } 29 inline void wchar(int x) { 30 if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0; 31 wbuf[wpos++] = x; 32 } 33 inline void operator () (ll x) { 34 if (x < 0) wchar('-'), x = -x; 35 char s[24]; 36 int n = 0; 37 while (x || !n) s[n++] = '0' + x % 10, x /= 10; 38 while (n--) wchar(s[n]); 39 wchar('\n'); 40 } 41 ~FastIO() 42 { 43 if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0; 44 } 45 } io; 46 47 const int N = 1e5 + 10; 48 49 int n, q, a[50]; 50 51 void ins(int x) { 52 for(int i = 31 ; ~ i ; -- i) { 53 if(!(x >> i)) continue; 54 if(!a[i]) { 55 a[i] = x; 56 break; 57 } else { 58 x ^= a[i]; 59 } 60 } 61 } 62 63 int query(int x) { 64 for(int i = 31 ; ~ i ; -- i) { 65 if(!(x >> i)) continue; 66 if(!a[i]) return 0; 67 x ^= a[i]; 68 } 69 return 1; 70 } 71 72 int main() { 73 n = io(); 74 for(int i = 1, x ; i <= n ; ++ i) { 75 x = io(); 76 ins(x); 77 } 78 q = io(); 79 for(int i = 1, x, y ; i <= q ; ++ i) { 80 x = io(), y = io(); 81 x ^= y; 82 if(query(x)) { 83 puts("YES"); 84 } else { 85 puts("NO"); 86 } 87 } 88 }
E. 树上路径
由于$(\sum_{i=1}^{n}x_i)^2=(\sum_{i=1}^{n}x_i^2)+2 \times ans$,因此只需要维护平方和以及和
树剖一下就做完了
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct FastIO { 5 static const int S = 1e7; 6 int wpos; 7 char wbuf[S]; 8 FastIO() : wpos(0) {} 9 inline int xchar() { 10 static char buf[S]; 11 static int len = 0, pos = 0; 12 if (pos == len) 13 pos = 0, len = fread(buf, 1, S, stdin); 14 if (pos == len) exit(0); 15 return buf[pos++]; 16 } 17 inline int operator () () { 18 int c = xchar(), x = 0; 19 while (c <= 32) c = xchar(); 20 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 21 return x; 22 } 23 inline ll operator ! () { 24 int c = xchar(); ll x = 0; 25 while (c <= 32) c = xchar(); 26 for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0'; 27 return x; 28 } 29 inline void wchar(int x) { 30 if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0; 31 wbuf[wpos++] = x; 32 } 33 inline void operator () (ll x) { 34 if (x < 0) wchar('-'), x = -x; 35 char s[24]; 36 int n = 0; 37 while (x || !n) s[n++] = '0' + x % 10, x /= 10; 38 while (n--) wchar(s[n]); 39 wchar('\n'); 40 } 41 ~FastIO() 42 { 43 if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0; 44 } 45 } io; 46 47 const int mod = 1e9 + 7, N = 1e5 + 10; 48 49 int n, m, a[N]; 50 vector<int> g[N]; 51 52 int fa[N], top[N], dep[N], sz[N], son[N], pos[N], dfn[N], clk; 53 54 void dfs(int u) { 55 dep[u] = dep[fa[u]] + 1; 56 sz[u] = 1; 57 for(int v: g[u]) 58 if(v != fa[u]) { 59 fa[v] = u, dfs(v), sz[u] += sz[v]; 60 if(sz[v] > sz[son[u]]) son[u] = v; 61 } 62 } 63 64 void dfs(int u, int tp) { 65 top[u] = tp; 66 dfn[u] = ++ clk, pos[clk] = u; 67 if(son[u]) dfs(son[u], tp); 68 for(int v: g[u]) 69 if(v != fa[u] && v != son[u]) 70 dfs(v, v); 71 } 72 73 ll sum[N * 10], sqrsum[N * 10], tag[N * 10]; 74 75 #define lc (id << 1) 76 #define rc (id << 1 | 1) 77 78 void push(int id, int l, int r) { 79 if(tag[id]) { 80 (tag[lc] += tag[id]) %= mod, (tag[rc] += tag[id]) %= mod; 81 ll x = tag[id]; 82 sqrsum[id] = ((sqrsum[id] + x * x * (r - l + 1) % mod) % mod + 2 * x * sum[id]) % mod; 83 sum[id] = (sum[id] + x * (r - l + 1) % mod) % mod; 84 tag[id] = 0; 85 } 86 } 87 88 void update(int id, int l, int r) { 89 int mid = (l + r) >> 1; 90 push(id, l, r), push(lc, l, mid), push(rc, mid + 1, r); 91 sum[id] = sum[lc] + sum[rc]; 92 sqrsum[id] = sqrsum[lc] + sqrsum[rc]; 93 } 94 95 void build(int id, int l, int r) { 96 int mid = (l + r) >> 1; 97 if(l == r) { 98 ll x = a[pos[l]]; 99 sum[id] = x % mod; 100 sqrsum[id] = x * x % mod; 101 } else { 102 build(lc, l, mid), build(rc, mid + 1, r); 103 update(id, l, r); 104 } 105 } 106 107 void modify(int id, int l, int r, int ql, int qr, ll x) { 108 int mid = (l + r) >> 1; 109 push(id, l, r); 110 if(ql <= l && r <= qr) { 111 tag[id] += x; 112 return ; 113 } else if(qr <= mid) { 114 modify(lc, l, mid, ql, qr, x); 115 } else if(ql >= mid + 1) { 116 modify(rc, mid + 1, r, ql, qr, x); 117 } else { 118 modify(lc, l, mid, ql, mid, x); 119 modify(rc, mid + 1, r, mid + 1, qr, x); 120 } 121 update(id, l, r); 122 } 123 124 pair<ll, ll> query(int id, int l, int r, int ql, int qr) { 125 int mid = (l + r) >> 1; 126 push(id, l, r); 127 if(ql <= l && r <= qr) { 128 return make_pair(sum[id], sqrsum[id]); 129 } else if(qr <= mid) { 130 return query(lc, l, mid, ql, qr); 131 } else if(ql >= mid + 1) { 132 return query(rc, mid + 1, r, ql, qr); 133 } else { 134 pair<ll, ll> lef = query(lc, l, mid, ql, mid), 135 rig = query(rc, mid + 1, r, mid + 1, qr); 136 return make_pair((lef.first + rig.first) % mod, (lef.second + rig.second) % mod); 137 } 138 } 139 140 void modify(int u, int v, ll x) { 141 while(top[u] != top[v]) { 142 if(dep[top[u]] < dep[top[v]]) swap(u, v); 143 modify(1, 1, n, dfn[top[u]], dfn[u], x); 144 u = fa[top[u]]; 145 } 146 if(dep[u] > dep[v]) swap(u, v); 147 modify(1, 1, n, dfn[u], dfn[v], x); 148 } 149 150 const ll inv2 = 500000004; 151 152 ll query(int u, int v) { 153 ll sum = 0, sqrsum = 0; 154 while(top[u] != top[v]) { 155 if(dep[top[u]] < dep[top[v]]) swap(u, v); 156 pair<ll, ll> res = query(1, 1, n, dfn[top[u]], dfn[u]); 157 sum = (sum + res.first) % mod; 158 sqrsum = (sqrsum + res.second) % mod; 159 u = fa[top[u]]; 160 } 161 if(dep[u] > dep[v]) swap(u, v); 162 pair<ll, ll> res = query(1, 1, n, dfn[u], dfn[v]); 163 sum = (sum + res.first) % mod; 164 sqrsum = (sqrsum + res.second) % mod; 165 return ((sum * sum) % mod - sqrsum) % mod * inv2 % mod; 166 } 167 168 ll pw(ll a, ll b) { 169 ll r = 1; 170 for( ; b ; b >>= 1, a = a * a % mod) if(b & 1) r = r * a % mod; 171 return r; 172 } 173 174 int main() { 175 // freopen("data.in", "r", stdin); 176 n = io(), m = io(); 177 for(int i = 1 ; i <= n ; ++ i) a[i] = io(); 178 for(int i = 1, u, v ; i < n ; ++ i) { 179 u = io(), v = io(); 180 g[u].push_back(v), g[v].push_back(u); 181 } 182 dfs(1), dfs(1, 1), build(1, 1, n); 183 for(int i = 1, op, u, v, val ; i <= m ; ++ i) { 184 op = io(); 185 // printf("in: %d \n", i); 186 if(op == 1) { 187 u = io(), val = io(); 188 modify(1, 1, n, dfn[u], dfn[u] + sz[u] - 1, val); 189 } else if(op == 2) { 190 u = io(), v = io(), val = io(); 191 modify(u, v, val); 192 } else if(op == 3) { 193 u = io(), v = io(); 194 ll ans = query(u, v); 195 printf("%lld\n", (ans % mod + mod) % mod); 196 } 197 } 198 }
F. 作物