社区讨论
写的有点石,求大佬看下,不知道是什么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 条回复,欢迎继续交流。
正在加载回复...