前言

problem
- 进行操作,推平一行一列,在 \((R_i,C_i)\) 这个位置放一个子
solve
- 鹅,大水题,这种题都有套路,做多了就会了,
其实msjing上上次还不会
- 操作有优先级,就和ABC464E很像了,可以看我之前写的,所以全输进来,倒着扫,来说一下具体操作
- 判 \((R_i,C_i)\) 是否被其后的操作覆盖(由于我们是倒着扫的,所以我们知道后面的情况,可以用 \(bool\) 数组记录),如果没有就答案 \(+1\)
- 无论上面答案有没有 \(+1\),都要把 \(R_i\) 行 \(C_i\) 列标记为覆盖过
- 遍历完输出答案就行了
code
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=1e6+10;
long long read() {long long x=0,f=1;char ch=getchar();while (ch<'0' || ch>'9'){if (ch == '-') f=-1;ch=getchar();}while (ch>='0' && ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
int r[maxn],c[maxn];
int vr[maxn],vc[maxn];
int ans;
int main()
{
n=read(),m=read();
for (int i=1;i<=m;i++) r[i]=read(),c[i]=read();
for (int i=m;i>=1;i--)
{
if (!vr[r[i]] && !vc[c[i]]) ans++;
// cerr << "chk:";
// cerr << r[i] << " " << c[i] <<endl;
vr[r[i]]=1,vc[c[i]]=1;
}
printf("%d\n",ans);
return 0;
}
后话
- 我不交 \(luogu\) 题解了太难过了555
- 本来认为 \(E\) 是超级大水贪心,结果发现是区间修,貌似要 \(DS\) 维护,果断摆烂
- msjing没想到卡输入了qwq
- 没了喵
捏造:今天没有小剧场呢