样例已过 WA求调QAQ
查看原帖
样例已过 WA求调QAQ
1067741
Andyxz楼主2024/11/26 19:29
#include<iostream>
#include<cstdio>
#include<bits/stdc++.h>
#define ll long long
#define MAXN 100005
using namespace std;
unsigned ll n,m,a[MAXN],pre[MAXN<<1],cur[MAXN<<1],ans[MAXN];
struct qs{
	ll r=0,l=0,id=0;
	friend bool operator < (qs &a,qs &b){
		return a.r<b.r;
	}
}q[MAXN];

struct ts{
	ll sum=0,sux=0,tag=0,tax=0;
	friend ts operator + (ts &a,ts &b){
		ts c;
		c.sum=max(a.sum,b.sum);
		c.sux=max(a.sux,b.sux);
		return c;
	}
}t[MAXN<<2];
bool cmp(qs a,qs b){
	return a<b;
}
inline ll ls(ll x){
	return x<<1;
}
inline ll rs(ll y){
	return y<<1|1;
}
void in(){
	cin>>n;
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		pre[i]=cur[a[i]+(int)1e5];
		cur[a[i]+(int)1e5]=i;
	}
	cin>>m;
	for(ll i=1;i<=m;i++){
		scanf("%lld%lld",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+m+1);
	return;
}
inline void push_up(ll p){
	t[p]=t[rs(p)]+t[ls(p)];
}
inline void push_down(ll p){
	t[rs(p)].sux=max(t[rs(p)].sux,t[rs(p)].sum+t[p].tag);
	t[ls(p)].sux=max(t[ls(p)].sux,t[ls(p)].sum+t[p].tag);
	t[ls(p)].sum+=t[p].tag;
	t[rs(p)].sum+=t[p].tag;
	t[rs(p)].tax=max(t[rs(p)].tax,t[rs(p)].tag+t[p].tag);
	t[ls(p)].tax=max(t[ls(p)].tax,t[ls(p)].tag+t[p].tag);
	t[rs(p)].tag+=t[p].tag;
	t[ls(p)].tag+=t[p].tag;
	t[p].tag=t[p].tax=0;
	return;
}

/*void build(ll p,ll l,ll r){
	tag[p]=0;
	if(l==r){
		ans[p]=a[l];return;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}*/

inline void update(ll l1,ll r1,ll l,ll r,ll p,ll k){
	if(l1<=l&&r<=r1){
		t[p].sux=max(t[p].sum+k,t[p].sux);
		t[p].sum+=k;
		t[p].tax=max(t[p].tag+k,t[p].tax);
		t[p].tag+=k;
		return;
	}
	push_down(p);
	ll mid=(l+r)>>1;
	if(l1<=mid) update(l1,r1,l,mid,ls(p),k);
	if(r1>mid) update(l1,r1,mid+1,r,rs(p),k);
	push_up(p);
}
ll query(ll x,ll y,ll l,ll r,ll p){
	ll res=0;
	if(x<=l&&y>=r){
		return t[p].sux;
	}
	ll mid=(l+r)>>1;
	push_down(p);
	if(x<=mid) res=max(res,query(x,y,l,mid,ls(p)));
	if(y>mid) res=max(res,query(x,y,mid+1,r,rs(p)));
	return res;
}
int main(){
	ll a1,b,c,d,e,f;ll j=1;
	in();
	for(ll i=1;i<=n;i++){
		b=pre[i]+1,c=i,d=a[i];
		update(b,c,1,n,1,d);
		for(;j<=m&&q[j].r<=i;j++){
			ans[q[j].id]=query(q[j].l,q[j].r,1,n,1);
		}
	}
	for (ll i=1;i<m;i++){
		cout<<ans[i]<<endl;
	}
	cout<<ans[m];
	return 0;
}

一个个往里加叶子数据计算子线段最大值 可是WA了 :( 求调 求调

2024/11/26 19:29
加载中...