树状数组求调,WA了后6个点
查看原帖
树状数组求调,WA了后6个点
421265
eastcloud楼主2022/6/7 16:47
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,tot;
ll tr[3000001];
ll lowbit(ll x){
	return x&(-x);
}
void add(ll x,ll k){
	while(x<=n){
		tr[x]+=k;
		x+=lowbit(x);
	}
}
ll query(ll x){
	ll ans=0;
	while(x){
		ans+=tr[x];
		x-=lowbit(x);
	}
	return ans;
}
struct q{
	ll l,r,id;
}ask[3000001];
bool cmp3(q a,q b){
	return a.r<b.r;
}
struct quer{
	ll l,r;
}pr[6006000];
bool cmp2(quer a,quer b){
	return a.r<b.r;
}
struct Node{
	ll val,id;
}num[3000001];
bool cmp(Node a,Node b){
	return a.val<b.val;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>num[i].val;
		num[i].id=i;
	}
	sort(num+1,num+n+1,cmp);
	for(ll i=1;i<=n;i++){
		if(i==1 || abs(num[i+1].val-num[i].val)<abs(num[i-1].val-num[i].val)){
			pr[++tot]=((quer){min(num[i].id,num[i+1].id),max(num[i].id,num[i+1].id)});
		} 
		else if(i==n || abs(num[i-1].val-num[i].val)<abs(num[i+1].val-num[i].val)){
			pr[++tot]=((quer){min(num[i].id,num[i-1].id),max(num[i].id,num[i-1].id)});
		}
		else if(abs(num[i-1].val-num[i].val)==abs(num[i+1].val-num[i].val)){
			pr[++tot]=((quer){min(num[i].id,num[i-1].id),max(num[i].id,num[i-1].id)});
			pr[++tot]=((quer){min(num[i].id,num[i+1].id),max(num[i].id,num[i+1].id)});
		}
	}
	sort(pr+1,pr+1+n,cmp2);
	for(ll i=1;i<=m;i++) {
		cin>>ask[i].l>>ask[i].r;
		ask[i].id=i;
	}
	sort(ask+1,ask+m+1,cmp3);
	ll aft=1,ans=0;
	for(ll i=1;i<=m;i++){
		for(;aft<=tot && pr[aft].r<=ask[i].r;aft++){
			add(1,1);
			add(pr[aft].l+1,-1);
		}
		ans+=1ll*query(ask[i].l)*ask[i].id;
	}
	cout<<ans;
    return 0;
}
2022/6/7 16:47
加载中...