UKE 85 分是什么鬼,求调玄关
查看原帖
UKE 85 分是什么鬼,求调玄关
782904
哈哈人生楼主2024/8/13 18:18

为何此代码交上去 85 分,剩下的点全 UKE 了?(疑惑

提交记录。

代码:

#include<bits/stdc++.h>
#define int long long
#define trl tr[p].l
#define trr tr[p].r
using namespace std;
const int N=500005;
char a[N];
int n,m,op,l,r;
struct B{
	int cd,qz,hz;
};
struct xd_tree{
	struct A{
		int l,r,lz;
		int cd,qz,hz;
		int cd2,qz2,hz2;
	}tr[N<<2];
	void makelazy(int p){
		tr[p].lz=1-tr[p].lz;
		swap(tr[p].cd,tr[p].cd2),swap(tr[p].qz,tr[p].qz2),swap(tr[p].hz,tr[p].hz2);
	}
	void pushdown(int p){
		if(!tr[p].lz)return;
		makelazy(p<<1);
		makelazy(p<<1|1);
		tr[p].lz=0;
	}
	void pushup(int p){
		int tmp=min(tr[p<<1].qz,tr[p<<1|1].hz);
		tr[p].cd=tr[p<<1].cd+tr[p<<1|1].cd+2*tmp;
		tr[p].qz=tr[p<<1].qz+tr[p<<1|1].qz-tmp;
		tr[p].hz=tr[p<<1].hz+tr[p<<1|1].hz-tmp;
		tmp=min(tr[p<<1].qz2,tr[p<<1|1].hz2);
		tr[p].cd2=tr[p<<1].cd2+tr[p<<1|1].cd2+2*tmp;
		tr[p].qz2=tr[p<<1].qz2+tr[p<<1|1].qz2-tmp;
		tr[p].hz2=tr[p<<1].hz2+tr[p<<1|1].hz2-tmp;
	}
	void build(int p,int l,int r){
		trl=l,trr=r,tr[p].lz=0;
		if(l==r){
			tr[p].cd=tr[p].cd2=0;
			if(a[l]=='(')tr[p].qz=tr[p].hz2=1,tr[p].hz=tr[p].qz2=0;
			else tr[p].hz=tr[p].qz2=1,tr[p].qz=tr[p].hz2=0;
			return;
		}
		int mid=(l+r)/2;
		build(p<<1,l,mid),build(p<<1|1,mid+1,r);
		pushup(p);
	}
	void change(int p,int l,int r){
		if(l>trr||r<trl)return;
		if(l<=trl&&trr<=r){
			makelazy(p);
			return;
		}
		pushdown(p);
		change(p<<1,l,r),change(p<<1|1,l,r);
		pushup(p);
	}
	B search(int p,int l,int r){
		if(l>trr||r<trl)return {-1,-1,-1};
		if(l<=trl&&trr<=r){
			return {tr[p].cd,tr[p].qz,tr[p].hz};
		}
		pushdown(p);
		B tmp=search(p<<1,l,r),tmp2=search(p<<1|1,l,r),ret;
		if(tmp.cd==-1&&tmp2.cd==-1)return {-1,-1,-1};
		else if(tmp.cd==-1)return tmp2;
		else if(tmp2.cd==-1)return tmp;
		int tmp3=min(tmp.qz,tmp2.hz);
		ret.cd=tmp.cd+tmp2.cd+2*tmp3;
		ret.qz=tmp.qz+tmp2.qz-tmp3;
		ret.hz=tmp.hz+tmp2.hz-tmp3;
		return ret;
	}
}tr;
signed main(){
	//freopen("sample1.in","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	tr.build(1,1,n);
	cin>>m;
	while(m--){
		cin>>op>>l>>r;
		if(op==1)tr.change(1,l,r);
		else cout<<tr.search(1,l,r).cd/2<<"\n";
	}
	return 0;
}

而且我此份代码交了4次,每次分别为 85,75,80,60 分?

75分那一次还有一个点WA了。开盲盒哪。。。

本人所有提交记录。

求助,玄关。

2024/8/13 18:18
加载中...