QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#104641#5374. 数圈Cring100 ✓1728ms13236kbC++142.7kb2023-05-11 14:39:082023-05-11 14:39:12

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-11 14:39:12]
  • 评测
  • 测评结果:100
  • 用时:1728ms
  • 内存:13236kb
  • [2023-05-11 14:39:08]
  • 提交

answer

#pragma GCC optimize(2)

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define op(x) ((x&1)?x+1:x-1)
#define odd(x) (x&1)
#define even(x) (!odd(x))
#define lc(x) (x<<1)
#define rc(x) (lc(x)|1)
#define lowbit(x) (x&-x)
#define mp(x,y) make_pair(x,y)
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
using namespace std;
const int MAXN=1e5+10;

int T,n,a[MAXN],mn;
ll S,ans,cnt,pos[MAXN],val[MAXN];
ll s[MAXN];

typedef array<ll,3> pr;
pr p[MAXN];

struct B{
	ll b[MAXN],tot;
	void init(){tot=0;}
	void add(ll x){b[++tot]=x;}
	void pr(){sort(b+1,b+1+tot);tot=unique(b+1,b+1+tot)-b-1;}
	ll qry(ll x){return lower_bound(b+1,b+1+tot,x)-b;}
}bp,bv;
struct BIT{
	ll t[MAXN],n;
	void init(ll n){
		this->n=n;
		rep(i,1,n)t[i] = 0;
	}
	void mdf(ll x,ll v){
		for(;x<=n;x+=lowbit(x))t[x] += v;
 	}
 	ll qry(ll x,ll S=0){
 		for(;x;x-=lowbit(x))S+=t[x];
 		return S;
 	}
}t;

pr arr[MAXN];
int cur;

void cdq(int L,int R){
	if(L==R)return;
	int mid=(L+R)>>1;
	cdq(L,mid);
	cdq(mid+1,R);

	cur=0;
	rep(i,L,mid)arr[++cur] = {p[i][0],-1,p[i][2]};
	rep(i,mid+1,R)arr[++cur] = {p[i][0],1,p[i][2]};
	sort(arr+1,arr+1+cur);

	rep(i,1,cur){
		if(arr[i][1] == -1)t.mdf(bv.tot-arr[i][2]+1,1);else{
			cnt += t.qry(bv.tot-arr[i][2]);
		}
	}
	rep(i,1,cur)if(arr[i][1] == -1)t.mdf(bv.tot-arr[i][2]+1,-1);
}

void solve(){
	cin>>n;S=0;mn=1e9;
	rep(i,1,n)cin>>a[i],S+=a[i],mn = min(mn,a[i]);
	if(S<0 || (S==0 && mn < 0)){
		cout<<"-1\n";
		return;
	}
	if(S==0){
		cout<<"0\n";
		return;
	}

	ans=0;
	rep(i,1,n)s[i] = s[i-1] + a[i];

	bp.init();bv.init();

	rep(i,1,n)pos[i] = (s[i] >= 0) ? (-s[i] / S) : ((-s[i] + S-1)/S),val[i] = (s[i] % S + S)%S;
	rep(i,1,n)bp.add(pos[i]),bv.add(val[i]);
	bp.pr();bv.pr();

	rep(i,1,n)p[i] = {pos[i],i,val[i]};
	
	t.init(bv.tot);

	rep(i,1,n)p[i][2] = bv.qry(val[i]);
 	rep(i,1,n){
		int cnt = (i-1) - t.qry(p[i][2]);
		ans -= cnt;
		t.mdf(p[i][2],1);
	}
	rep(i,1,n)t.mdf(p[i][2],-1);

	cnt=0;

	cdq(1,n);

	ans+=cnt*2;
	//

	rep(i,1,n)p[i][0] = pos[i],p[i][2] = bv.qry(val[i]),p[i][1] = i;

	sort(p+1,p+1+n); 
	ll preS=0;
	rep(i,1,n){
		ans += (p[i][0] * (i-1) - preS);
		preS += p[i][0];
	}

	rep(i,1,n)p[i][0] = bp.qry(p[i][0]),swap(p[i][0],p[i][2]);
	sort(p+1,p+1+n);

	t.init(bp.tot);

	for(int l=1,r;l<=n;l=r+1){
		r=l;while(r+1<=n && p[r+1][0] == p[l][0])r++;
		rep(i,l,r){
			int cnt = (i-l) - t.qry(p[i][2]);
			ans -= cnt;
			t.mdf(p[i][2],1);	
		}
		rep(i,l,r)t.mdf(p[i][2],-1);
	}
	//
	cout<<ans<<"\n";
}

int main(){
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--)solve();

    return 0;
}

详细

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 4ms
memory: 9560kb

input:

10
3
2 -9 -4
3
4 6 0
3
3 -10 0
3
7 -6 3
3
-6 7 10
3
-3 9 -2
3
6 1 -2
3
5 2 -2
3
-9 -5 7
3
-4 -5 6

output:

-1
0
-1
3
1
4
2
1
-1
-1

result:

ok 10 lines

Subtask #2:

score: 20
Accepted

Dependency #1:

100%
Accepted

Test #2:

score: 20
Accepted
time: 3ms
memory: 7532kb

input:

10
50
-5 -5 3 8 0 0 3 8 5 -7 6 -9 5 5 2 7 -9 1 -7 5 0 10 -6 -2 -6 -8 9 7 4 3 -9 9 5 9 8 1 7 0 0 -5 -1 -3 5 -7 5 -4 6 8 -1 1
50
-6 4 3 -6 -9 -8 -5 -2 -10 7 -4 1 -1 -5 2 1 -10 8 8 7 -8 -5 3 -6 10 3 2 -1 10 0 4 -6 9 3 -6 3 9 -4 4 -2 -3 4 -9 -7 7 1 5 2 -4 5
50
2 -10 5 3 -1 1 9 -1 -5 3 -2 -10 7 0 5 -5 -1...

output:

161
-1
249
-1
21873
-1
452
-1
-1
314

result:

ok 10 lines

Subtask #3:

score: 30
Accepted

Dependency #2:

100%
Accepted

Test #3:

score: 30
Accepted
time: 24ms
memory: 9764kb

input:

10
2000
-4438 -448 2902 3873 -5348 1821 -5284 2787 -1369 -4712 3298 2808 1651 -4568 4377 870 2217 -2683 1217 120 -3854 1156 -2129 -3757 -2704 3026 -1745 -5327 -1315 405 3944 340 -1510 2213 -24 -32 -5414 -2330 760 3715 -4871 2831 1917 3148 1360 -3662 -4281 -1248 788 1334 -3401 2050 4174 3163 -2456 33...

output:

90206708583
9272643195
2640993721
148400379
20504656
2904294
-1
6666669000000
61998
67150

result:

ok 10 lines

Subtask #4:

score: 10
Accepted

Test #4:

score: 10
Accepted
time: 373ms
memory: 10820kb

input:

10
30000
-3879 -556 4570 1863 2815 -4010 2471 -270 2835 3071 -3331 -1251 -2243 4221 -5249 -4134 3376 1978 858 2545 -4207 386 3875 2029 1706 1119 3065 -3097 4399 4385 -3021 2473 2506 2157 3946 -886 3929 1478 2728 -4239 4091 -151 -4762 -2136 -1424 2162 -669 267 190 -1180 2640 -757 -2078 -1409 3165 216...

output:

121860198793245
46938573692959
57703965834328
59944493006183
81807878531011
49309954483988
78546660217267
113040545520897
33896072757379
62212580026212

result:

ok 10 lines

Subtask #5:

score: 10
Accepted

Dependency #4:

100%
Accepted

Test #5:

score: 10
Accepted
time: 396ms
memory: 10532kb

input:

10
30000
-2595 -3716 4165 858 -5266 -3829 811 -2088 3328 3550 4682 -4106 1810 -1775 -470 189 2599 -4024 2125 1382 2756 3173 1951 975 3411 389 4564 3431 -4952 4333 -2522 2676 2205 -105 -3087 -1781 4430 2299 4505 1113 -826 312 1429 52 -985 2395 2056 -2832 1613 -3243 3271 2772 -2816 -3652 4580 1365 123...

output:

-1
66307718106454
20087854603233
17527604892002
14265304369524
24031060577728
6589862789507
11905532141244
8996204627296
6585172490432

result:

ok 10 lines

Subtask #6:

score: 10
Accepted

Dependency #5:

100%
Accepted

Test #6:

score: 10
Accepted
time: 441ms
memory: 10508kb

input:

10
30000
-2244 -2644 2809 3538 -285 1898 -2058 -24 2091 2790 -2955 1099 -5143 1121 -3846 -999 -4595 3085 3334 -4501 -5091 358 -3560 -3527 4423 2862 4342 -2080 4525 2521 4106 -5224 1559 3007 -398 4417 -351 -5309 2315 3950 -1249 3651 -2944 -3367 3232 -1595 2952 -2194 4228 -4421 -4415 -88 -2072 3485 -1...

output:

85413029344138
4691174120217
246528544689
26919261466
816932685
45240604
-1
22499999825000000
1482487
1674097

result:

ok 10 lines

Subtask #7:

score: 10
Accepted

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Dependency #4:

100%
Accepted

Dependency #5:

100%
Accepted

Dependency #6:

100%
Accepted

Test #7:

score: 10
Accepted
time: 1728ms
memory: 13236kb

input:

10
100000
-295 3757 395 376 4467 -4688 -3479 1495 -2386 687 -1139 4137 2777 4198 2479 3744 -1902 1207 3000 -5091 1112 2776 -1673 4050 -5247 -3011 -1961 2442 -5024 3036 226 3508 2020 -1793 4283 3340 -115 2844 -3134 -847 -4850 3377 -1756 3602 4408 4043 69 -4157 -2612 3591 2041 -1034 4648 3484 -1086 12...

output:

1335845168539966
35870296157487
1936542233238
42129253701
1713350305
3538646
-1
833333331000000000
4603056
4382225

result:

ok 10 lines