社区讨论
76分求卡常
P5046[Ynoi2019 模拟赛] Yuno loves sqrt technology I参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjp4e0di
- 此快照首次捕获于
- 2025/12/28 10:38 2 个月前
- 此快照最后确认于
- 2025/12/31 16:35 2 个月前
CPP
#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std;
namespace MYINPUT{
const int S=(1<<20)+5;char B[S],*H=B,*T=B;
inline char gc(){if(H==T) T=(H=B)+fread(B,1,S,stdin);return H==T?EOF:*H++;}
inline ll fr(){ll x=0;bool fh=0;char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-') fh=1;ch=gc();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=gc();}return fh?-x:x;}
}using MYINPUT::fr;
int n,m,sum[638][100005],lk[638],rk[638],idk[100005],num[638],g[100005][162],kuainum[638][162][162];
long long p[638][638],last;
struct node{
int id,x;
}a[100005],b[100005];
bool cmp(node s1,node s2){
return s1.x<s2.x;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
n=fr(),m=fr();
for(int i=1;i<=n;i++){
a[i].x=fr();
a[i].id=i;
b[i]=a[i];
}
int len=sqrt(n)/2,kuai=(n+len-1)/len;
// if(kuai*kuai!=n) kuai++,len++;
for(int i=1;i<=kuai;i++){
lk[i]=rk[i-1]+1,rk[i]=min(n,lk[i]+len-1);
sort(b+lk[i],b+rk[i]+1,cmp);
for(int j=lk[i];j<=rk[i];j++){
idk[j]=i;
sum[i][a[j].x]++;
}
for(int j=1;j<=n;j++){
sum[i][j]+=sum[i][j-1];
}
for(int j=1;j<=n;j++){
sum[i][j]+=sum[i-1][j];
}
for(int j=lk[i];j<=rk[i];j++){
int cnt=0;
for(int k=lk[i];k<j;k++){
if(a[k].x>a[j].x) num[i]++,cnt++;
if(a[k].x>a[j].x){
g[j][k-lk[i]+1]=g[j][k-lk[i]]+1;
}else{
g[j][k-lk[i]+1]=g[j][k-lk[i]];
}
}
}
for(int j=lk[i];j<=rk[i];j++){
for(int k=j+1;k<=rk[i];k++){
kuainum[i][j-lk[i]+1][k-lk[i]+1]=kuainum[i][j-lk[i]+1][k-lk[i]]+g[k][k-lk[i]]-g[k][j-lk[i]];
}
}
}
for(int i=1;i<=kuai;i++){
for(int j=i;j<=kuai;j++){
p[i][j]=p[i][j-1]+num[j];
for(int k=lk[j];k<=rk[j];k++){
long long t=sum[j-1][n]-sum[j-1][a[k].x]-(sum[i-1][n]-sum[i-1][a[k].x]);
p[i][j]+=t;
}
}
}
while(m--){
long long l,r;
long long ans=0;
l=fr(),r=fr();
l^=last,r^=last;
int idl=idk[l],idr=idk[r];
if(idl==idr){
ans=kuainum[idl][l-lk[idl]+1][r-lk[idr]+1];
last=ans;
cout<<ans<<endl;
continue;
}
ans=0;
if(idl+1<=idr-1){
ans=p[idl+1][idr-1];
}
ans+=kuainum[idl][l-lk[idl]+1][rk[idl]-lk[idl]+1];
ans+=kuainum[idr][1][r-lk[idr]+1];
if(idl+1<=idr-1){
for(int i=lk[idr];i<=r;i++){
ans+=sum[idr-1][n]-sum[idr-1][a[i].x]-(sum[idl][n]-sum[idl][a[i].x]);
}
for(int i=l;i<=rk[idl];i++){
ans+=sum[idr-1][a[i].x-1]-sum[idl][a[i].x-1];
}
}
int lt=lk[idr]-1,cnt=0;
for(int i=lk[idl];i<=rk[idl];i++){
if(b[i].id<l||b[i].id>r) continue;
while(lt+1<=rk[idr]){
if(b[lt+1].id<l||b[lt+1].id>r) lt++;
else if(b[lt+1].x<b[i].x){
cnt++,lt++;
}
else{
break;
}
}
ans+=cnt;
}
last=ans;
cout<<ans<<endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...