abc依旧只过了abc,虽然经常因为读错题意而困扰很久,但还是觉得做这样的题像玩脑筋急转弯一样有趣,当时做d题的时候题目没理解对了,从这之后所有的题都没看,所以来补一下题。
d:
一共就有两种过程,1.有墙敲掉,2.没墙就把周围最近的墙全都敲掉
复习一下stl的一些用法了
#include<bits/stdc++.h>
using namespace std;
set<int>hh[400001],ll[400001];
int h,l,q,x,y,ans;
int main(){
cin>>h>>l>>q;
ans=h*l;
for(int i=1;i<=h;i++){
for(int j=1;j<=l;j++){
hh[i].insert(j);
ll[j].insert(i);
}
}
for(int i=1;i<=h;i++){
hh[i].insert(0);
hh[i].insert(l+1);
}
for(int i=1;i<=l;i++){
ll[i].insert(0);
ll[i].insert(h+1);
}
while(q--){
cin>>x>>y;
auto idl=hh[x].lower_bound(y),idll=idl;
--idll;
auto idh=ll[y].lower_bound(x),idhh=idh;
--idhh;
if(*idl==y){
ans--;
hh[x].erase(y);
ll[y].erase(x);
continue;
}
else{
if(*idhh!=0){
ans--;
int z=*idhh;
hh[z].erase(y);
ll[y].erase(z);
}
if(*idh!=h+1){
ans--;
int z=*idh;
hh[z].erase(y);
ll[y].erase(z);
}
if(*idll!=0){
ans--;
int z=*idll;
ll[z].erase(x);
hh[x].erase(z);
}
if(*idl!=l+1){
ans--;
int z=*idl;
ll[z].erase(x);
hh[x].erase(z);
}
}
}
printf("%d",ans);
}
e: