abc 370D
作者:
Air1222
,
2024-09-27 00:51:30
,
所有人可见
,
阅读 4
//low_bound,找不到时返回end()地址(end为最后元素的下一个位置)
//find同理,找不到返回最后一个元素的下一个位置地址
//p为迭代器(地址),转化为索引解引用即可
//set erase可删除指定元素,或者删除迭代器位置的元素,或者区间(添加迭代器收尾地址即可)
//解引用,*p,p地址的数值
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
int h,w,q;
int ans;
int main()
{
cin>>h>>w>>q;
vector<set<int>>r(h+10),c(w+10);
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
{
r[i].insert(j);
c[j].insert(i);
}
while(q--)
{
int x,y;
cin>>x>>y;
auto p=r[x].find(y);
if(p!=r[x].end())
{
r[x].erase(y);
c[y].erase(x);
}
else
{
p=r[x].lower_bound(y);
if(p!=r[x].begin())//左
{
p--;
r[x].erase(p);
c[*p].erase(x);
}
p=r[x].lower_bound(y);
if(p!=r[x].end())//右
{
r[x].erase(p);
c[*p].erase(x);
}
p=c[y].lower_bound(x);
if(p!=c[y].begin())//上
{
p--;
r[*p].erase(y);
c[y].erase(p);
}
p=c[y].lower_bound(x);
if(p!=c[y].end())//下
{
r[*p].erase(y);
c[y].erase(p);
}
//cout<<ans<<endl;
}
}
for(int i=1;i<=h;i++)
ans+=r[i].size();
cout<<ans;
return 0;
}