树状数组全WA求调!
查看原帖
树状数组全WA求调!
550074
cloudemakers楼主2023/4/14 12:32
#include<bits/stdc++.h>
#define maxn 300050
#define ll long long
using namespace std;
struct node{
    ll l,r,num;
}; 
struct opp{
    ll L,R;
}anss[maxn];
bool operator<(node fir,node sec){
    return sec.r<=fir.r;
}
bool cmp(opp fir,opp sec){
    return fir.R<sec.R;
}
priority_queue<node> q;
ll n,m,a[maxn],l,r,aa[maxn],cont=1,l2,r2,ans,c[maxn]; 
ll tott=0;
//idx是下标: 
map<ll,ll> idx;
ll lowbit(ll op){return op&-op;}
void init(){
    //初始化代码十分冗长 简单来说
    //就是把每个配对都按照左边点比右边点小的顺序加入优先队列
    //当然第一个和最后一个要特判 
    if (n==1){
        cout<<0;
        exit(0);
    }
    for (ll i=2;i<n;i++){
        ll inde=idx[a[i]];
        if (abs(a[i]-a[i-1])==abs(a[i+1]-a[i])){
            ll minn=min(idx[a[i]],idx[a[i-1]]);
            ll maxx=max(idx[a[i]],idx[a[i-1]]);
            node in1={minn,maxx,cont++};
            q.push(in1);
            minn=min(idx[a[i]],idx[a[i+1]]);
            maxx=max(idx[a[i]],idx[a[i+1]]);
            node in2={minn,maxx,cont++};
            q.push(in2);
        }
        else{
            if (abs(a[i]-a[i-1])<abs(a[i+1]-a[i])){
                //i-1更近
                ll minn=min(idx[a[i]],idx[a[i-1]]);
                ll maxx=max(idx[a[i]],idx[a[i-1]]);
                node in={minn,maxx,cont++}; 
                q.push(in);
            } 
            else{
                ll minn=min(idx[a[i]],idx[a[i+1]]);
                ll maxx=max(idx[a[i]],idx[a[i+1]]);
                node in={minn,maxx,cont++};
                q.push(in);
            }
        }
    }
    ll minn1=min(idx[a[1]],idx[a[2]]);
    ll maxx1=max(idx[a[1]],idx[a[2]]);
    node in1={minn1,maxx1,cont++};
    q.push(in1);
    ll minn2=min(idx[a[n]],idx[a[n-1]]);
    ll maxx2=max(idx[a[n]],idx[a[n-1]]);
    node in2={minn2,maxx2,cont++};
    q.push(in2);
    return ;
}
void inser(ll le){
    for (ll i=le;i<=n;i+=lowbit(i)) c[i]++;
    return ;
}
ll query(ll le){
    ll tot=0;
    for (ll i=le-1;i>0;i-=lowbit(i)) tot+=c[i]; 
    return tot;
}
ll solve(ll le,ll ri){
    while (!q.empty()){
        node tem=q.top();
        if (tem.r>ri) break;
        inser(tem.l);
        q.pop();
        tott++;
    }
    return tott-query(le);
}
int main(){
    scanf("%lld%lld",&n,&m);
    for (int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        idx[a[i]]=i;
        aa[i]=a[i];
    }
    sort(a,a+1+n);
    init();
    for (int i=1;i<=m;i++){
        scanf("%lld%lld",&l2,&r2);
        anss[i].L=l2;
        anss[i].R=r2;
    }
    sort(anss,anss+1+m,cmp);
    for (int i=1;i<=m;i++){
        ans+=i*solve(anss[i].L,anss[i].R);
    }
    printf("%lld",ans);
}
2023/4/14 12:32
加载中...