20pts求调(hack数据AC)
查看原帖
20pts求调(hack数据AC)
252549
Iwara楼主2024/3/2 10:49

RT

#include<bits/stdc++.h>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
#define int long long
const ll MAXN=7e5+5;
ll T;
ll n,m,q,x,y;
struct node{
	pair<ll,ll> p1,p2;
	ll tp;
}t[MAXN],tmp[MAXN];
ll cnt;
bool cmp_merge(node n1,node n2){
	if(n1.tp!=n2.tp)return n1.tp<n2.tp;
	if(n1.tp==1){
		if(n1.p1.second!=n2.p1.second)return n1.p1.second<n2.p1.second;
		else{
			if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
			else return n1.p2.first>n2.p2.first;
		}
	}
	else if(n1.tp==2){
		if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
		else{
			if(n1.p1.second!=n2.p1.second)return n1.p1.second<n2.p1.second;
			else return n1.p2.second>n2.p2.second;
		}
	}
	else{
		if(n1.p1.first-n1.p1.second!=n2.p1.first-n2.p1.second)return n1.p1.first-n1.p1.second<n2.p1.first-n2.p1.second;
		else{
			if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
			else return n1.p2.first>n2.p2.first;
		}
	}
}
bool cmp_y(node n1,node n2){
	return n1.p1.second<n2.p1.second;
}
map<pair<ll,ll>,bool> mp_cross;
map<ll,vector<ll> > add_p,del_p;
ll len,cross;
map<ll,ll> tree;
ll lowbit(ll num){
	return num&(-num);
}
void update(ll k,ll num){
	while(k<=n){
		tree[k]+=num;
		k+=lowbit(k);
	}
	return;
}
ll Q(ll num){
	ll ans=0;
	while(num){
		ans+=tree[num];
		num-=lowbit(num);
	}
	return ans;
}
signed main(){
	cin>>T;
	cin>>n>>m>>q;
	for(int i=1;i<=q;i++){
		cin>>t[i].tp>>x>>y;
		t[i].p1=make_pair(x,y);
		cin>>x>>y;
		t[i].p2=make_pair(x,y);
	}
	sort(t+1,t+1+q,cmp_merge);
//	cout<<endl;
//	for(int i=1;i<=q;i++)cout<<t[i].tp<<" "<<t[i].p1.first<<" "<<t[i].p1.second<<" "<<t[i].p2.first<<" "<<t[i].p2.second<<'\n'; 
//	cout<<endl;
	ll pos=2;
	for(;pos<=q&&t[pos].tp==1;pos++){
		if(t[pos].p1.second!=t[pos-1].p1.second)continue;
		if(t[pos-1].p2.first>=t[pos].p1.first-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.first>t[pos].p2.first?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
	}
	pos++;
	for(;pos<=q&&t[pos].tp==2;pos++){
		if(t[pos].p1.first!=t[pos-1].p1.first)continue;
		if(t[pos-1].p2.second>=t[pos].p1.second-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.second>t[pos].p2.second?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
	}
	pos++;
	for(;pos<=q&&t[pos].tp==3;pos++){
		if(t[pos].p1.first-t[pos].p1.second!=t[pos-1].p1.first-t[pos-1].p1.second)continue;
		if(t[pos-1].p2.first>=t[pos].p1.first-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.first>t[pos].p2.first?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
	}
	for(int i=1;i<=q;i++)if(t[i].tp)tmp[++cnt]=t[i];
	//debug
//	for(int i=1;i<=cnt;i++)cout<<tmp[i].tp<<" "<<tmp[i].p1.first<<" "<<tmp[i].p1.second<<" "<<tmp[i].p2.first<<" "<<tmp[i].p2.second<<'\n'; 
	//debug 
	pos=cnt;
	for(;pos>=1&&tmp[pos].tp==3;pos--){
		for(int i=1;i<=cnt&&tmp[i].tp!=3;i++){
			if(tmp[i].tp==1){
				if(tmp[i].p1.second<min(tmp[pos].p1.second,tmp[pos].p2.second)||tmp[i].p1.second>max(tmp[pos].p1.second,tmp[pos].p2.second))continue;
				if(tmp[pos].p1.second<=tmp[pos].p2.second){
					ll delta=tmp[i].p1.second-tmp[pos].p1.second;
					ll p_x=tmp[pos].p1.first+delta;
					if(p_x>=tmp[i].p1.first&&p_x<=tmp[i].p2.first){
						if(!mp_cross[make_pair(p_x,tmp[i].p1.second)])mp_cross[make_pair(p_x,tmp[i].p1.second)]=1;
					}
				}
				else{
					ll delta=tmp[i].p1.second-tmp[pos].p1.second;
					delta=-delta;
					ll p_x=tmp[pos].p1.first+delta;
					if(p_x>=tmp[i].p1.first&&p_x<=tmp[i].p2.first){
						if(!mp_cross[make_pair(p_x,tmp[i].p1.second)])mp_cross[make_pair(p_x,tmp[i].p1.second)]=1;
					}
				}
			}
			else{
				if(tmp[i].p1.first<min(tmp[pos].p1.first,tmp[pos].p2.first)||tmp[i].p1.first>max(tmp[pos].p1.first,tmp[pos].p2.first))continue;
				if(tmp[pos].p1.second<=tmp[pos].p2.second){
					ll delta=tmp[i].p1.first-tmp[pos].p1.first;
					ll p_y=tmp[pos].p1.second+delta;
					if(p_y>=tmp[i].p1.second&&p_y<=tmp[i].p2.second)mp_cross[make_pair(tmp[i].p1.first,p_y)]=1;
				}
				else{
					ll delta=tmp[i].p1.first-tmp[pos].p1.first;
					delta=-delta;
					ll p_y=tmp[pos].p1.second+delta;
					if(p_y>=tmp[i].p1.second&&p_y<=tmp[i].p2.second)mp_cross[make_pair(tmp[i].p1.first,p_y)]=1;
				}
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		if(tmp[i].tp&1)len+=tmp[i].p2.first-tmp[i].p1.first+1;
		else len+=tmp[i].p2.second-tmp[i].p1.second+1;
	}
	len-=mp_cross.size();
//	cout<<"len: "<<len<<endl;
	for(;pos>=1&&tmp[pos].tp==2;pos--){
		add_p[tmp[pos].p1.second].push_back(tmp[pos].p1.first);
		del_p[tmp[pos].p2.second+1].push_back(tmp[pos].p1.first);
	}
//	cout<<"pos: "<<pos<<endl;
	for(int i=1,j;i<=pos;i=j+1){
		j=i;
		while(j<=pos&&tmp[j].p1.second==tmp[i].p1.second)j++;
		j--;
		for(ll x:add_p[tmp[i].p1.second])update(x,1);
		for(ll x:del_p[tmp[i].p1.second])update(x,-1);
		for(int k=i;k<=j;k++)cross+=Q(tmp[k].p2.first)-Q(tmp[k].p1.first-1);
	}
//	cout<<"len: "<<len<<endl;
//	cout<<"cross: "<<cross<<endl;
	cout<<len-cross;
	return 0;
} 
2024/3/2 10:49
加载中...