QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#22578 | #2849. 弗雷兹的玩具商店 | lindongli2004# | RE | 0ms | 11792kb | C++14 | 2.5kb | 2022-03-09 21:54:18 | 2022-04-30 01:24:03 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define int long long
const int M=63,N=1002021;
typedef pair<int,int> PII;
int n,m,blo;
int bl[N],val[N],c[N],tagw[N],tagc[N],f[N],q[N/200][M],_q[M];
bool cmp(const PII &x,const PII &y){return x>y;};
void remake(int x){
int L=(x-1)*blo+1,R=min(n,x*blo),top=0;
for(int i=1;i<=m;i++)q[x][i]=-2e9;
for(int i=L;i<=R;i++){
val[i]+=tagw[x],c[i]=(c[i]-1+tagc[x])%m+1;
q[x][c[i]]=max(q[x][c[i]],val[i]);
}
}
void changec(int l,int r,int ad){
for(int i=l;i<=min(r,bl[l]*blo);i++)
c[i]=(c[i]-1+ad)%m+1;
remake(bl[l]);
if(bl[l]!=bl[r]){
for(int i=(bl[r]-1)*blo+1;i<=r;i++)
c[i]=(c[i]-1+ad)%m+1;
remake(bl[r]);
}
for(int i=bl[l]+1;i<bl[r];i++)
tagc[i]+=ad;
}
void changew(int l,int r,int ad){
for(int i=l;i<=min(r,bl[l]*blo);i++)val[i]+=ad;
remake(bl[l]);
if(bl[l]!=bl[r]){
for(int i=(bl[r]-1)*blo+1;i<=r;i++)val[i]+=ad;
remake(bl[r]);
}
for(int i=bl[l]+1;i<bl[r];i++)
tagc[i]+=ad;
}
void print(int x){
if(x>9)print(x/10);
putchar(x%10+'0');
}
void push(int x,int c){
_q[c]=max(_q[c],x);
}
void solve(int l,int r){
for(int i=1;i<=m;i++)_q[i]=-2e9;
for(int i=l;i<=min(r,bl[l]*blo);i++)
push(val[i]+tagw[bl[l]],(c[i]+tagc[bl[l]]-1)%m+1);
if(bl[l]!=bl[r]){
for(int i=(bl[r]-1)*blo+1;i<=r;i++)
push(val[i]+tagw[bl[r]],(c[i]+tagc[bl[r]]-1)%m+1);
}
for(int i=bl[l]+1;i<bl[r];i++){
int ad=tagc[i];
for(int j=1;j<=m;j++)
push(q[i][j],(j+ad-1)%m+1);
}
for(int i=0;i<=m;i++)f[i]=0;
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j++)
f[j]=max(f[j],f[j-i]+_q[i]);
}
int ans1=0,ans2=0;
for(int i=1;i<=m;i++){
// cout<<"f["<<i<<"]="<<f[i]<<endl;
ans1+=f[i],ans2^=f[i];
}
print(ans1); putchar(' ');
print(ans2); putchar('\n');
}
int read(){
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
#undef int
int main()
{
#define int long long
n=read(); m=read(); blo=2000;
for(int i=1;i<=n;i++)c[i]=read();
for(int i=1;i<=n;i++)val[i]=read();
for(int i=1;i<=n;i++)bl[i]=(i-1)/blo+1;
for(int i=1;i<=bl[n];i++)remake(i);
int aq=read();
while(aq--){
int op=read(),l=read(),r=read();
if(op==1)changec(l,r,read());
if(op==2)changew(l,r,read());
if(op==3)solve(l,r);
}
return 0;
}
/*
4 10
1 6 10 2
100 2333 666 300
7
3 1 4
3 1 3
1 2 4 1
3 1 4
2 2 3 -1000
2 2 3 -600
3 2 4
*/
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 11792kb
input:
4 10 1 6 10 2 100 2333 666 300 7 3 1 4 3 1 3 1 2 4 1 3 1 4 2 2 3 -1000 2 2 3 -600 3 2 4
output:
15165 2865 14165 2169 36630 798 4899 1273
result:
ok 4 lines
Test #2:
score: -100
Runtime Error
input:
200000 60 21 16 58 5 26 44 30 40 31 27 50 21 59 50 37 39 26 9 15 14 9 59 40 29 32 5 2 25 57 18 4 9 25 1 13 42 36 34 21 6 53 2 18 51 51 55 29 17 3 36 22 11 26 1 40 58 57 33 22 53 42 26 1 6 18 6 47 54 31 59 51 23 60 1 13 43 55 34 59 49 9 12 51 34 4 22 31 1 47 45 45 28 10 38 34 19 35 12 4 5 11 47 28 2 ...