求条+求hack
查看原帖
求条+求hack
774876
HashHacker_Peas楼主2025/7/24 19:17

rt,除hack外其他全WA,有大佬能帮看一下吗?悬1关

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
const int maxn=1e6+10;
int q,n,l,r,bit[maxn],ans;
struct node{
    int val,id;
}a[maxn];
struct line{
    int l,r;
};
struct ques{
    int l,r,id;
};
vector<ques>qu;
vector<line>g;
bool cmp(node a,node b){
    return a.val<b.val;
}
bool cmp2(line a,line b){
    if(a.r!=b.r)
        return a.r<b.r;
    return a.l<b.l;
}
bool cmp3(ques a,ques b){
    if(a.r!=b.r)
        return a.r<b.r;
    return a.l<b.l;
}
void update(int x,int v){
    while(x<=n)
        bit[x]+=v,x+=lowbit(x);
}
int query(int x){
    int ans=0;
    while(x)
        ans+=bit[x],x-=lowbit(x);
    return ans;
}
void add(int x,int y){
    int l=min(a[x].id,a[y].id),r=max(a[x].id,a[y].id);
    g.push_back({x,y});
}
signed main(){
    scanf("%lld%lld",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i].val),a[i].id=i;
    sort(a+1,a+1+n,cmp);
    a[0].val=LONG_LONG_MIN,a[n+1].val=LONG_LONG_MAX;
    for(int i=1;i<=n;i++){
        if(i==1){
            add(i,i+1);
            continue;
        }
        if(i==n){
            add(i,i-1);
            continue;
        }
        if(abs(a[i].val-a[i-1].val)<abs(a[i+1].val-a[i].val))
            add(i,i-1);
        else if(abs(a[i].val-a[i-1].val)>abs(a[i+1].val-a[i].val))
            add(i,i+1);
        else add(i,i+1),add(i,i-1);
    }
    for(int i=1;i<=q;i++){
        scanf("%lld%lld",&l,&r);
        qu.push_back({l,r,i});
    }
    sort(qu.begin(),qu.end(),cmp3);
    sort(g.begin(),g.end(),cmp2);
    int idx=0;
    for(int i=0;i<qu.size();i++){
        while(g[idx].r<=qu[i].r&&idx<g.size())
            update(g[idx++].l,1);
        ans+=qu[i].id*(query(qu[i].r)-query(qu[i].l-1));
    }
    printf("%lld",ans);
    return 0;
}
2025/7/24 19:17
加载中...