我这个时间复杂度应该烤鸭优化到O(q+h*w)但是我不会优化,求调
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define all(x) x.begin(),x.end()
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define lc rt<<1
#define rc rt<<1|1
const int N=3e5+6,yyx=1e9+7;
int n,h,w,q,r[N],c[N];
struct DSU{
vector<int> fa,sz,d;
DSU(int n){
fa.resize(n+1);
sz.resize(n+1,1);
d.resize(n+1,0);
iota(fa.begin(),fa.end(),0);
}
int find(int x){
if(x==fa[x]) return x;
int px=find(fa[x]);
d[x]+=d[fa[x]];
fa[x]=px;
return fa[x];
}
bool same(int x,int y){
int px=find(x),py=find(y);
return px==py;
}
bool same(int x,int y,int k){
return d[x]-d[y]==k;
}
void merge(int x,int y,int k){
int px=find(x),py=find(y);
if(px!=py){
fa[px]=py;
sz[py]+=sz[px];
d[px]=k+d[y]-d[x];
}
}
void merge(int x,int y){
int px=find(x),py=find(y);
if(px!=py){
fa[px]=py;
sz[py]+=sz[px];
}
}
int size(int x){
return sz[find(x)];
}
};
inline void solve(){
cin>>h>>w>>q;
for(int i=1;i<=q;++i){
cin>>r[i]>>c[i];
}
DSU dsu(h*w+1);
for(int i=2;i<=q;++i){
int u=(r[i-1]-1)*w+c[i-1],v=(r[i]-1)*w+c[i];
if(!dsu.same(u,v)){
dsu.merge(u,v);
}
else{
int x=r[i],y=c[i];
while(x-2>=0){
if(!dsu.same((x-2)*w+c[i],v)){
dsu.merge((x-2)*w+c[i],v);
break;
}
x--;
}
x=r[i],y=c[i];
while(x<=h-1){
if(!dsu.same((x)*w+c[i],v)){
dsu.merge((x)*w+c[i],v);
break;
}
x++;
}
x=r[i],y=c[i];
while(y-1>=1){
if(!dsu.same((r[i]-1)*w+y-1,v)){
dsu.merge((r[i]-1)*w+y-1,v);
break;
}
y--;
}
x=r[i],y=c[i];
while(y+1<=w){
if(!dsu.same((r[i]-1)*w+y+1,v)){
dsu.merge((r[i]-1)*w+y+1,v);
break;
}
y++;
}
}
}
int u=(r[1]-1)*w+c[1];
cout<<h*w-dsu.size(u)<<endl;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
//freopen("D://321//in.txt","r",stdin);
//freopen("D://321//out.txt","w",stdout);
int _=1;
//cin>>_;
while(_--)
solve();
return 0;
}