set.erase()立大功

set.erase(int x)可以将x删除,利用这个特性,可以做到一次性删除
https://atcoder.jp/contests/abc370/tasks/abc370_d

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define lowbit(x) (x&-x)
using namespace std;
const double pi=acos(-1);

void solve(){
    int h,w,q;cin>>h>>w>>q;
    vector<set<int>> hmp(h+1),wmp(w+1);
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            hmp[i].insert(j);
            wmp[j].insert(i);
        }
    }

    auto del=[&](int x,int y){
        hmp[x].erase(y);
        wmp[y].erase(x);
    };

    while(q--){
        int x,y;cin>>x>>y;
        x--,y--;
        if(hmp[x].count(y)){
            del(x,y);
            continue;
        }

        if(!hmp[x].empty()){
            auto it=hmp[x].upper_bound(y);
            if(it!=hmp[x].end()) del(x,*it);
            if(!hmp[x].empty()){
                it=hmp[x].upper_bound(y);
                if(it!=hmp[x].begin()){
                    it--;del(x,*it);
                }
            }
        }

        if(!wmp[y].empty()){
            auto it=wmp[y].upper_bound(x);
            if(it!=wmp[y].end()) del(*it,y);

            if(!wmp[y].empty()){
                it=wmp[y].upper_bound(x);
                if(it!=wmp[y].begin()){
                    it--;del(*it,y);
                }
            }

        }
    }
    int ans=0;

    for(int i=0;i<h;i++){
        ans+=hmp[i].size();
    }

    cout<<ans<<endl;
}
signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	//cin>>t;
	while(t--) solve();
	return 0;
}

posted on 2024-10-17 21:46  TaopiTTT  阅读(3)  评论(0编辑  收藏  举报