QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#610940#6435. Paimon Segment Treeucup-team4352#WA 2ms7752kbC++233.1kb2024-10-04 18:09:542024-10-04 18:09:54

Judging History

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

  • [2024-10-04 18:09:54]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:7752kb
  • [2024-10-04 18:09:54]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=5e4+5;
int n,m,q,c[maxn];
int l,r,x,y;
struct Data{
	int l,r,x,id;
}a[maxn],Q[maxn<<1];
int cnt;
bool comp(Data A,Data B) {
	return A.x<B.x;
}
int tr[maxn<<2][4],tmp[4][4],now[4][4];
int lazy[maxn<<2][4][4];
int ans[maxn];
void add(int &x,int y) {
	x+=y;
	if(x>=mod) x-=mod;
}
void pushup(int rt) {
	for(int i=0;i<4;++i) {
		tr[rt][i]=tr[rt<<1][i]+tr[rt<<1|1][i];
		if(tr[rt][i]>=mod) tr[rt][i]-=mod;
	}
}
void build(int rt,int l,int r) {
	memcpy(lazy[rt],tmp,sizeof(tmp));
	if(l==r) {
		tr[rt][0]=1;
		tr[rt][1]=c[l];
		tr[rt][2]=tr[rt][3]=(ll)c[l]*c[l]%mod;
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
}
int kp1[4][4],kp2[4];
void qp1(int a[4][4],int b[4][4]) {
	for(int i=0;i<4;++i)
		for(int j=0;j<4;++j)
			for(int k=0;k<4;++k)
				add(kp1[i][j],(ll)a[i][k]*b[k][j]%mod);
}
void qp2(int a[4],int b[4][4]) {
	for(int j=0;j<4;++j)
		for(int k=0;k<4;++k) add(kp2[j],(ll)a[k]*b[k][j]%mod);
}
void pushdown(int rt) {
	qp1(lazy[rt<<1],lazy[rt]),qp2(tr[rt<<1],lazy[rt]);
    memcpy(lazy[rt<<1],kp1,sizeof(kp1)),memset(kp1,0,sizeof(kp1));
    memcpy(tr[rt<<1],kp2,sizeof(kp2)),memset(kp2,0,sizeof(kp2));
	qp1(lazy[rt<<1|1],lazy[rt]),qp2(tr[rt<<1|1],lazy[rt]);
    memcpy(lazy[rt<<1|1],kp1,sizeof(kp1)),memset(kp1,0,sizeof(kp1));
    memcpy(tr[rt<<1|1],kp2,sizeof(kp2)),memset(kp2,0,sizeof(kp2));
    memcpy(lazy[rt],tmp,sizeof(tmp));
}
void update(int rt,int l,int r,int L,int R) {
	if(L<=l&&R>=r) {
		qp1(lazy[rt],now),memcpy(lazy[rt],kp1,sizeof(kp1)),memset(kp1,0,sizeof(kp1));
		qp2(tr[rt],now),memcpy(tr[rt],kp2,sizeof(kp2)),memset(kp2,0,sizeof(kp2));
		return;
	}
	int mid=l+r>>1;
	pushdown(rt);
	if(L<=mid) update(rt<<1,l,mid,L,R);
	if(R>mid) update(rt<<1|1,mid+1,r,L,R);
	pushup(rt);
}
int query(int rt,int l,int r,int L,int R) {
	if(L<=l&&R>=r) return tr[rt][3];
	int mid=l+r>>1,res=0;
	pushdown(rt);
	if(L<=mid) add(res,query(rt<<1,l,mid,L,R));
	if(R>mid) add(res,query(rt<<1|1,mid+1,r,L,R));
	pushup(rt);
	return res;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>q;
    for(int i=1;i<=n;++i) cin>>c[i];
	for(int i=1;i<=m;++i) cin>>a[i].l>>a[i].r>>a[i].x;
	for(int i=1;i<=q;++i) {
		cin>>l>>r>>x>>y;
		Q[++cnt]=(Data){l,r,x-1,-i};
		Q[++cnt]=(Data){l,r,y,i};
	}
	sort(Q+1,Q+1+cnt,comp);
	int p=1;
	for(int i=0;i<4;++i)
		for(int j=0;j<4;++j) if(i==j) tmp[i][j]=now[i][j]=1;
	build(1,1,n);
	for(int i=1;i<=cnt;++i) {
        if(Q[i].x==-1) continue;
		while(p<=Q[i].x) {
			int x=a[p].x;
			now[2][3]=1;
			now[0][1]=x;
			now[1][2]=now[1][3]=(ll)x*2%mod;
			now[0][2]=now[0][3]=(ll)x*x%mod;
			update(1,1,n,a[p].l,a[p].r);
            memcpy(now,tmp,sizeof(tmp));
            now[2][3]=1;
            if(a[p].l>1) update(1,1,n,1,a[p].l-1);
            if(a[p].r<n) update(1,1,n,a[p].r+1,n);
			p++;
		}
        int x=query(1,1,n,Q[i].l,Q[i].r);
		if(Q[i].id<0) add(ans[-Q[i].id],mod-x);
		else add(ans[Q[i].id],x);
	}
	for(int i=1;i<=q;++i) cout<<ans[i]<<'\n';
	return 0;
}

详细

Test #1:

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

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: 7752kb

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: 2ms
memory: 5724kb

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:

987351470
689761459
-414722823
50845107
329834544
553383075
85911722
89922708
266494262
-833578649
247029353
-56327053
257344794
148368026
-1190393573
363800173
197574681
738700320
290691084
37449323
265209758
942371169
469782398
781694677
714256300
-240514
485620688
141144218
887778423
191270322
17...

result:

wrong answer 1st numbers differ - expected: '400489222', found: '987351470'