WA25pts求助,有注释和调试语句,易调试
查看原帖
WA25pts求助,有注释和调试语句,易调试
169594
Heart_Of_Iron_4楼主2024/7/15 17:02

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 1145141919810//"幸运"数字
#define int long long
#define mid (l+r)/2
int m,n,t1,t2,t3,t4,maxx=-INF;
struct REQUEST//记录异或请求
{
	int x,y,z;
};
struct xy//区间
{
	int x,y;
};
bool operator <(xy qwe,xy wer)//没啥用
{
	return qwe.x<wer.x;
}
int tree[10001000],tag[10001000];//线段树
vector<int> node;//离散点,保存临时数组
vector<REQUEST> req;//记录异或请求
vector<xy> ans;//记录查询到的答案
map<int,int> mp;//映射前-》后
map<int,int> mp1;//映射后-》前
//线段树中INF代表区间内数不一致,为数代表区间内为一致的此数
void push_down(int k)
{
	tag[k*2]^=tag[k];
	tag[k*2+1]^=tag[k];
	tag[k]=0;
	if(tree[k*2]!=INF)tree[k*2]=tree[k*2]^tag[k*2];
	if(tree[k*2+1]!=INF)tree[k*2+1]=tree[k*2+1]^tag[k*2+1];
}
void push_up(int k)
{
	if(tree[k*2]==tree[k*2+1])tree[k]=tree[k*2];
	else tree[k]=INF;
}
void txor(int k,int l,int r,int ll,int rr,int xr)//区间异或
{
//	printf("%lld %lld %lld %lld %lld %lld\n",k,l,r,ll,rr,xr);
	if(l>rr||r<ll)return;
	if(l==r)
	{
		tree[k]^=xr;
		return;
	}
	if(l>=ll&&r<=rr)
	{
		if(tree[k]!=INF)tree[k]^=xr;
		tag[k]^=xr;
		return;
	}
	//printf("52\n");
	push_down(k);
	//printf("53\n");
	txor(k*2,l,mid,ll,rr,xr);
	txor(k*2+1,mid+1,r,ll,rr,xr);
//	printf("56\n");
	push_up(k);
}
void findd(int k,int l,int r)//查询答案
{
	if(l<r)
	{
		push_down(k);
		findd(k*2,l,mid);
		findd(k*2+1,mid+1,r);
		return;
	}
	if(l==r)
	{
		if(tree[k]>maxx)
		{
			maxx=tree[k];
			ans.clear();
			ans.push_back({l,k});
		}
		if(tree[k]==maxx)
		{
			ans.push_back({l,k});
		}
		return;
	}
}
signed main()
{
	scanf("%lld",&m);
	node.push_back(INF);
	node.push_back(-INF);
	for(int i=1;i<=m;++i)
	{
		scanf("%lld",&t1);
		if(t1==1)
		{
			scanf("%lld%lld%lld",&t2,&t3,&t4);
			node.push_back(t2);
			node.push_back(t3);
			req.push_back({t2,t3,t4});
		}
		if(t1==2)
		{
			scanf("%lld%lld",&t2,&t3);
			node.push_back(t2);
			node.push_back(t2+1);
			node.push_back(t2-1);
			req.push_back({t2,t2,t3});
		}
		if(t1==3)
		{
			scanf("%lld%lld",&t2,&t3);
			node.push_back(t2);
			node.push_back(t2+1);
			node.push_back(t2-1);
			req.push_back({-INF,t2-1,t3});
			req.push_back({t2+1,INF,t3});
		}
	}
	sort(node.begin(),node.end());
	n=node.size();
//	puts("");
	for(int i=0;i<n;++i)
	{
		//printf("%lld %lld\n",i+1,node[i]);
		mp[node[i]]=i+1;
		mp1[i+1]=node[i];
	}
//	puts("");
	for(auto i:req)
	{
		txor(1,1,n,mp[i.x],mp[i.y],i.z);
		//for(int j=1;j<=30;++j)
		//{
		//	printf("%lld %lld\n",j,tree[j]);
	//	}
	}
	
	findd(1,1,n);
	printf("%lld ",maxx);
	sort(ans.begin(),ans.end(),[](xy qwe,xy wer){return abs(mp1[qwe.x])<abs(mp1[wer.x]);});
	if(ans.size()>1&&abs(mp1[ans[0].x])==abs(mp1[ans[1].x]))
		printf("%lld",max(mp1[ans[0].x],mp1[ans[1].x]));
	else printf("%lld",mp1[ans[0].x]);
	return 0;
}

记录

2024/7/15 17:02
加载中...