WA 0求调 悬关
查看原帖
WA 0求调 悬关
590600
Kreado楼主2024/7/30 15:53

ppp

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=1e6+7;
int n,Q;
ll ans[Maxn];
struct ques{
    int l,id;
};
vector<ques>q[Maxn];
int lst[Maxn];
int a[Maxn];

struct TREE{
    int l,r;
    int val;
	int tag,cnt,add;
	ll sm;
}tree[Maxn<<2];

inline void pushup(int node){
    tree[node].sm=tree[node<<1].sm+tree[node<<1|1].sm;
    tree[node].val=tree[node<<1].val+tree[node<<1|1].val;
}
void buildtree(int node,int l,int r){
	tree[node].l=l,tree[node].r=r;
    if(l==r) return ;
    int mid=l+r>>1;
    buildtree(node<<1,l,mid);
    buildtree(node<<1|1,mid+1,r);
    pushup(node);
}
inline void spread(int node,int vk,int ct,int ad){
    tree[node].tag^=vk;
	tree[node].cnt+=ct;
	tree[node].add+=ad;
	int bc=tree[node].val,th=tree[node].r-tree[node].l+1-tree[node].val;
    if(vk) tree[node].val=th;
    tree[node].sm+=1ll*th*((ct+1)/2);
	tree[node].sm+=1ll*bc*(ct-(ct+1)/2);
	tree[node].sm+=1ll*ad*bc;
}
inline void pushdown(int node){
    spread(node<<1,tree[node].tag,tree[node].cnt,tree[node].add);
    spread(node<<1|1,tree[node].tag,tree[node].cnt,tree[node].add);
    tree[node].tag=0;
	tree[node].cnt=0;
	tree[node].add=0;
}
void modify(int node,int l,int r,int tag,int cnt,int add){
    if(tree[node].l>=l and tree[node].r<=r){
        spread(node,tag,cnt,add);
        return ;
    }
    pushdown(node);
    int mid=tree[node].l+tree[node].r>>1;
    if(l<=mid) modify(node<<1,l,r,tag,cnt,add);
    if(r>mid) modify(node<<1|1,l,r,tag,cnt,add);
    pushup(node);
}
ll query(int node,int l,int r){
    if(tree[node].l>=l and tree[node].r<=r) return tree[node].sm;
    pushdown(node);
    int mid=tree[node].l+tree[node].r>>1;
	ll ret=0;
    if(l<=mid) ret=ret+query(node<<1,l,r);
    if(r>mid) ret=ret+query(node<<1|1,l,r);
    return ret;
}

int main(){
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&Q);
    for(int i=1;i<=Q;i++){
        int l,r;
        scanf("%d%d",&l,&r);
        q[r].emplace_back((ques){l,i});
    }
    buildtree(1,1,n);

    for(int i=1;i<=n;i++){
        modify(1,lst[a[i]]+1,i,1,1,0);
		if(lst[a[i]]) modify(1,1,lst[a[i]],0,0,1);
		
        for(auto [j,id]:q[i]) ans[id]=query(1,j,i);
        
		// cout<<"modfiy "<<lst[a[i]]+1<<" "<<i<<endl;
		// for(int j=1;j<=n;j++) cout<<"now "<<j<<" "<<query(1,j,j)<<endl;
		lst[a[i]]=i;
    }
    for(int i=1;i<=Q;i++) printf("%lld\n",ans[i]);

    return 0;
}
/*
5
2 3 5 1 5
5
2 3
1 1
1 3
2 5
2 4
*/
2024/7/30 15:53
加载中...