社区讨论

继续评价下我的码风

灌水区参与者 10已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@lo7nmb3r
此快照首次捕获于
2023/10/27 04:45
2 年前
此快照最后确认于
2023/10/27 04:45
2 年前
查看原帖
这是CSP-S2022 T2 代码(非考场代码,考场爆零
我在考场上的最后10分钟想到正解,然后干瞪眼(
于是,我带着一种愤怒而悲哀的情绪写代码,写出了这个玩意:
CPP

#include <bits/stdc++.h>
#include <cstdlib>
#define int __int128
int INF;
using namespace std;
struct SegmentTree{
    struct STree{
        int left, right;
        int min, max;
        int min_postive, max_negative;
        bool exists;
    }tree[400020]; 
    void build(int* arr, int p, int l, int r, void(*init)(SegmentTree::STree*, int, int*, int), void(*update)(SegmentTree::STree*, int)){
        tree[p].left = l, tree[p].right = r;
        if(l == r){
            tree[p].min = tree[p].max = arr[l];
            init(tree, p, arr, l);
            return;
        }
        int mid = (l + r) / 2;
        build(arr, p * 2, l, mid, init, update);
        build(arr, p * 2 + 1, mid + 1, r, init, update);
        tree[p].min = min(tree[p * 2].min, tree[p * 2 + 1].min);
        tree[p].max = max(tree[p * 2].max, tree[p * 2 + 1].max);
        update(tree, p);
        return;
    }
    int query(int p, int l, int r, int(*init)(SegmentTree::STree*, int), int(*update)(int, int), int pre_value){
        if(l <= tree[p].left and r >= tree[p].right){
            return init(tree, p);
        }
        int mid = (tree[p].left + tree[p].right) / 2, ret = pre_value;
        if(l <= mid) ret = update(ret, query(p * 2, l, r, init, update, pre_value));
        if(r > mid) ret = update(ret, query(p * 2 + 1, l, r, init, update, pre_value));
        return ret;
    }
}TreeA, TreeB;
void init_TreeA(SegmentTree::STree *tree, int p, int *arr, int pos){
    tree[p].min_postive = ((arr[pos] > 0) ? arr[pos] : INF);
    tree[p].max_negative = ((arr[pos] < 0) ? arr[pos] : -INF);
    tree[p].exists = (arr[pos] == 0);
}
void update_TreeA(SegmentTree::STree *tree, int p){
    tree[p].min_postive = min(tree[p * 2].min_postive, tree[p * 2 + 1].min_postive);
    tree[p].max_negative = max(tree[p * 2].max_negative, tree[p * 2 + 1].max_negative);
    tree[p].exists = tree[p * 2].exists || tree[p * 2 + 1].exists;
}
namespace __int128_IO{
    int read(){
        int x = 0, f = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9'){
            if(ch == '-') f = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
        return x * f; 
    }
    void write(int x){
        if(x < 0) putchar('-'), x = -x;
        if(x > 9) write(x / 10);
        putchar(x % 10 + '0');
        return; 
    }
}
int A[100005], B[100005];
signed main(){
    memset(&INF, 0x7f, sizeof(INF));
    int n = __int128_IO::read(), m = __int128_IO::read(), q = __int128_IO::read();
    for(int i = 1; i <= n; i++) A[i] = __int128_IO::read();
    for(int i = 1; i <= m; i++) B[i] = __int128_IO::read();
    TreeA.build(A, 1, 1, n, init_TreeA, update_TreeA);
    TreeB.build(B, 1, 1, m, [](SegmentTree::STree *tree, int p, int *arr, int pos){}, [](SegmentTree::STree *tree, int p){});
    auto Max = [](int a, int b)->int{return (a > b) ? a : b;};
    auto Min = [](int a, int b)->int{return (a < b) ? a : b;};
    auto Or = [](int a, int b)->int{return a || b;};
    while(q--){
        int l1 = __int128_IO::read(), r1 = __int128_IO::read(), l2 = __int128_IO::read(), r2 = __int128_IO::read(), ans = 0;
        int max_M = TreeA.query(1, l1, r1, [](SegmentTree::STree *tree, int p)->int{return tree[p].max;}, Max, -INF);
        int min_M = TreeA.query(1, l1, r1, [](SegmentTree::STree *tree, int p)->int{return tree[p].min;}, Min, INF);
        int max_N = TreeB.query(1, l2, r2, [](SegmentTree::STree *tree, int p)->int{return tree[p].max;}, Max, -INF);
        int min_N = TreeB.query(1, l2, r2, [](SegmentTree::STree *tree, int p)->int{return tree[p].min;}, Min, INF);
        int min_postive = TreeA.query(1, l1, r1, [](SegmentTree::STree *tree, int p)->int{return tree[p].min_postive;}, Min, INF);
        int max_negative = TreeA.query(1, l1, r1, [](SegmentTree::STree *tree, int p)->int{return tree[p].max_negative;}, Max, -INF);
        bool exist_zero = TreeA.query(1, l1, r1, [](SegmentTree::STree *tree, int p)->int{return tree[p].exists;}, Or, 0); 
        if(min_M > 0 and min_N > 0) ans = max_M * min_N;
        else if(min_M > 0 and max_N < 0) ans = min_M * min_N;
        else if(max_M < 0 and min_M > 0) ans = max_M * max_N;
        else if(max_M < 0 and max_N < 0) ans = min_M * max_N;
        else if(min_M < 0 && max_M > 0 && min_N > 0) ans = max_M * min_N;
        else if(min_M < 0 && max_M > 0 && max_N < 0) ans = min_M * max_N;
        else if(min_M > 0 && min_N < 0 && max_N > 0) ans = min_M * min_N;
        else if(max_M < 0 && min_N < 0 && max_N > 0) ans = max_M * max_N;
        else if(exist_zero && min_N < 0 && max_N > 0) ans = 0;
        else ans = max(min_postive * min_N, max_negative * max_N);
        __int128_IO::write(ans), putchar('\n');
    }
    return 0;
}
老师说我码风没救了,你们觉得呢

回复

13 条回复,欢迎继续交流。

正在加载回复...