QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#212936#6134. Soldier GameRDFZchenyyWA 647ms18216kbC++141.9kb2023-10-13 23:21:222023-10-13 23:21:22

Judging History

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

  • [2023-10-13 23:21:22]
  • 评测
  • 测评结果:WA
  • 用时:647ms
  • 内存:18216kb
  • [2023-10-13 23:21:22]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

#define MAXN 100005
#define ls (id<<1)
#define rs (id<<1)|1

#define MOD 998244353

struct Mat{
	long long a[2][2];
	
	Mat operator*(const Mat& y)const{
		Mat ret;
		ret.a[0][0]=(a[0][0]*y.a[0][0]+a[0][1]*y.a[1][0])%MOD;
		ret.a[0][1]=(a[0][0]*y.a[0][1]+a[0][1]*y.a[1][1])%MOD;
		ret.a[1][0]=(a[1][0]*y.a[0][0]+a[1][1]*y.a[1][0])%MOD;
		ret.a[1][1]=(a[1][0]*y.a[0][1]+a[1][1]*y.a[1][1])%MOD;
		return ret;		
	} 
};
Mat t[MAXN<<2];

struct Cat{
	int num,typ;
	long long sum;
};
Cat c[MAXN<<1];

int n;
long long ans=1e18;
long long a[MAXN];

bool cmp(Cat a,Cat b){
	return a.sum<b.sum;
}

void update(int id){
	t[id]=t[ls]*t[rs];
	
	return;
}

void build(int id,int l,int r){
	if(l==r){
		t[id].a[0][1]=1;
		t[id].a[0][0]=0;
		t[id].a[1][1]=0;
		t[id].a[1][0]=0;
		return;
	}
	
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(id);
	
	return;
}

void change(int id,int l,int r,int ti,int typ,int val){
	if(l==r){
		t[id].a[typ][0]+=val;
		return;
	}
	
	int mid=(l+r)>>1;
	if(ti<=mid){
		change(ls,l,mid,ti,typ,val);
	}else{
		change(rs,mid+1,r,ti,typ,val);
	}
	update(id);
	
	return;
}

long long query(){
	return t[1].a[0][0];
}

bool ok(){
	return query()!=0;
}

int run(){
	ans=1e18;
	
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		c[i].typ=0;
		c[i].num=i;
		c[i].sum=a[i];
		if(i!=1){
			c[i+n-1].typ=1;
			c[i+n-1].num=i;
			c[i+n-1].sum=a[i]+a[i-1];
		}
	}	
	stable_sort(c+1,c+n*2,cmp);
	build(1,1,n);
	for(int nl=1,nr=0;nl<=n;nl++){
		while((!ok())&&(nr<=2*n-2)){
			nr++;
			change(1,1,n,c[nr].num,c[nr].typ,1);
		}
		if(ok()){
			// cntans
			ans=min(ans,c[nr].sum-c[nl].sum);
		}
		change(1,1,n,c[nl].num,c[nl].typ,-1);
	}
	printf("%lld\n",ans);
	
	return 0;
}

int T;
int main(){
	scanf("%d",&T);
	for(int i=1;i<=T;i++){
		run();
	}
	
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 7824kb

input:

3
5
-1 4 2 1 1
4
1 3 2 4
1
7

output:

1
2
0

result:

ok 3 number(s): "1 2 0"

Test #2:

score: -100
Wrong Answer
time: 647ms
memory: 18216kb

input:

10010
1
1000000000
1
-1000000000
2
1000000000 -1000000000
4
1000000000 1000000000 -1000000000 -1000000000
3
100 -100 100
16
-17 91 -19 66 100 -70 -71 76 -58 99 52 19 25 -67 -63 -32
7
-95 -26 63 -55 -19 77 -100
17
-100 72 -53 -32 8 -100 53 44 -100 -65 -81 -59 100 100 57 -47 1
11
99 10 -100 3 32 2 -26...

output:

0
0
0
2000000000
100
135
103
181
189
84
63
164
176
0
147
135
152
36
200
131
134
0
136
0
72
171
146
0
183
77
176
89
200
135
38
109
119
126
158
189
70
0
38
999804364
188
161
0
116
116
200
0
101
200
39
0
183
139
0
183
107
139
0
178
85993
126
153
168
163
96
53
96
52
126
47
130
79
24
123
188
173
33
0
83
...

result:

wrong answer 77th numbers differ - expected: '0', found: '24'