sssmzy AK 了,zpair 差一点 AK 了,我寄了。
一套难得的难度略低于 NOIP 的阳间模拟赛
虽然还是寄了
有
难得切掉的一道水题。
第一眼值域分块,然后发现不是,于是考虑对于 lower_bound
xxxxxxxxxx
871
2
3
4
5
6
7
8
9
10
11using namespace std;
12// using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28char buf_ans[114];
29ll next_n(double last_ans=0,ll get_n=0){//last_ans<n<=1e18
30sprintf(buf_ans,"%.6f",last_ans);
31for(ll i=0,x=0;;i++){if(buf_ans[i]=='.')return get_n^x;if(i&1)x*=10;
32else x=x*10+(buf_ans[i]^48);}}
33
34const int mx = 34900;
35ll blk[40000];
36ll sum[40000];
37double lans(0.0);
38
39int main(){
40 freopen("function.in", "r", stdin);
41 freopen("function.out", "w", stdout);
42 int T = read();
43 blk[1] = 1; sum[1] = 5.0;
44 for(int i = 1; i <= 35000; ++i)
45 blk[i + 1] = (ll)ceil(powl((ld)i + 0.5, 4));
46 for(int i = 1; i <= 34990; ++i)
47 sum[i + 1] = sum[i] + (ld)1.0 / (ld)(i + 1) * (ld)(blk[i + 2] - blk[i + 1]);
48 // for(int i = 1; i <= 100; ++i){
49 // printf("%lld : %lld\n", blk[i], sum[i]);
50 // }
51 while(T--){
52 ll n = read<ll>();
53 n = next_n(lans, n);
54 // printf("%lld\n", n);
55 int dist = lower_bound(blk + 1, blk + mx + 1, n) - blk;
56 // printf("dis:%d\n", dist);
57 // dist -= blk[dist] == n ? 1 : 2;
58 --dist;
59 // printf("new dis:%d\n", dist);
60 // if(n == 89)printf("val: %lld + %.6Lf / %.6Lf\n", sum[dist - 1], (ld)(n - blk[dist] + 1), (ld)dist);
61 ld ans = n == blk[dist + 1]
62 ? (sum[dist] + (ld)(n - blk[dist + 1] + 1) / (ld)(dist + 1))
63 : (sum[dist - 1] + (ld)(n - blk[dist] + 1) / (ld)dist);
64 printf("%.6Lf\n", ans);
65 lans = (double)ans;
66 }
67 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
68 return 0;
69}
70
71
72
73template<typename T>
74inline T read(void){
75 T ret(0);
76 short flag(1);
77 char c = getchar();
78 while(c != '-' && !isdigit(c))c = getchar();
79 if(c == '-')flag = -1, c = getchar();
80 while(isdigit(c)){
81 ret *= 10;
82 ret += int(c - '0');
83 c = getchar();
84 }
85 ret *= flag;
86 return ret;
87}
给定
又把 10.19 口糊的那个通过 bfs 序转称序列上然后套线段树的塞上去了,大概可以认为是暴力 + 大剪枝,树越扁剪枝越大,树是链的话就退化成暴力。
本来应该能拿到一些分的,然后线段树的 query
忘了取模了,直接全寄爆零。
xxxxxxxxxx
1391
2
3
4
5
6
7
8
9
10
11using namespace std;
12// using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28struct Edge{
29 Edge* nxt;
30 int to;
31 OPNEW;
32}ed[610000];
33ROPNEW(ed);
34Edge* head[310000];
35
36int N, Q;
37int idx[310000], ridx[310000];
38int dsl[310000], dsr[310000];
39
40void bfs(void){
41 int cnt(0);
42 queue < pair < int, int >/*vertex, father*/ > q;
43 q.push({1, 0});
44 while(!q.empty()){
45 auto p = q.front(); q.pop();
46 idx[p.first] = ++cnt;
47 ridx[cnt] = p.first;
48 vector < pair < int, int > > tmp;
49 for(auto i = head[p.first]; i; i = i->nxt)
50 if(SON != p.second)
51 q.push({SON, p.first});
52 if(!dsl[idx[p.second]])dsl[idx[p.second]] = dsr[idx[p.second]] = idx[p.first];
53 else dsr[idx[p.second]] = idx[p.first];
54 }
55}
56
57class SegTree{
58private:
59 ll st[310000 << 2];
60 ll lz[310000 << 2];
61
62
63
64public:
65 // void Pushup(int p){st[p] = st[LS] + st[RS];}
66 void Pushdown(int p){
67 st[LS] = (st[LS] + lz[p]) % MOD, st[RS] = (st[RS] + lz[p]) % MOD;
68 lz[LS] = (lz[LS] + lz[p]) % MOD, lz[RS] = (lz[RS] + lz[p]) % MOD;
69 lz[p] = 0;
70 }
71 void Modify(int l, int r, ll val, int p = 1, int gl = 1, int gr = N){
72 if(l <= gl && gr <= r)return st[p] = (st[p] + val) % MOD, lz[p] = (lz[p] + val) % MOD, void();
73 Pushdown(p);
74 if(l <= MID)Modify(l, r, val, LS, gl, MID);
75 if(MID + 1 <= r)Modify(l, r, val, RS, MID + 1, gr);
76 }
77 ll Query(int idx, int p = 1, int gl = 1, int gr = N){
78 if(gl == gr)return st[p];
79 Pushdown(p);
80 if(idx <= MID)return Query(idx, LS, gl, MID);
81 else return Query(idx, RS, MID + 1, gr);
82 }
83}st;
84
85void Mdf(int p, ll val, int k){
86 int l(p), r(p), dis(0);
87 st.Modify(l, r, (val - (ll)dis * k + MOD) % MOD);
88 while(true){
89 ++dis;
90 while(!dsl[l] && l <= r)++l;
91 while(!dsr[r] && l <= r)--r;
92 if(l > r)return;
93 l = dsl[l], r = dsr[r];
94 st.Modify(l, r, (val - (ll)dis * k + MOD) % MOD);
95 }
96}
97
98int main(){
99 freopen("tree.in", "r", stdin);
100 freopen("tree.out", "w", stdout);
101 N = read();
102 for(int i = 2; i <= N; ++i){
103 int fa = read();
104 head[i] = new Edge{head[i], fa};
105 head[fa] = new Edge{head[fa], i};
106 }bfs();
107 Q = read();
108 while(Q--){
109 int opt = read();
110 if(opt == 1){
111 int v = read(), x = read(), k = read();
112 Mdf(idx[v], (ll)x, k);
113 }else{
114 int v = read();
115 printf("%lld\n", (st.Query(idx[v]) + MOD) % MOD);
116 }
117 }
118
119 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
120 return 0;
121}
122
123
124
125template<typename T>
126inline T read(void){
127 T ret(0);
128 short flag(1);
129 char c = getchar();
130 while(c != '-' && !isdigit(c))c = getchar();
131 if(c == '-')flag = -1, c = getchar();
132 while(isdigit(c)){
133 ret *= 10;
134 ret += int(c - '0');
135 c = getchar();
136 }
137 ret *= flag;
138 return ret;
139}
给定序列
没想出来,暴力
xxxxxxxxxx
921
2
3
4
5
6
7
8
9
10
11using namespace std;
12// using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28int N;
29int arr[1100];
30vector < int > cur;
31int ans(0);
32
33bool Check(void){
34 int len[10];
35 memset(len, 0, sizeof len);
36 int lst(-1);
37 for(auto i : cur){
38 if(i == lst)++len[i];
39 else if(len[i]++)return false;
40 }
41 int mn(INT_MAX), mx(INT_MIN);
42 for(int i = 1; i <= 8; ++i)mn = min(mn, len[i]), mx = max(mx, len[i]);
43 return mx - mn <= 1;
44}
45
46void dfs(int dep){
47 if(dep > N){
48 if(Check())ans = max(ans, (int)cur.size());
49 return;
50 }
51 cur.emplace_back(arr[dep]);
52 dfs(dep + 1);
53 cur.pop_back();
54 dfs(dep + 1);
55}
56
57int main(){
58 freopen("card.in", "r", stdin);
59 freopen("card.out", "w", stdout);
60 N = read();
61 for(int i = 1; i <= N; ++i)arr[i] = read();
62 if(N <= 25)dfs(1), printf("%d\n", ans), exit(0);
63 // while((double)clock() / CLOCKS_PER_SEC <= 0.95){
64 // int siz = rndd(1, N);
65 // for(int i = 1; i <= N; ++i){
66
67
68 // }
69 printf("%d\n", rndd(1, N));
70
71
72 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
73 return 0;
74}
75
76
77
78template<typename T>
79inline T read(void){
80 T ret(0);
81 short flag(1);
82 char c = getchar();
83 while(c != '-' && !isdigit(c))c = getchar();
84 if(c == '-')flag = -1, c = getchar();
85 while(isdigit(c)){
86 ret *= 10;
87 ret += int(c - '0');
88 c = getchar();
89 }
90 ret *= flag;
91 return ret;
92}
原题 CF1051F The Shortest Statement。
寄了,写的暴力也挂了。
xxxxxxxxxx
1251
2
3
4
5
6
7
8
9
10
11using namespace std;
12// using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28int N, M;
29int Q;
30int lca[110000];
31int dep[110000];
32pair < int, int > ask[110000];
33ll ans[110000];
34pair < int, int /*vertex, val*/ > ffa[110000];
35
36struct Edge{
37 Edge* nxt;
38 int to;
39 int val;
40 OPNEW;
41}ed[310000];
42ROPNEW(ed);
43Edge* head[110000];
44
45namespace Tree{
46 vector < pair < int, int > /*vertex, query_idx*/ > query[110000];
47 bool vis[110000];
48 class UnionFind{
49 private:
50 int fa[110000];
51 public:
52 UnionFind(void){for(int i = 1; i <= N; ++i)fa[i] = i;}
53 int Find(int x){return x == fa[x] ? x : (fa[x] = Find(fa[x]));}
54 void Union(int s, int t){fa[t] = Find(s);}
55 }uf;
56 void Init(void){
57 for(int i = 1; i <= Q; ++i){
58 int u = read(), v = read();
59 ask[i] = {u, v};
60 query[u].emplace_back(v, i);
61 query[v].emplace_back(u, i);
62 }
63 }
64 void dfs(int p = 1, int fa = 0){
65 vis[p] = true;
66 for(auto i = head[p]; i; i = i->nxt)if(SON != fa && !vis[SON])dfs(SON, p), uf.Union(p, SON);
67 for(auto q : query[p])if(vis[q.first])lca[q.second] = uf.Find(q.first);
68 }
69 void dfs_dep(int p = 1, int fa = 0){
70 dep[p] = dep[fa] + 1;
71 for(auto i = head[p]; i; i = i->nxt)if(SON != fa)ffa[SON] = {p, i->val}, dfs_dep(SON, p);
72 }
73}
74
75int main(){
76 freopen("statement.in", "r", stdin);
77 freopen("statement.out", "w", stdout);
78 N = read(), M = read();
79 for(int i = 1; i <= M; ++i){
80 int s = read(), t = read(), v = read();
81 head[s] = new Edge{head[s], t, v};
82 head[t] = new Edge{head[t], s, v};
83 }Q = read();
84 if(M == N - 1){
85 Tree::Init();
86 Tree::dfs();
87 Tree::dfs_dep();
88 for(int i = 1; i <= Q; ++i){
89 ll anss(0);
90 int cp(ask[i].first);
91 while(cp != lca[i]){
92 anss += ffa[cp].second;
93 cp = ffa[cp].first;
94 }
95 cp = ask[i].second;
96 while(cp != lca[i]){
97 anss += ffa[cp].second;
98 cp = ffa[cp].first;
99 }
100 printf("%lld\n", anss);
101 }
102 exit(0);
103 }
104
105 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
106 return 0;
107}
108
109
110
111template<typename T>
112inline T read(void){
113 T ret(0);
114 short flag(1);
115 char c = getchar();
116 while(c != '-' && !isdigit(c))c = getchar();
117 if(c == '-')flag = -1, c = getchar();
118 while(isdigit(c)){
119 ret *= 10;
120 ret += int(c - '0');
121 c = getchar();
122 }
123 ret *= flag;
124 return ret;
125}
考虑对于每次修改
xxxxxxxxxx
1121
2
3
4
5
6
7
8
9
10
11using namespace std;
12// using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28struct Edge{
29 Edge* nxt;
30 int to;
31 OPNEW;
32}ed[610000];
33ROPNEW(ed);
34Edge* head[310000];
35
36int N, Q;
37int idx[310000];
38int dep[310000], siz[310000];
39
40void dfs(int p = 1, int fa = 0){
41 static int cnt(0);
42 idx[p] = ++cnt;
43 dep[idx[p]] = dep[idx[fa]] + 1;
44 ++siz[idx[p]];
45 for(auto i = head[p]; i; i = i->nxt)if(SON != fa)dfs(SON, p), siz[idx[p]] += siz[idx[SON]];
46}
47
48class BIT{
49private:
50 pair < ll, ll > tr[310000];
51public:
52 int lowbit(int x){return x & -x;}
53 void add(int x, int u, ll base, ll k){
54 while(x <= N)
55 tr[x] = {
56 ((tr[x].first + base + MOD) % MOD + (dep[u] * k + MOD) % MOD + MOD) % MOD,
57 (tr[x].second + k + MOD) % MOD
58 },
59 x += lowbit(x);
60 }
61 void modify(int l, int r, int u, ll base, ll k){
62 // printf("Modifying [%d, %d] => u = %d, x = %lld, k = %lld\n", l, r, u, base, k);
63 add(l, u, base, k);
64 add(r + 1, u, -base, -k);
65 }
66 ll query(int x){
67 int rx = x;
68 ll ret(0);
69 while(x)ret = ((ret + tr[x].first) % MOD - tr[x].second * dep[rx] % MOD + MOD) % MOD, x -= lowbit(x);
70 return ret;
71 }
72}bit;
73
74int main(){
75 N = read();
76 for(int i = 2; i <= N; ++i){
77 int fa = read();
78 head[i] = new Edge{head[i], fa};
79 head[fa] = new Edge{head[fa], i};
80 }dfs();
81 Q = read();
82 while(Q--){
83 // for(int i = 1; i <= N; ++i)printf("%lld%c", ta.query(i), i == N ? '\n' : ' ');
84 int opt = read();
85 if(opt == 1){
86 int v = read(), x = read(), k = read();
87 bit.modify(idx[v], idx[v] + siz[idx[v]] - 1, idx[v], x, k);
88 }else{
89 int v = read();
90 printf("%lld\n", bit.query(idx[v]) % MOD);
91 }
92 }
93
94 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
95 return 0;
96}
97
98template<typename T>
99inline T read(void){
100 T ret(0);
101 short flag(1);
102 char c = getchar();
103 while(c != '-' && !isdigit(c))c = getchar();
104 if(c == '-')flag = -1, c = getchar();
105 while(isdigit(c)){
106 ret *= 10;
107 ret += int(c - '0');
108 c = getchar();
109 }
110 ret *= flag;
111 return ret;
112}
咕咕咕。
update-2022_10_21 初稿