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 }
A. 平面

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 }
B. 烟花

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 }
C. 城市规划

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 }
D. xor序列

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 }
E. 树上路径

F. 作物

 

posted @ 2018-09-07 21:56  KingSann  阅读(231)  评论(0编辑  收藏  举报