QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#499302#6435. Paimon Segment TreeyangbaichWA 3ms7968kbC++143.7kb2024-07-31 11:40:392024-07-31 11:40:39

Judging History

你现在查看的是最新测评结果

  • [2024-07-31 11:40:39]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:7968kb
  • [2024-07-31 11:40:39]
  • 提交

answer

#include <bits/stdc++.h>
#define lowbit(x) (x&-x)
using namespace std;
const int MAXN=5e4+5;
const int MAXQ=5e4+5;
const int mod=1e9+7;
int n,c,q,a[MAXN],inl,inr,inx,iny,ans[MAXQ];
struct matrix{
	int x;
	int y;
	int d[4][4];
	matrix operator * (const matrix &oth) const {
		matrix re;
		re.x=x;
		re.y=oth.y;
		memset(re.d,0,sizeof re.d);
		for(int k=0;k<y;k++)
			for(int i=0;i<x;i++)
				for(int j=0;j<oth.y;j++)
					re.d[i][j]=(1ll*re.d[i][j]+1ll*d[i][k]*oth.d[k][j]%mod)%mod;
		return re;
	}
}ichi,p1,p2;
struct Node{
	int l;
	int r;
	matrix b;//长度,和,平方和,历史平方和
	matrix lzy;
}tr[MAXN<<2];
void Update(int u){
	tr[u].b.d[0][1]=(tr[u*2].b.d[0][1]+tr[u*2+1].b.d[0][1])%mod;
	tr[u].b.d[0][2]=(tr[u*2].b.d[0][2]+tr[u*2+1].b.d[0][2])%mod;
	tr[u].b.d[0][3]=((tr[u*2].b.d[0][3])%mod+tr[u*2+1].b.d[0][3])%mod;
}
void Down(int u){
	tr[u*2].lzy=tr[u*2].lzy*tr[u].lzy;
	tr[u*2+1].lzy=tr[u*2+1].lzy*tr[u].lzy;
	tr[u*2].b=tr[u*2].b*tr[u].lzy;
	tr[u*2+1].b=tr[u*2+1].b*tr[u].lzy;
	tr[u].lzy=ichi;
}
void Build(int u,int l,int r){
	tr[u].l=l;
	tr[u].r=r;
	tr[u].b.x=1;
	tr[u].b.y=4;
	memset(tr[u].b.d,0,sizeof tr[u].b.d);	
	tr[u].b.d[0][0]=r-l+1;
	tr[u].lzy=ichi;
	if(l==r){
		tr[u].b.d[0][1]=a[l];
		tr[u].b.d[0][2]=tr[u].b.d[0][3]=1ll*a[l]*a[l]%mod;
		return;
	}
	int mid=(l+r)>>1;
	Build(u*2,l,mid);
	Build(u*2+1,mid+1,r);
	Update(u);
}
void Change(int u,int cl,int cr,matrix pro){
	if(cl<=tr[u].l && tr[u].r<=cr){
		tr[u].b=tr[u].b*pro;
		tr[u].lzy=tr[u].lzy*pro;
		return;
	}
	Down(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(cl<=mid) Change(u*2,cl,cr,pro);
	if(cr>mid) Change(u*2+1,cl,cr,pro);
	Update(u);
}
int Query(int u,int ql,int qr){
//	cout<<u<<" "<<ql<<" "<<qr<<" "<<tr[u].l<<" "<<tr[u].r<<" "<<tr[u].b.d[0][3]<<" "<<tr[5].b.d[0][3]<<endl;
	if(ql<=tr[u].l && tr[u].r<=qr) return tr[u].b.d[0][3];
	Down(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	int ans=0;
	if(ql<=mid) ans=Query(u*2,ql,qr);
	if(qr>mid) ans=(ans+Query(u*2+1,ql,qr))%mod;
	return ans;
}
struct CHG{
	int cl;
	int cr;
	int cval;
}chg[MAXQ];
struct QRY{
	int ql;
	int qr;
	int qtim;
	int qid;
	int qbase;
	bool operator < (const QRY &oth) const {
		return qtim<oth.qtim;
	}
}qry[MAXQ*2];
int qcnt;
signed main(){
	ichi.x=ichi.y=p1.x=p1.y=p2.x=p2.y=4;
	ichi.d[0][0]=1,ichi.d[1][1]=1,ichi.d[2][2]=1,ichi.d[3][3]=1;
	scanf("%d%d%d",&n,&c,&q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=c;i++) scanf("%d%d%d",&chg[i].cl,&chg[i].cr,&chg[i].cval);
	Build(1,1,n);
	for(int i=1;i<=q;i++){
		scanf("%d%d%d%d",&inl,&inr,&inx,&iny);
		if(inx) qry[++qcnt]={inl,inr,inx-1,i,-1};
		qry[++qcnt]={inl,inr,iny,i,1};
	}
	sort(qry+1,qry+1+qcnt);
	int pt=1;
	while(pt<=qcnt && qry[pt].qtim==0){
//		cout<<666;
		ans[qry[pt].qid]=ans[qry[pt].qid]+qry[pt].qbase*Query(1,qry[pt].ql,qry[pt].qr);
		pt++;
	}
	for(int i=1;i<=c;i++){
		int v=chg[i].cval;
		p1.d[0][0]=p1.d[1][1]=p1.d[2][2]=p1.d[3][3]=1;
		p1.d[0][1]=v;
		p1.d[0][2]=1ll*v*v%mod;
		p1.d[0][3]=1ll*v*v%mod;
		p1.d[1][2]=2*v%mod;
		p1.d[1][3]=2*v%mod;
		p1.d[2][3]=1;
		p2.d[0][0]=p2.d[1][1]=p2.d[2][2]=p2.d[2][3]=p2.d[3][3]=1;
//		cout<<"MATRIX\n";
//		for(int j=0;j<4;j++){
//			for(int k=0;k<4;k++) printf("%d ",p1.d[j][k]);
//			printf("\n");
//		}
		Change(1,chg[i].cl,chg[i].cr,p1);
		if(chg[i].cl>1) Change(1,1,chg[i].cl-1,p2);
		if(chg[i].cr<n) Change(1,chg[i].cr+1,n,p2);
		while(pt<=qcnt && qry[pt].qtim==i){
//			cout<<"CHK"<<qry[pt].qid<<" "<< qry[pt].qbase<<" "<<Query(1,qry[pt].ql,qry[pt].qr)<<endl;
			ans[qry[pt].qid]=ans[qry[pt].qid]+qry[pt].qbase*Query(1,qry[pt].ql,qry[pt].qr);
			pt++;
		}
	}
	for(int i=1;i<=q;i++) printf("%d\n",(ans[i]+mod)%mod);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 5828kb

input:

3 1 1
8 1 6
2 3 2
2 2 0 0

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 1ms
memory: 7968kb

input:

4 3 3
2 3 2 2
1 1 6
1 3 3
1 3 6
2 2 2 3
1 4 1 3
4 4 2 3

output:

180
825
8

result:

ok 3 number(s): "180 825 8"

Test #3:

score: -100
Wrong Answer
time: 3ms
memory: 7908kb

input:

100 107 180
-280960553 266308104 -997644864 856103777 592874377 674379235 -946339772 641750362 642418716 -360811715 -555543246 206614021 358239245 349842656 983198973 807518446 -66612455 -980932737 109826132 -109676067 51226145 452115561 -42729559 -950621304 -87009773 714026474 375317493 693260053 -...

output:

400489222
480617351
531108525
254983761
446689548
-530744039
142229431
307405789
39817281
66225912
247029353
46506707
529135498
578008236
201809860
674078444
746060191
171471121
722471473
657196163
861551838
606551808
360903956
401221326
767571915
669762004
163759234
141144218
579174939
276557168
51...

result:

wrong answer 6th numbers differ - expected: '764223236', found: '-530744039'