QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#602604#9242. An Easy Geometry Problemxi_xiWA 9ms12144kbC++144.0kb2024-10-01 11:08:202024-10-01 11:08:20

Judging History

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

  • [2024-10-01 11:08:20]
  • 评测
  • 测评结果:WA
  • 用时:9ms
  • 内存:12144kb
  • [2024-10-01 11:08:20]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define int long long
using namespace std;

const int maxn = 2e5 + 5;
const int base = 10;
int n, q, k, b, a[maxn];
ull pw[maxn], sum[maxn], ans[maxn];
struct node{
	struct nd{
		int l, r, laz;
		ull sum;
	}tree[maxn << 2];
	void pushup(int p){
		tree[p].sum = tree[p << 1].sum + tree[p << 1 | 1].sum; 
	}
	void build(int p, int l, int r){
		tree[p].l = l;tree[p].r = r;
		if(l == r){
			tree[p].sum = a[l] * pw[l - 1];
			return;
		}
		int mid = l + r >> 1;
		build(p << 1, l, mid);
		build(p << 1 | 1, mid + 1, r);
		pushup(p);
	}
	int len(int p){return tree[p].r - tree[p].l + 1;}
	void add(int p, int x){
		tree[p].laz += x;
		tree[p].sum += sum[len(p)] * pw[tree[p].l - 1] * x;
	}
	void pushdown(int p){
		int laz = tree[p].laz;
		if(laz){
			add(p << 1, laz);
			add(p << 1 | 1, laz);
			tree[p].laz = 0;
		}
	}
	void update(int p, int l, int r, int x){
		if(l <= tree[p].l && tree[p].r <= r){
			add(p, x);
			return;
		}
		pushdown(p);
		int mid = tree[p].l + tree[p].r >> 1;
		if(l <= mid) update(p << 1, l, r, x);
		if(mid < r) update(p << 1 | 1, l, r, x);
		pushup(p);
	}
	ull query(int p, int l, int r){
		if(l <= tree[p].l && tree[p].r <= r) return tree[p].sum;
		int mid = tree[p].l + tree[p].r >> 1;
		ull sum = 0;
		if(l <= mid) sum += query(p << 1, l, r);
		if(mid < r) sum += query(p << 1 | 1, l, r);
		return sum; 
	}
}T1;

struct node1{
	struct nd{
		int l, r, laz;
		ull sum;
	}tree[maxn << 2];
	void pushup(int p){
		tree[p].sum = tree[p << 1].sum + tree[p << 1 | 1].sum; 
	}
	void build(int p, int l, int r){
		tree[p].l = l;tree[p].r = r;
		if(l == r){
			tree[p].sum = a[l] * pw[n - l];
			return;
		}
		int mid = l + r >> 1;
		build(p << 1, l, mid);
		build(p << 1 | 1, mid + 1, r);
		pushup(p);
	}
	int len(int p){return tree[p].r - tree[p].l + 1;}
	void add(int p, int x){
		tree[p].laz += x;
		tree[p].sum += sum[len(p)] * pw[n - tree[p].r] * x;
	}
	void pushdown(int p){
		int laz = tree[p].laz;
		if(laz){
			add(p << 1, laz);
			add(p << 1 | 1, laz);
			tree[p].laz = 0;
		}
	}
	void update(int p, int l, int r, int x){
		if(l <= tree[p].l && tree[p].r <= r){
			add(p, x);
			return;
		}
		pushdown(p);
		int mid = tree[p].l + tree[p].r >> 1;
		if(l <= mid) update(p << 1, l, r, x);
		if(mid < r) update(p << 1 | 1, l, r, x);
		pushup(p);
	}
	ull query(int p, int l, int r){
		if(l <= tree[p].l && tree[p].r <= r) return tree[p].sum;
		int mid = tree[p].l + tree[p].r >> 1;
		ull sum = 0;
		if(l <= mid) sum += query(p << 1, l, r);
		if(mid < r) sum += query(p << 1 | 1, l, r);
		return sum; 
	}
}T2;

bool check(int i, int mid){
	int l = i - mid, r = i + mid;
	ull x = T1.query(1, i + 1, r) * pw[n - i + 1];
	ull y = T2.query(1, l, i - 1) * pw[i];
//	cout << T1.query(1, i + 1, r) << " " << T2.query(1, l, i - 1) << " ";
//	cout << x - y << '\n';
//	cout << ans[mid] * pw[i] * pw[n - i + 1] << " ";
	return (x - y) == ans[mid] * pw[i] * pw[n - i + 1];
}

signed main(){
    ios::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);
	
	cin >> n >> q >> k >> b;
	for(int i = 1; i <= n; i++) cin >> a[i];
	pw[0] = 1;for(int i = 1; i <= n; i++) pw[i] = pw[i - 1] * base;
	for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + pw[i - 1];
	T1.build(1, 1, n);T2.build(1, 1, n);
	for(int i = 1; i <= n; i++) ans[i] = ans[i - 1] + pw[i - 1] * (k * i + b);
	while(q--){
		int op;cin >> op;
		if(op == 1){
			int l, r, v;cin >> l >> r >> v;
			T1.update(1, l, r, v);
			T2.update(1, l, r, v);
		}else{
			int i;cin >> i;
			int l = 1, r = min(n - i + 1, i), ans = 0;
			while(l <= r){
				int mid = l + r >> 1;
				if(check(i, mid)) ans = mid, l = mid + 1;
				else r = mid - 1;
			}
			cout << ans << '\n';
		}
	}
//	for(int i = 1; i <= n; i++) cout << T1.query(1, i, i) << " ";cout << '\n';
	
    return 0;
}
/*
6 2 6 2
1 5 9 10 15 18
1 4 4 3
2 3

6 6 6 2
1 5 9 10 15 18
2 2
1 3 3 -3
2 2
1 3 4 3
2 3
2 4
*/

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 9860kb

input:

6 6 6 2
1 5 9 10 15 18
2 2
1 3 3 -3
2 2
1 3 4 3
2 3
2 4

output:

1
0
2
0

result:

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

Test #2:

score: -100
Wrong Answer
time: 9ms
memory: 12144kb

input:

5000 5000 2 0
-329 -328 -327 -326 -325 -324 -323 -322 -321 -320 -319 -318 -317 -316 -315 -314 -313 -312 -311 -310 -309 -308 -307 -306 -305 -304 -303 -302 -301 -300 -299 -298 -297 -296 -295 -294 -293 -292 -291 -290 -289 -288 -287 -286 -285 -284 -283 -282 -281 -280 -279 -278 -277 -276 -275 -274 -273 -...

output:

1883
2101
797
845
1707
2089
1506
561
174
1980
716
1808
1037
1592
925
815
2241
1826
1045
2103
894
603
1668
588
2078
1473
1780
2459
1847
2450
934
1977
700
1737
1606
751
1083
340
1924
370
1042
1414
1012
1343
23
409
1784
2268
844
1191
2044
1999
1531
1651
919
1565
2155
837
237
1594
467
1649
949
1118
1067...

result:

wrong answer 1st numbers differ - expected: '2', found: '1883'