27分求调,思路清晰,马蜂良好
查看原帖
27分求调,思路清晰,马蜂良好
768530
Expert_Dream楼主2023/9/30 18:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=1e5+5;
int rp;
int a[5*N];//记录的是函数为k得直线,需要减rp
set<int> s[5*N];
signed main(){
	cin >> n;
	int ac=0;//为直线总数
	while(n--){
		int op,k,b;
		scanf("%lld%lld%lld",&op,&k,&b);
		if(op==1){
			if(a[k+N] < rp) a[k+N] = rp;
			a[k+N]++;
			s[k+N].insert(b+rp+N);
			ac++;
//			cout<<"--1ok\n";
		}else if(op==2){
//			cout<<"------";
			cout<<max(ac-max(a[k+N]-rp,0ll) ,0ll)<<"\n";
//			cout<<"--2ok\n";
		}else{
			rp += 2*N+5;
			a[k+N] = max(a[k+N] + 2*N+5,rp);
//			if(!s[k+N].size()) {
//				ac=0;
//				continue;
//			}
			auto l = s[k+N].lower_bound(rp-2*N-5);
//			if(l == s[k+N].end()) continue;
			s[k+N].erase(s[k+N].begin(),l);
//			if(!s[k+N].size()) continue;
//			cout<<s[k+N].size()<<" "<<rp;
			queue<int> q;
			if(s[k+N].size())for(auto it:s[k+N]){
//				cout<<"y";
				if((it % (2*N+5)) != N+b){
//					cout<<" "<<N+b<<" ";
//					cout<<"x";
					q.push(it+2*N+5);
				}
				s[k+N].erase(it);
				if(!s[k+N].size()) break;
//				cout<<it%(2*N);
			}
			while(!q.empty()){
				s[k+N].insert(q.front());
				q.pop();
			}
//			cout<<"z";
			a[k+N] = ac = s[k+N].size();
//			cout<<"--3ok\n";
		}
	}
	
	return 0;
}

2023/9/30 18:16
加载中...