我是胡萝啵,喜欢啵啵啵(*  ̄3)(ε ̄ *)
#include<bits/stdc++.h>using namespace std;int main(){//mp1:按x存所有基地//key=x坐标,value=(x,y)//用于处理操作c=0,即摧毁x=d这条竖线上的所有基地multimap<int,pair<int,int>>mp1;//mp2:按y存所有基地//key=y坐标,value=(x,y)//用于处理操作c=1,即摧毁y=d这条横线上的所有基地multimap<int,pair<int,int>>mp2;//mp:记录某个坐标当前还剩多少个基地//因为同一个坐标理论上可能被输入多次,所以不能只用set判重map<pair<int,int>,int>mp;int n,m;cin>>n>>m;int x,y;for(int i=1;i<=n;i++){cin>>x>>y;//把这个基地按x分类存起来//之后如果要炸x=x这条线,就能从mp1里找mp1.insert({x,{x,y}});//把这个基地按y分类存起来//之后如果要炸y=y这条线,就能从mp2里找mp2.insert({y,{x,y}});//记录该坐标基地数量+1mp[{x,y}]++;}while(m--){int s,t,ans=0;cin>>s>>t;//s==0:摧毁直线x=t上的所有基地
if(s==0){//不断在mp1里查找key=t的基地//每次find(t)都会找到一个x=t的基地while(1){auto it=mp1.find(t);//如果找不到,说明x=t这条线上的基地已经全部处理完if(it==mp1.end())break;//取出这个基地的坐标pair<int,int>p=it->second;//先把它从按x分类的容器中删掉//表示这个记录已经处理过了,之后不会再重复从mp1中取到mp1.erase(it);//如果这个坐标当前还有存活基地//说明它还没有被之前别的操作真正摧毁掉if(mp[p]>0){//本次攻击摧毁一个基地ans++;//该坐标剩余基地数-1mp[p]--;}}}//s==1:摧毁直线y=t上的所有基地else{//不断在mp2里查找key=t的基地while(1){auto it=mp2.find(t);//如果找不到,说明y=t这条线上的基地已经全部处理完if(it==mp2.end())break;//取出这个基地的坐标pair<int,int>p=it->second;//先把它从按y分类的容器中删掉mp2.erase(it);//如果这个坐标当前还有存活基地if(mp[p]>0){//本次攻击摧毁一个基地ans++;//该坐标剩余基地数-1mp[p]--;}}}//输出这次攻击摧毁的基地数量cout<<ans<<endl;}return 0;}

京公网安备 11010502036488号