社区讨论
求卡常,呜呜呜呜呜呜
P14638[NOIP2025] 序列询问参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mj17h0zx
- 此快照首次捕获于
- 2025/12/11 16:58 2 个月前
- 此快照最后确认于
- 2025/12/13 17:05 2 个月前
能不能卡到 ~1.7s,我在校oj过不了
CPP#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 5e4+10;
#define int register long long
ll n,Q,ct;
ll a[N],ra[N],pf[N],rpf[N];
ll lb[20],rb[20],bl[N];
ll st[16][16][N];
ll mx[N],tp[N];
inline void chk(ll &x,ll y){
x=x<y?y:x;
}
inline void sol(int l,int r){
ll q[N],h,t;
h=1,t=0;
for (int i=l; i<=n; i++){
while (h<=t && q[h]<i-r) h++;
while (h<=t && pf[q[t]]>=pf[i-l]) t--;
q[++t]=i-l;
chk(tp[i-l+1],pf[i]-pf[q[h]]);
}
h=1,t=0;
for (int i=l; i<=n; i++){
while (h<=t && q[h]<i-r) h++;
while (h<=t && rpf[q[t]]>=rpf[i-l]) t--;
q[++t]=i-l;
chk(tp[n-i+1],rpf[i]-rpf[q[h]]);
}
h=1,t=0;
for (int i=1; i<=n; i++){
while (h<=t && q[h]+l-1<i) h++;
while (h<=t && tp[q[t]]<=tp[i]) t--;
q[++t]=i;
chk(mx[i],tp[q[h]]);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
// freopen("query.in","r",stdin);
// freopen("query.out","w",stdout);
cin>>n;
for (int i=1; i<=n; i++){
cin>>a[i];
ra[i]=a[i];
}
reverse(ra+1,ra+1+n);
for (int i=1; i<=n; i++){
pf[i]=pf[i-1]+a[i];
rpf[i]=rpf[i-1]+ra[i];
}
for (int i=1; i; i++){
lb[i]=rb[i-1]+1;
rb[i]=min(n,lb[i]+lb[i]);
for (int j=lb[i]; j<=rb[i]; j++){
bl[j]=i;
}
ct=i;
if (rb[i]==n){
break;
}
}
for (int i=1; i<=ct; i++){
for (int j=1; j<=n; j++) tp[j]=mx[j]=-1e18;
sol(lb[i],rb[i]);
for (int j=1; j<=n; j++){
st[i][i][j]=mx[j];
}
}
for (int i=ct; i; i--){
for (int j=i+1; j<=ct; j++){
for (int k=1; k<=n; k++){
st[i][j][k]=max(st[i][i][k],st[i+1][j][k]);
}
}
}
cin>>Q;
while (Q--){
int l,r;
cin>>l>>r;
for (int j=1; j<=n; j++) tp[j]=mx[j]=-1e18;
if (l*2>=r){
sol(l,r);
ull ans=0;
for (int i=1; i<=n; i++){
ans^=(ull)i*mx[i];
}
cout<<ans<<"\n";
continue;
}
sol(l,rb[bl[l]]);
for (int j=1; j<=n; j++) tp[j]=-1e18;
sol(lb[bl[r]],r);
if (bl[l]+1<=bl[r]-1){
for (int i=1; i<=n; i++){
chk(mx[i],st[bl[l]+1][bl[r]-1][i]);
}
}
ull ans=0;
for (int i=1; i<=n; i++){
ans^=(ull)i*mx[i];
}
cout<<ans<<"\n";
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...