1.为什么 m 取成 n/sqrt(Q) 第11个点就re了
2.为了加速想删掉del函数,但不知道为什莫这么写就寄了 ac代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#define re register
#define int long long
using namespace std;
const int N=3e5+100;
int n,Q;
struct Node{
int l,r,id;
}q[N];
struct node{
int v,id;
}a[N];
int m,belong[N];
int pre[N],nxt[N];
int pr[N],nx[N];
inline bool cmp0(node A,node B)
{
return A.v<B.v;
}
inline bool cmp(Node A,Node B)
{
return (belong[A.l] ^ belong[B.l]) ? belong[A.l] < belong[B.l] : ((belong[A.l] & 1) ? A.r < B.r : A.r > B.r);
}
int ans,now;
inline void init()
{
m=sqrt(n);
for(re int i=1;i<=n;++i) belong[i]=(i-1)/m+1,a[i].id=i;
sort(a+1,a+n+1,cmp0);
pre[a[1].id]=0,nxt[a[1].id]=a[2].id;
pre[a[n].id]=a[n-1].id,nxt[a[n].id]=n+1;
pr[a[1].id]=0,nx[a[1].id]=a[2].id;
pr[a[n].id]=a[n-1].id,nx[a[n].id]=n+1;
for(re int i=2;i<n;++i)
{
pre[a[i].id]=a[i-1].id;
nxt[a[i].id]=a[i+1].id;
pr[a[i].id]=a[i-1].id;
nx[a[i].id]=a[i+1].id;
if(a[i].v-a[i-1].v>a[i+1].v-a[i].v) pre[a[i].id]=0;
else if(a[i].v-a[i-1].v<a[i+1].v-a[i].v) nxt[a[i].id]=n+1;
}
}
int l=1,r;
/*inline void add(int x)
{
now+= ((pre[x]>=l&&pre[x]<=r) + (nxt[x]>=l&&nxt[x]<=r) + (nxt[pr[x]]==x&&pr[x]>=l&&pr[x]<=r) + (pre[nx[x]]==x&&nx[x]>=l&&nx[x]<=r)) ;
//cout<<x<<" "<<l<<" "<<r<<" "<<now<<"\n";
//cout<<x<<" "<<
}*/
inline void del(int x)
{
now-= ((pre[x]>=l&&pre[x]<=r) + (nxt[x]>=l&&nxt[x]<=r) + (nxt[pr[x]]==x&&pr[x]>=l&&pr[x]<=r) + (pre[nx[x]]==x&&nx[x]>=l&&nx[x]<=r)) ;
//cout<<x<<" "<<l<<" "<<r<<" "<<now<<" "<<pre[x]<<"\n";
}
inline int read(){char cr=getchar();int x_=0,fui=1;while(cr<48){if(cr=='-')fui=-1;cr=getchar();}while(cr>47)x_=(x_*10)+(cr^48),cr=getchar();return x_*fui;}
inline void mwrite(int aq){if(aq>9)mwrite(aq/10);putchar((aq%10)|48);}
inline void write(int af,char cr){mwrite(af<0?(putchar('-'),af=-af):af);putchar(cr);}
signed main()
{
n=read(),Q=read();
for(re int i=1;i<=n;++i) a[i].v=read();
init();
for(re int i=1;i<=Q;++i)
{
q[i].l=read(),q[i].r=read();
q[i].id=i;
}
sort(q+1,q+Q+1,cmp);
for(re int i=1;i<=Q;++i)
{
int ql=q[i].l,qr=q[i].r;
while(l>ql) now+= ((pre[--l]>=l&&pre[l]<=r) + (nxt[l]>=l&&nxt[l]<=r) + (nxt[pr[l]]==l&&pr[l]>=l&&pr[l]<=r) + (pre[nx[l]]==l&&nx[l]>=l&&nx[l]<=r)) ;
while(r<qr) now+= ((pre[++r]>=l&&pre[r]<=r) + (nxt[r]>=l&&nxt[r]<=r) + (nxt[pr[r]]==r&&pr[r]>=l&&pr[r]<=r) + (pre[nx[r]]==r&&nx[r]>=l&&nx[r]<=r)) ;
while(l<ql) del(l++);
//while(l<ql) now-= ((pre[l]>=l&&pre[l]<=r) + (nxt[l]>=l&&nxt[l]<=r) + (nxt[pr[l]]==l&&pr[l]>=l&&pr[l]<=r) + (pre[nx[l]]==l&&nx[l]>=l&&nx[l++]<=r)) ;
while(r>qr) del(r--);
ans+=now*q[i].id;
//cout<<q[i].id<<" "<<now<<"\n";
}
cout<<ans;
return 0;
}
/*
5 2
5 7 2 6 9
1 5
2 3
*/