NC235267. 星球大战
描述
输入描述
第一行输入两个整数和,分别表示外星人基地的数量和派出的星际战舰的数量。
接下来的行,每行两个整数和表示外星人基地的坐标。
接下来的行,每行两个整数和表示星际战舰的状态,表示星际战舰将摧毁直线上的所有外星人基地,则是直线。
输出描述
输出行,每行一个整数表示这次攻击中被摧毁的外星人基地数量。
示例1
输入:
3 2 1 2 1 3 2 3 0 1 1 3
输出:
2 1
C++(g++ 7.5.0) 解法, 执行用时: 593ms, 内存消耗: 13516K, 提交时间: 2022-08-21 12:01:19
#include<bits/stdc++.h> using namespace std; map<int,int>mx,my; const int N=1e5+5; int x[N],y[N]; int ans[N]; int main() { int m,n; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>x[i]>>y[i]; } int a,b; for(int i=1;i<=m;i++) { cin>>a>>b; if(a==0) { if(mx[b]==0) mx[b]=i;// key=b value=i } else { if(my[b]==0) my[b]=i; } } for(int i=1;i<=n;i++) { int nx=mx[x[i]],ny=my[y[i]]; if(nx==0||ny==0) { if(nx!=0) ans[mx[x[i]]]++; else if(ny!=0) ans[my[y[i]]]++; } else { if(mx[x[i]]<my[y[i]]) ans[mx[x[i]]]++; else ans[my[y[i]]]++; } } for(int i=1;i<=m;i++) cout<<ans[i]<<endl; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 1101ms, 内存消耗: 29692K, 提交时间: 2023-01-12 21:43:26
#include<bits/stdc++.h> using namespace std; map<int ,list<int>>x_y,y_x; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n,m;cin>>n>>m; int x,y; for(int i=0;i<n;i++){ cin>>x>>y; x_y[x].push_back(y); y_x[y].push_back(x); } int c,d; while(m--){ cin>>c>>d; if(c==0){ cout<<x_y[d].size()<<endl; for(auto s:x_y[d]) { y_x[s].remove(d); } x_y[d].clear(); } else{ cout<<y_x[d].size()<<endl; for(auto s:y_x[d]) { x_y[s].remove(d); } y_x[d].clear(); } } return 0; }