数列分块入门 (1 ~ 7)

分块

6277. 数列分块入门 1

分块思想

我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n.对于区间加操作,我们可以先暴力左右两边,然后对于中间的整块的部分的加减,我们累加在块的标记上,然后我们每次查询的时候只要,每个元素的值加上这个块的标记值,就可以得到我们的答案了。

复杂度分析

每次操作我们修改的最多的元素最多就是O(n)O(\sqrt {n})O(n)级别的个数,时间复杂读也就是O(n)O(\sqrt n)O(n)级别的,查询的时间复杂度是O(1)O(1)O(1)的,最多有nnn个操作,整体上是O(nn)O(n \sqrt{n})O(nn)的,于是一个暴力而优美的分块算法就出现了,简单的思想,\sqrt { }级别的优化。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 5e4 + 10;int value[N], bl[N], tag[N], block, n;void add(int l, int r, int c) {for(int i = l; i <= bl[l] * block && i <= r; i++) {//对前面的部分进行暴力修改。value[i] += c;}if(bl[l] != bl[r]) {//如果这两个块不在同一个分块中才要进行后面的暴力修改,否则将会重复累加。for(int i = block * (bl[r] - 1) + 1; i <= r; i++) {value[i] += c;}}for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {//对每个块进行区间修改。tag[i] += c;}//严格来说每次修改的复杂度最多将会是3 * sqrt(n)
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(); block = sqrt(n);//block是分块的大小for(int i = 1; i <= n; i++) {value[i] = read();bl[i] = (i - 1) / block + 1;//每个位置在分块中的位置。}for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(!op) {add(l, r, c);}else {printf("%d\n", value[r] + tag[bl[r]]);//他当前的值加上分块的累加值。}}return 0;
}

6278. 数列分块入门 2

想法

查询操作:对于每一个块我们开一个数组来维护其有序的状态,所以对于每一个整块我们可以通过二分去得到我们的答案,对于两头的块,我们可以暴力去得到满足条件的数。

修改操作:同样的对于整块的我们还是在一个区间标记加上其修改值,对于两头的操作我们需要额外单独的操作,记得操作完之后要把原来的存区间有序的数组重新排序,得到一个新的区间有序数组。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 5e4 + 10;int value[N], bl[N], tag[N], n, block, m;vector<int> elem[N];void reset(int x) {//最好还是写一个函数,一开始我就是没写函数然后wa了一次。elem[x].clear();for(int i = (x - 1) * block + 1; i <= x * block && i <= n; i++)elem[x].pb(value[i]);sort(elem[x].begin(), elem[x].end());
}void add(int l, int r, int x) {for(int i = l; i <= r && i <= bl[l] * block; i++)value[i] += x;reset(bl[l]);if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++)value[i] += x;reset(bl[r]);}for(int i = bl[l] + 1; i <= bl[r] - 1; i++)tag[i] += x;
}int query(int l, int r, int x) {int sum = 0;for(int i = l; i <= r && i <= bl[l] * block; i++)if(value[i] + tag[bl[i]] < x)sum++;if(bl[l] != bl[r])for(int i = (bl[r] - 1) * block + 1; i <= r; i++)if(value[i] + tag[bl[i]] < x)sum++;for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {sum += lower_bound(elem[i].begin(), elem[i].end(), x - tag[i]) - elem[i].begin();}return sum;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(); block = sqrt(n);for(int i = 1; i <= n; i++) {value[i] = read();bl[i] = (i + block - 1) / block;elem[bl[i]].pb(value[i]);}m = bl[n];for(int i = 1; i <= m; i++) sort(elem[i].begin(), elem[i].end());for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(op & 1) {printf("%d\n", query(l, r, c * c));}else {add(l, r, c);}}return 0;
}

6279. 数列分块入门 3

想法

这题应该是跟上一个类似,就是queryqueryquery操作稍微变化一下。

用上面的代码修改的时候要注意,这题数据变大了,需要改成1e5+101e5 + 101e5+10,不然就跟我一样入坑了。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 1e5 + 10;int value[N], bl[N], tag[N], n, block, m;vector<int> elem[N];void reset(int x) {elem[x].clear();for(int i = (x - 1) * block + 1; i <= x * block && i <= n; i++)elem[x].pb(value[i]);sort(elem[x].begin(), elem[x].end());
}void add(int l, int r, int x) {for(int i = l; i <= r && i <= bl[l] * block; i++)value[i] += x;reset(bl[l]);if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++)value[i] += x;reset(bl[r]);}for(int i = bl[l] + 1; i <= bl[r] - 1; i++)tag[i] += x;
}ll query(int l, int r, int x) {ll ans = -1e10;for(int i = l; i <= r && i <= bl[l] * block; i++)if(value[i] + tag[bl[i]] < x && value[i] + tag[bl[i]] > ans)ans = value[i] + tag[bl[i]];if(bl[l] != bl[r])for(int i = (bl[r] - 1) * block + 1; i <= r; i++)if(value[i] + tag[bl[i]] < x && value[i] + tag[bl[i]] > ans)ans = value[i] + tag[bl[i]];for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {auto p = lower_bound(elem[i].begin(), elem[i].end(), x - tag[i]);if(p == elem[i].begin()) continue;p--;ans = max(ans, 1ll * (*p + tag[i]));}return ans == -1e10 ? -1 : ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(); block = sqrt(n);for(int i = 1; i <= n; i++) {value[i] = read();bl[i] = (i + block - 1) / block;elem[bl[i]].pb(value[i]);}m = bl[n];for(int i = 1; i <= m; i++) sort(elem[i].begin(), elem[i].end());for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(op & 1) {printf("%d\n", query(l, r, c));}else {add(l, r, c);}}return 0;
}

6280. 数列分块入门 4

想法

仿照题二,我们可以再引入一个数组来代表当前块的总和,之后的操作就变得简单了。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 1e5 + 10;ll a[N], sum[N], tag[N];int n, block, bl[N];void update(int l, int r, int x) {for(int i = l; i <= bl[l] * block && i <= r; i++) {a[i] += x;sum[bl[i]] += x;}if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++) {a[i] += x;sum[bl[i]] += x;}}for(int i = bl[l] + 1; i <= bl[r] - 1; i++)tag[i] += x;
}int query(int l, int r, int mod) {ll ans = 0;for(int i = l; i <= bl[l] * block && i <= r; i++) {ans = (ans + a[i] + tag[bl[i]]) % mod;}if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++) {ans = (ans + a[i] + tag[bl[i]]) % mod;}}for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {ans = (ans + sum[i] + tag[i] * block) % mod;}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(); block = sqrt(n);for(int i = 1; i <= n; i++) {a[i] = read();bl[i] = (i + block - 1) / block;sum[bl[i]] += a[i];}for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(op & 1) {printf("%d\n", query(l, r, c + 1));}else {update(l, r, c);}}return 0;
}

6281. 数列分块入门 5

想法

一开始看到这个题目感觉分块无从下手啊,区间开方操作,结果一看他们ac代码,原来是开根号,,,

既然是开根号那就简单了,学过线段树应该写过这类题,我们只要加一个区间tag来标记区间内所有的数是否全部变成0和1即可。然后再加一个区间和,对于tag标记为,区间所有的数都是0 和1的我们可以直接查询区间和,也可以跳过他的开方显然有1=1\sqrt {1} = 11=10=0\sqrt {0} = 00=0

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 1e5 + 10;int a[N], sum[N], tag[N];int n, block, bl[N];void update(int l, int r) {for(int i = l; i <= r && i <= bl[l] * block; i++) {if(a[i] == 0 || a[i] == 1) continue;sum[bl[i]] -= a[i];a[i] = sqrt(a[i]);sum[bl[i]] += a[i];if(a[i] == 1 || a[i] == 0) tag[bl[i]]++;}if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++) {if(a[i] == 0 || a[i] == 1) continue;sum[bl[i]] -= a[i];a[i] = sqrt(a[i]);sum[bl[i]] += a[i];if(a[i] == 1 || a[i] == 0) tag[bl[i]]++;}}for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {if(tag[i] == block) continue;else {for(int j = (i - 1) * block + 1; j <= i * block; j++) {if(a[j] == 0 || a[j] == 1) continue;sum[bl[j]] -= a[j];a[j] = sqrt(a[j]);sum[bl[j]] += a[j];if(a[i] == 1 || a[i] == 0) tag[bl[i]]++;}}}
}int query(int l, int r) {int ans = 0;for(int i = l; i <= r && i <= bl[l] * block; i++)ans += a[i];if(bl[l] != bl[r]) {for(int i = (bl[r] - 1) * block + 1; i <= r; i++)ans += a[i];}for(int i = bl[l] + 1; i <= bl[r] - 1; i++) {if(tag[i] == block) ans += sum[i];else {for(int j = (i - 1) * block + 1; j <= i * block; j++)ans += a[j];}}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(); block = sqrt(n);for(int i = 1; i <= n; i++) {a[i] = read();bl[i] = (i + block - 1) / block;sum[bl[i]] += a[i];if(a[i] == 0 || a[i] == 1) tag[bl[i]]++;}for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(op & 1) {printf("%d\n", query(l, r));}else {update(l, r);}}return 0;
}

6282. 数列分块入门 6

想法

这里引入了一个暴力的rebuildrebuildrebuild,不愧是分块,依旧是如此的暴力。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 2e5 + 10;int value[N], n, m, block;vector<int> a[N];pii query(int x) {int now = 1;while(x > a[now].size()) {x -= a[now].size(), now++;}return mp(now, x - 1);
}void rebuild() {int num = 0;for(int i = 1; i <= m; i++) {for(int j = 0; j < a[i].size(); j++) {value[++num] = a[i][j];}a[i].clear();//注意一定要clear,我就在这里找bug找了半小时。}block = sqrt(num), m = (num + block - 1) / block;for(int i = 1; i <= num; i++) {a[(i + block - 1) / block].pb(value[i]);}
}void insert(int pos, int value) {pii p = query(pos);a[p.first].insert(a[p.first].begin() + p.second, value);if(a[p.first].size() > 20 * block)rebuild();
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();block = sqrt(n), m = (n + block - 1) / block;for(int i = 1; i <= n; i++) {value[i] = read();a[(i + block - 1) / block].pb(value[i]);}for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), c = read();if(op & 1) {pii ans = query(r);printf("%d\n", a[ans.first][ans.second]);}else {insert(l, r);}}return 0;
}

6283. 数列分块入门 7

想法

暴力两头,区间操作中间。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 1e5 + 10, mod = 1e4 + 7;int a[N], add[N], mult[N], bl[N], n, block;void init(int bl) {for(int i = (bl - 1) * block + 1; i <= bl * block; i++) {a[i] = (a[i] * mult[bl]) % mod;a[i] = (a[i] + add[bl]) % mod;}mult[bl] = 1, add[bl] = 0;
}void Add(int l, int r, int x) {init(bl[l]);for(int i = l; i <= r && i <= bl[l] * block; i++)a[i] = (a[i] + x) % mod;if(bl[l] != bl[r]) {init(bl[r]);for(int i = (bl[r] - 1) * block + 1; i <= r; i++)a[i] = (a[i] + x) % mod;}for(int i = bl[l] + 1; i <= bl[r] - 1; i++)add[i] = (add[i] + x) % mod;
}void Mult(int l, int r, int x) {init(bl[l]);for(int i = l; i <= r && i <= bl[l] * block; i++)a[i] = (a[i] * x) % mod;if(bl[l] != bl[r]) {init(bl[r]);for(int i = (bl[r] - 1) * block + 1; i <= r; i++)a[i] = (a[i] * x) % mod;}for(int i = bl[l] + 1; i <= bl[r] - 1; i++)mult[i] = (mult[i] * x) % mod, add[i] = (add[i] * x) % mod;
}int query(int pos) {return (((a[pos] * mult[bl[pos]])) % mod + add[bl[pos]]) % mod;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();block = sqrt(n);for(int i = 1; i <= n; i++) {a[i] = read() % mod;bl[i] = (i + block - 1) / block;mult[i] = 1;}for(int i = 1; i <= n; i++) {int op = read(), l = read(), r = read(), x = read();if(!op) {Add(l, r, x);} else if(op & 1) {Mult(l, r, x);} else {printf("%d\n", query(r));}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVA719 Glass Beads 最小表示 / 后缀自动机

传送门 题意&#xff1a; 求sss的最小表示。 ∣s∣≤1e4|s|\le 1e4∣s∣≤1e4 思路&#xff1a; 可以选择直接套最小表示法的板子&#xff0c;但也可以将sss复制&#xff0c;即ssssssssssss&#xff0c;对ssssss建samsamsam&#xff0c;让后贪心的找一个长度为nnn的字典序最…

你必须知道的Docker数据卷

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff08;微信上暂无法访问&#xff0c;可以通过cnblogs博客园访问&#xff09;&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟。01—Docker数据挂载到容器在Docker中&#xff0c;要想实…

牛客小白月赛11:Rinne Loves Data Structure

Rinne Loves Data Structure 思路 我们插入的位置大概分了四种&#xff1a; 第一种 显然我们找到比当前插入的值的pre&#xff0c;也就是比当前节点大的最小值。 第二种 我们只要找到当前节点的suc&#xff0c;也就是比当前节点小的&#xff0c;最大值。 第三种 我们只…

Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n]&#xff0c;你可以选择一个kkk&#xff0c;将这个排列循环右移kkk次&#xff0c;让后最多交换mmm次任意的两个位置之间的数&#xff0c;将其变成给…

VS Code 1.37 发布!多达数十个图标迎来全新设计

今天&#xff08;北京时间 2019 年 8 月 9 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.37 版本。此版本主要更新的内容包括&#xff1a;Full product icon refresh - 多达数十个图标迎来全新的现代化设计Edit string arrays in the Settings UI - 在配置编辑器…

欧拉筛模板

欧拉筛模板 const int N 1e5 10;vector<int> prime; bool st[N];void init() {st[0] st[1] 1;for(int i 2; i < N; i) {for(int j 0; j < prime.size() && i * prime[j] < N; j) {st[i * prime[j]] 1;if(i % prime[j] 0) break;}} }

Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息IntroSerilog 是 .net 里面非常不错的记录日志的库&#xff0c;结构化日志记录&#xff0c;而且配置起来很方便&#xff0c;自定义扩展也很方便Serilog is a diagnostic logging library for .NET applications. It is easy to set up…

Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组

传送门 文章目录题意思路&#xff1a;题意 给定一个不同数组成的序列aaa&#xff0c;定义pkp_kpk​为pk∑i1k∑j1kaimodajp_k\sum_{i1}^k\sum_{j1}^ka_i\bmod a_jpk​∑i1k​∑j1k​ai​modaj​&#xff0c;让你对于每个i∈[1,n]i\in [1,n]i∈[1,n]求出pip_ipi​。 2≤n≤2e5,…

miller_rabin 证明与实现

143. 质数判定__模板题链接 前置知识 费马小定理&#xff1a;ppp是质数&#xff0c;则对于任意的aaa&#xff0c;aaa与ppp互质&#xff0c;则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}ap−1≡1(modp)。 二次探测定理&#xff1a;如果ppp是一个质数&#xff0c;x2≡1(…

基于@media (prefers-color-scheme: [dark|light])的暗黑与亮色主题切换

今天有人反馈使用pdf.js的时候&#xff0c;发现pdf.js阅读器在自己的Mac Book电脑上显示的背景是暗黑色&#xff0c;而别人的电脑上却是白色&#xff1a; 根据这个问题&#xff0c;找到了pdf.js使用的view.css有段代码&#xff0c;类似这样&#xff1a; media (prefers-color-…

做「容量预估」可没有true和false

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「85」篇原创敬上随着20年来互联网的蓬勃发展&#xff0c;一个软件系统所要面对的访问压力上限被逐渐提高。虽然如此&#xff0c;但是那些体量达到亿级或者是千万级…

P3396 哈希冲突 根号分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组aaa&#xff0c;每次操作有两种&#xff1a; (1)(1)(1) 给出x,yx,yx,y&#xff0c;问aaa中下表在模xxx的时候&#xff0c;模数等于yyy的位置aia_iai​之和。 (2)(2)(2) 给出x,yx,yx,…

miller_rabin 模板

miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans 0;while(b) {if(b & 1) ans (ans a) % mod;a (a a) % mod;b >> 1;}return ans; }ll quick_pow(ll a, ll n, ll mod) {ll ans 1;while(n) {if(n & 1) ans quick_mult(ans, a, mod);a quick…

你不得不了解的10款服务器监控工具

监控Web服务器或Web主机的运行状况和正常运行非常重要。如果希望确保您的网站可用性在您的控制之中&#xff0c;那你就需要收集服务器各种性能数据以供分析和调整。以下是收集的常用大多数服务器监控组件解决方案。01Performance Co-PilotPerformance Co-Pilot&#xff0c;简称…

Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

传送门 题意&#xff1a; 有一颗nnn个节点的树&#xff0c;其中一个简单路径集合被称为kkk合法当且仅当&#xff1a; 树的每个节点至多属于一条路径&#xff0c;且每条路径恰好包含kkk个点。 对于k∈[1,n]k\in [1,n]k∈[1,n]&#xff0c;求kkk合法路径集合最多路径个数&…

acwing199.余数之和(除法分块)

思路 要计算∑i1nk(modi)\sum _{i 1} ^ {n}k\pmod {i}∑i1n​k(modi)&#xff0c;可化简原式n∗k−∑i1nk/i∗i原式 n * k - \sum _{i 1} ^ {n} k / i * i原式n∗k−∑i1n​k/i∗i&#xff0c;显然k/ik / ik/i是一个具有块状性质的区间&#xff0c;我们给定了这个块状区间的…

2020EC-final

传送门 文章目录B - Rectangle Flip 2题意&#xff1a;思路&#xff1a;A - Namomo Subsequence题意&#xff1a;思路&#xff1a;D - City Brain题意:思路:B - Rectangle Flip 2 题意&#xff1a; 给你一个n∗mn*mn∗m的矩阵&#xff0c;接下来n∗mn*mn∗m秒每秒都会消失一个…

统一流控服务开源:基于.Net Core的流控服务

先前有一篇博文&#xff0c;梳理了流控服务的场景、业界做法和常用算法统一流控服务开源-1&#xff1a;场景&业界做法&算法篇最近完成了流控服务的开发&#xff0c;并在生产系统进行了大半年的验证&#xff0c;稳定可靠。今天整理一下核心设计和实现思路&#xff0c;开…

小A的柱状图

小A的柱状图 思路 经典的单调栈题目&#xff0c;对于每一个位置&#xff0c;我们维护他以当前高度可以到达的最左方&#xff0c;以及他当前高度可以到达的最有方&#xff0c;显然就有以他的高度的矩形块的面积就出来了&#xff0c;所以我们只需要统计n个矩形的最大值就行。 …

建筑师 第一类斯特林数

文章目录目录题意:思路&#xff1a;目录 题意: 给你一个nnn的排列&#xff0c;排列中的数代表他的高度&#xff0c;问你有多少个排列能使得从左边能看到aaa个建筑&#xff0c;从右边能看到bbb个建筑。 如果建筑iii左边没有任何比他高的&#xff0c;那么他就能看到。 1≤n≤5…