蒟蒻求助莫队
查看原帖
蒟蒻求助莫队
220824
yyz1005楼主2023/3/8 09:46

WA on #11

ca[i+n+1] 记录 a[i]+kca[i+2*n+2] 记录 a[i]-k,ca[0] = 0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 100010;
ll n,k,t[N],a[N],b[N],ca[N];
ll q,cur = 0;
ll tot[N],res[N];
ll BelSize;
#define bel(x) (x/BelSize) 
struct question{
    ll id;
    ll ql;
    ll qr;
    bool operator <(const question &b) const{
        return bel(ql)==bel(b.ql)?qr<b.qr:bel(ql)<bel(b.ql);
    }
} Q[N];
void add(ll x,bool dex){
	
	if(dex) cur = cur+tot[ca[x+2*n+2]];
	else cur = cur+tot[ca[x+n+1]];
	tot[ca[x]]++;
}
void del(ll x,bool dex){
	tot[ca[x]]--;
	if(dex) cur = cur-tot[ca[x+2*n+2]];
	else cur = cur-tot[ca[x+n+1]];
}
int main(){
	scanf("%lld%lld",&n,&k);
    BelSize = (ll)(sqrt(n));
	for(ll i = 1; i <= n; i++) scanf("%lld",&t[i]);
	for(ll i = 1; i <= n; i++){
		scanf("%lld",&a[i]);
		if(t[i]==2) a[i] = -a[i];
	}
	a[0] = 0;
	for(ll i = 1; i <= n; i++) a[i] = a[i-1]+a[i];
	for(ll i = 0; i <= n; i++) b[i] = ca[i] = a[i];
	for(ll i = n+1; i <= 2*n+1; i++){
		ca[i] = ca[i-n-1]+k;
		ca[i+n+1] = ca[i-n-1]-k;
		b[i] = ca[i];
		b[i+n+1] = ca[i+n+1];
	}
	sort(b,b+(3*n+2)+1);
	ll len = unique(b,b+(3*n+2)+1)-b;
	
	for(ll i = 0; i <= (3*n+2); i++){
		ca[i] = lower_bound(b,b+len+1,ca[i])-b;
	}
	scanf("%lld",&q);
	for(ll i = 1; i <= q; i++){
		scanf("%lld%lld",&Q[i].ql,&Q[i].qr);
		Q[i].ql--;
		Q[i].id = i;
	}
	sort(Q+1,Q+q+1);
	for(ll i = 1,l = 0,r = -1; i <= q; i++){
		while (l > Q[i].ql) add(--l,0);
		while (r < Q[i].qr) add(++r,1);
		while (l < Q[i].ql) del(l++,0);
		while (r > Q[i].qr) del(r--,1);
		res[Q[i].id] = cur;
	}
	for(ll i = 1; i <= q; i++) printf("%lld\n",res[i]);
	return 0;
}
2023/3/8 09:46
加载中...