惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
A
Arctic Wolf
T
Threat Research - Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
博客园 - Franky
Cyberwarzone
Cyberwarzone
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Cisco Blogs
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
AWS News Blog
AWS News Blog
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 司徒正美
C
Check Point Blog
T
The Exploit Database - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
爱范儿
爱范儿
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Securelist
Security Latest
Security Latest
The GitHub Blog
The GitHub Blog
H
Help Net Security
B
Blog RSS Feed
量子位
Martin Fowler
Martin Fowler
I
InfoQ

Shiroha白羽的博客

Golang 踩坑 —— interface 为参数的时候传 nil 指针 Codeforces Round 925 (Div. 3) Codeforces Round 924 (Div. 2) Codeforces Round 923 (Div. 3) Codeforces Round 922 (Div. 2) Codeforces Round 921 (Div. 2) Educational Codeforces Round 161 (Rated for Div. 2) Codeforces Round 920 (Div. 3) Codeforces Round 919 (Div. 2) Hello 2024 Good Bye 2023 Codeforces Round 918 (Div. 4) 个人备份的常用 macOS 清理命令 Codeforces Round 917 (Div. 2) Pinely Round 3 (Div. 1 + Div. 2) Educational Codeforces Round 160 (Rated for Div. 2) Codeforces Round 914 (Div. 2) Codeforces Round 913 (Div. 3) Educational Codeforces Round 159 (Rated for Div. 2) Codeforces Round 912 (Div. 2) Codeforces Round 911 (Div. 2) CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!) Educational Codeforces Round 158 (Rated for Div. 2) Codeforces Round 910 (Div. 2) Codeforces Round 909 (Div. 3) Codeforces Round 908 (Div. 2) Educational Codeforces Round 157 (Rated for Div. 2) C++自定义的字面量 Codeforces Round 907 (Div. 2) Codeforces Round 916 (Div. 3) 关于 LRU map 的一些灵感 2023 杭州站 ICPC 现场赛 反复横跳的 Clang-Tidy(cert-dcl21-cpp) Codeforces Round 906 (Div. 2) 一段奇怪的 CPP 代码 Codeforces Round 905 (Div. 3) Codeforces Round 904 (Div. 2) Codeforces Round 903 (Div. 3) Educational Codeforces Round 156 (Rated for Div. 2) Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round) Codeforces Round 901 (Div. 2) Codeforces Round 900 (Div. 3) Codeforces Round 899 (Div. 2) Educational Codeforces Round#155 (Div. 2) Codeforces Round 898 (Div. 4) CodeTON Round 6 (Div. 2) Codeforces Round 897 (Div. 2) Codeforces Round 896 (Div. 2) Codeforces Round 887 (Div. 2) Codeforces Round 895 (Div. 3) 左值-右值-将亡值 blog.mauve.icu Pinely Round 2 (Div. 1 + Div. 2) Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Codeforces Round 894 (Div. 3) Codeforces Round 888 (Div. 3) Educational Codeforces Round#153 (Div. 2) Codeforces Round 893 (Div. 2) OTPAUTH,两步验证中的通用协议 Codeforces Round 892 (Div. 2) Codeforces Round 891 (Div. 3) Codeforces Round 890 (Div. 2) Educational Codeforces Round#152 (Div. 2) blog.mauve.icu Java Script 的 null 和 undefined 随想 记一次 SQL LEFT JOIN 没有得到预期结果的错误 Codeforces Round#789(Div. 2) GCC/G++ 预编译头性能优化 使用 Junit5 和 Mockito 实现 SpringBoot 的单元测试最优美的解决方案 centOS 防火墙 docker-compse 的问题 C++ 语言实现动态变化的线程池 Codeforces Round#744 (Div. 3) 计算机图形学 Windows 通过网络访问 WSL2 原生 JavaScript 实现图片裁剪 面试复习(计算机图形学) 面试复习(算法) Codeforces Round#706(Div. 2)-Let's Go Hiking 面试复习(Java) 面试复习(Git) 面试复习(Linux) 面试复习(数据库) 面试复习(计算机网络) 面试复习(操作系统) 面试复习(C++) Codeforces Round#699 (Div. 2) 清理 WSL2 的磁盘占用 Codeforces Round#697 (Div. 3) Windows 下的 NTFS 驱动器索引 BUG 计算机网络复习 记一次 Navicat 连接 MySQL 一直报认证错误(Access denied) 计算机网络实验复习 WSL1 使用 Docker 一直无法启动 我的ACM脚印 2020牛客暑期多校训练营(第三场)D-Points Construction Problem——构造 2020牛客暑期多校训练营(第三场)E-Two Matchings——复杂思维与简单dp 2020牛客暑期多校训练营(第二场)I-Interval——最大流转对偶图求最短路 Educational Codeforces Round 80 D. Minimax Problem——二分+二进制处理 Codeforces Round 606 E. Two Fairs——图论 Codeforces Round 612 (Div. 2) C. Garland——DP
Codeforces Round 915 (Div. 2)
Shiroha · 2024-02-17 · via Shiroha白羽的博客

A. Constructive Problems

大致题意

有一个棋盘,允许选择一定数量的方格先进行染色

若某个方格的相邻四个格子中,横向至少有一个已经染色,且纵向至少也有一个已经染色的情况下,那么这个格子也可以被自然染色

问最少最初选择的方格数量是多少

思路

对角线即可

AC code

1
2
3
4
5
6
7
8
9
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int a, b;
cin >> a >> b;
cout << max(a, b) << endl;
}
}

B. Begginer’s Zelda

大致题意

有一棵树,允许每次选择树上的一条路径,然后将路径上的所有的点都挤压到一个点上,问最多需要挤压几次才能让整个树变成一个点

思路

其实只需要统计叶子结点数量就行了,然后两两连线挤压即可,必定存在一种方法使得整个树的所有边被遍历

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
vector<int> deg(n + 1, 0);
for (int i = 0; i < n - 1; ++i) {
int u, v;
cin >> u >> v;
++deg[u];
++deg[v];
}

int cnt = 0;
for (int i = 1; i <= n; ++i) cnt += deg[i] == 1;
cout << (cnt + 1) / 2 << endl;
}
}

C. Largest Subsequence

大致题意

有一个字符串,接下来有如下操作

  • 找到这个字符串中字典序最大子序列
  • 将这个子序列进行右移操作,仅对序列内的值生效

问需要操作几次才能使得整个数组有序

思路

因为是字典序最大子序列,那么必然得到的子序列是一个递减的序列。

而要求是右移,即把最后面的值放到最前面,那么必然放到最前面的是最小的那个值,那么必然下一次得到字典序最大子序列的时候,必定不会包含这个值了

也就是说,实际上每次操作后,下一次得到的子序列就是上一次的子序列删掉最开头的位置和最后面的那个值,即排序操作仅对这个子序列生效

所以只需要看这个子序列需要操作几次才能有序,以及是否能够保证整个序列有序

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
string str;
str.reserve(n);
cin >> str;
vector<int> st(n);
int r = 0;
for (int i = 0; i < n; ++i) {
while (r > 0 && str[st[r - 1]] < str[i]) --r;
st[r++] = i;
}
int ans = r;
for (int i = 0; i < r; ++i) if (str[st[i]] == str[st[0]]) --ans;
--r;
for (int l = 0; l < r; ++l, --r) swap(str[st[l]], str[st[r]]);
for (int i = 1; i < n; ++i) if (str[i] < str[i - 1]) ans = -1;
cout << ans << endl;
}
}

D. Cyclic MEX

大致题意

有一个 $[0, n-1]$ 的排列,允许进行任意次的右移操作

问找到一种的排列,使得 $\sum_{i=1}^n mex([a_1, a_2, \dots a_{i}])$ 最大

思路

这种数组的 $mex$ 其实就等于要求算的那个值后面的值中最小的那个值

考虑每次右移带来的效果

  • 首先是最前面的那个 $mex([a_1])$ 会被删除掉
  • 然后影响从最后一个开始,找到第一个比当前值更小的值,这期间的所有值带来的贡献都变成当前值
  • 然后再加上固定 $n$ 的贡献

所以可以考虑单调栈的方式去做

但是我觉得这个方案有点累,所以直接用线段树了。虽然说是仅影响了更小的那个值以及后面的值
但是要明确的是,那个更小的值前面的带来的贡献,必然小于等于那个更小的值,所以只需要全局把贡献降低到当前值即可

用样例举个例子

index12345678
start23670145
mex00001458
rotate36701452
mex00012228
  • 可以看到,首先是 $2$ 移动到后面去了,贡献变成了 $8$
  • 然后是可以注意到,因为 $2$ 在最后面,所以所有值的贡献是不可能超过 $2$ 的,因为它必然是所有值后面的值

所以直接用线段树暴力即可,注意做好懒处理

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#define ll long long

struct SegTree {
vector<ll> sum, ma, mi;
vector<bool> lazy;

explicit SegTree(const int n) : sum((n << 1) + 10), ma((n << 1) + 10), mi((n << 1) + 10), lazy((n << 1) + 10) {}

static int get(const int l, const int r) { return (l + r) | (l != r); }

void up(const int l, const int r) {
const int mid = (l + r) >> 1;
const int i = get(l, r), li = get(l, mid), ri = get(mid + 1, r);
sum[i] = sum[li] + sum[ri];
ma[i] = max(ma[li], ma[ri]);
mi[i] = min(mi[li], mi[ri]);
}

void push(const int l, const int r) {
const int mid = (l + r) >> 1;
const int i = get(l, r), li = get(l, mid), ri = get(mid + 1, r);
lazy[i] = false;
lazy[li] = true;
lazy[ri] = true;
sum[li] = (mid - l + 1) * mi[i];
sum[ri] = (r - mid) * mi[i];
ma[li] = ma[ri] = ma[i];
mi[li] = mi[ri] = mi[i];
}

void update(const int l, const int r, const int x, const ll v) {
const int i = get(l, r);
if (l == r) {
sum[i] = ma[i] = mi[i] = v;
return;
}

if (lazy[i]) push(l, r);
const int mid = (l + r) >> 1;
if (x <= mid) update(l, mid, x, v);
else update(mid + 1, r, x, v);
up(l, r);
}

void update(const int l, const int r, const ll v) {
int i = get(l, r);
if (ma[i] <= v) return;
if (mi[i] > v) {
ma[i] = mi[i] = v;
sum[i] = (r - l + 1) * v;
lazy[i] = true;
return;
}

if (l == r) {
sum[i] = ma[i] = mi[i] = v;
return;
}

const int mid = (l + r) >> 1;
update(l, mid, v);
update(mid + 1, r, v);
up(l, r);
}
};

void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
vector<int> data(n);
for (auto& i: data) cin >> i;

vector flag(n + 1, false);
int l = 1, r = n;
SegTree tree(r);
// init
int cur = 0;
for (int i = 0; i < n; ++i) {
flag[data[i]] = true;
while (flag[cur]) ++cur;
tree.update(l, r, i + 1, cur);
}
ll ans = 0;
for (int i = 0; i < n; ++i) {
tree.update(l, r, data[i]);
tree.update(l, r, i + 1, n);

ans = max(ans, tree.sum[tree.get(l, r)]);
}
cout << ans << endl;
}
}