QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#602604 | #9242. An Easy Geometry Problem | xi_xi | WA | 9ms | 12144kb | C++14 | 4.0kb | 2024-10-01 11:08:20 | 2024-10-01 11:08:20 |
Judging History
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'