总结收获
- 最重要的是知道怎么解决的,代码实在现在写不出来,可以先借鉴一下大佬的hhh。
题目
传送门
- 题意:n*1e9的01阵,m条线段(i,l,r)表示第i行[l,r]都为1,线段可能重复。一个漂亮矩阵定义为任意连续两行都至少有一列在这两行中都为1,求最少删去多少行,能使剩下的矩阵为漂亮矩阵。

- 题解:不难想到,遍历每一行,每一行的上面一行应该是行数最多的漂亮矩阵的最后一行,然后线段树维护即可(具体的看代码)
2.1 离散化:用unique
而不用map
。
2.2 pair<int,int>
:能用就用,不用自己搞个结构体(大佬都在用pair),另外{x,y}
似乎可以等价于make_pair(x,y)
。
2.3 for(auto &i:g[x])
:然后才可以修改值,否则知识取数操作。
2.4 emplace_back
算是puah_back
的优化。
- 代码:
#include <bits/stdc++.h>
#define pii pair<int, int>
#define dbg(x) cout << #x << "===" << x << endl
using namespace std;
const int N = 6e5 + 5;
int n, m, p, l, r;
int f[N], vis[N];
vector<pii> v[N];
vector<int> x;
pii mx[N << 2], tag[N << 2];
void pushdown(int p) {
mx[p << 1] = max(mx[p << 1], tag[p]);
mx[p << 1 | 1] = max(mx[p << 1 | 1], tag[p]);
tag[p