AtCoder Beginner Contest 466 D - Placing Rooks 题解

前言

  • msjing打开 \(C\) 一看:

02c1e083ba104b95804d09957ce80852

  • 算了吧跳了
  • 然后就只写了 \(D\) 就摆了

problem

  • 进行操作,推平一行一列,在 \((R_i,C_i)\) 这个位置放一个子

solve

  • 鹅,大水题,这种题都有套路,做多了就会了,其实msjing上上次还不会
  • 操作有优先级,就和ABC464E很像了,可以看我之前写的,所以全输进来,倒着扫,来说一下具体操作
    1. \((R_i,C_i)\) 是否被其后的操作覆盖(由于我们是倒着扫的,所以我们知道后面的情况,可以用 \(bool\) 数组记录),如果没有就答案 \(+1\)
    2. 无论上面答案有没有 \(+1\),都要把 \(R_i\)\(C_i\) 列标记为覆盖过
    3. 遍历完输出答案就行了

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
  • 没了喵
  • 捏造:今天没有小剧场呢
posted @ 2026-07-11 21:40  msjing  阅读(42)  评论(0)    收藏  举报