社区讨论

写的有点石,求大佬看下,不知道是什么set都神秘错误,和我的预期不符合也调不出来

AT_abc370_d[ABC370D] Cross Explosion参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlykzt3c
此快照首次捕获于
2026/02/23 10:52
2 周前
此快照最后确认于
2026/02/25 10:00
2 周前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
#define ld long double
#define ok(x) x ? cout << "Yes" << "\n" : cout << "No" << "\n"
#define out(arr)  for(int i = 1;i < arr.size();i++) cout << arr[i] << " \n"[i == arr.size() - 1];
#define db(x) cout << "$$ " << x << " $$" << "\n"
#define db1(x,y,z) cout << "$$ " << x << " $$ " << y<< " $$ " << z<<"\n"
#define rep(i,n) for(int i=0;i<(n);++i)
#define rep1(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,n) for(int i=(n)-1;i>=0;--i)
using namespace std;
const int MOD = 1e9+7;
// int fa[MAXN];
inline double dist_xy(double x1, double y1, double x2, double y2) {
    return std::hypot(x1 - x2, y1 - y2);
}
inline int gcd(int a,int b){
    return b==0 ? a:gcd(b,a%b);
}
inline int lcm(int a,int b){
    return (a*b)/gcd(a,b);
}
inline int power(int x,int n){
    int ans=1;
    while(n>0){
        if(n&1){
            (ans*=x)%=MOD;
        }
        (x*=x)%=MOD;
        n>>=1;
    }
    return ans;
}
// void build(int n){
//     for(int i=1;i<=n;i++){
//         fa[i]=i;
//     }
// }
// int find(int i){
//     return fa[i]==i ? i : fa[i]=find(fa[i]);
// }
// void Union(int x,int y){
//     int fx = find(x);
//     int fy = find(y);
//     if(fx!=fy){
//         fa[fx]=fy;
//     }
// }
// bool isUnion(int x,int y){
//     return find(x)==find(y);
// }
int Q(int op,int l,int r){
    int x;
    cout<<op<<" "<<l<<" "<<r<<flush<<endl;
    cin>>x;
    return x;
}
struct fenwick{
    vector<int>tree;
    int n;
    void build(int _n){
        n=_n;
        tree.resize(n+1);
    }
    int lowbit(int i){
        return i&-i;
    }
    void add(int i,int v){
        while(i<=n){
            tree[i]+=v;
            i+=lowbit(i);
        }
    }
    int sum(int i){
        int ans=0;
        while(i>0){
            ans+=tree[i];
            i-=lowbit(i);
        }
        return ans;
    }
    int Range(int l,int r){
        return sum(r)-sum(l-1);
    }
};
//别把题目想复杂了
//大胆猜结论
//别执着于上分,起起落落都是正常的
//掉分只代表你这把状态不好,不代表最近的努力都是无效的
//保持心态,稳健!!!
const int MAXN = 4e5+10;
int h,w,q;
int ID(int i,int j){
    return w*(i-1)+j;
}

set<int> X[MAXN];
set<int> Y[MAXN];
int vis[MAXN];
inline void run(){
    cin>>h>>w>>q;
    rep1(i,1,h){
        rep1(j,1,w){
            int id=ID(i,j);
            X[i].insert(id);
            Y[j].insert(id);
        }
    }
    int cnt=h*w;
    while(q--){
        int r,c;
        cin>>r>>c;
        int id=ID(r,c);
        // cout<<id<<'\n';
        // cout<<"---"<<'\n';
        if(!X[r].empty()){
            auto pos1=X[r].lower_bound(id);
            auto pos2=X[r].upper_bound(id);
            if(pos2!=X[r].begin()){
                pos2=prev(pos2);
            }else{
                if(pos1!=X[r].end()){
                    if(Y[c].count(*pos1)){
                        Y[c].erase(*pos1);
                    }
                    X[r].erase(*pos1);
                    cnt--;
                }
                goto ed;
            }
            // cout<<*pos1<<'\n';
            // cout<<*pos2<<'\n';
            if(pos1==pos2){
                if(Y[c].count(*pos1)){
                    Y[c].erase(*pos1);
                }
                X[r].erase(*pos1);
                cnt--;
                continue;
            }else{
                if(pos1!=X[r].end()){
                    
                    if(Y[c].count(*pos1)){
                        Y[c].erase(*pos1);
                    }
                    X[r].erase(*pos1);
                    cnt--;
                    // cout<<*pos1<<'\n';
                }
                
                // cout<<*pos2<<'\n';
                cnt--;
                if(Y[c].count(*pos2)){
                    Y[c].erase(*pos2);
                }
                X[r].erase(*pos2);
            }
        }
        ed:;
        if(!Y[c].empty()){
            auto pos1=Y[c].lower_bound(id);
            auto pos2=Y[c].upper_bound(id);
            if(pos2!=Y[c].begin()){
                pos2=prev(pos2);
            }else{
                if(pos1!=Y[c].end()){
                    cnt--;
                    if(X[r].count(*pos1)){
                        X[r].erase(*pos1);
                    }
                    Y[c].erase(*pos1); 
                }
                continue;
            }
            
            // cout<<*pos1<<'\n';
            // cout<<*pos2<<'\n';
            
            if(pos1==pos2){
                cnt--;
                if(X[r].count(*pos1)){
                    X[r].erase(*pos1);
                }
                Y[c].erase(*pos1);
                // cout<<*pos1<<'\n';
            }else{
                if(pos1!=Y[c].end()){
                    
                    cnt--;
                    if(X[r].count(*pos1)){
                        X[r].erase(*pos1);
                    }
                    Y[c].erase(*pos1);
                    // cout<<*pos1<<'\n';
                }
                
                cnt--;
                if(X[r].count(*pos2)){
                    X[r].erase(*pos2);
                }
                Y[c].erase(*pos2);
                // cout<<*pos2<<'\n';
            }   
        }
    }
    cout<<cnt<<'\n';
    return ;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    // freopen("test.in","r",stdin);
    int T=1;
    // cin>>T;
    while(T--){
        run();
    }

    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...