Submission #67007294


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>

using namespace std;
using ll = long long;
using mint = atcoder::modint998244353;

struct Seg1{
    mint tree[800800], lazy[800800];
    void init(int i, int l, int r){
        lazy[i] = 1;
        tree[i] = 0;
        if (l==r) return;

        int m = (l+r)>>1;
        init(i<<1, l, m); init(i<<1|1, m+1, r);
        tree[i] = tree[i<<1] + tree[i<<1|1];
    }
    void push(int i, int l, int r){
        if (lazy[i]==1) return;
        tree[i] *= lazy[i];
        if (l!=r){
            lazy[i<<1] *= lazy[i];
            lazy[i<<1|1] *= lazy[i];
        }
        lazy[i] = 1;
    }
    void mul(int i, int l, int r, int s, int e, mint x){
        push(i, l, r);
        if (r<s || e<l) return;
        if (s<=l && r<=e){
            lazy[i] *= x;
            push(i, l, r);
            return;
        }

        int m = (l+r)>>1;
        mul(i<<1, l, m, s, e, x); mul(i<<1|1, m+1, r, s, e, x);
        tree[i] = tree[i<<1] + tree[i<<1|1];
    }
    void set(int i, int l, int r, int p, mint x){
        push(i, l, r);
        if (r<p || p<l) return;
        if (l==r){
            tree[i] = x;
            return;
        }

        int m = (l+r)>>1;
        set(i<<1, l, m, p, x); set(i<<1|1, m+1, r, p, x);
        tree[i] = tree[i<<1] + tree[i<<1|1];
    }
    mint query(int i, int l, int r, int s, int e){
        push(i, l, r);
        if (r<s || e<l) return 0;
        if (s<=l && r<=e) return tree[i];

        int m = (l+r)>>1;
        return query(i<<1, l, m, s, e) + query(i<<1|1, m+1, r, s, e);
    }
}tree1;

struct Seg2{
    int tree[800800], sz;
    void init(int n){
        sz = n;
        fill(tree, tree+sz*2, 0);
    }
    void update(int p, int x){
        for (p+=sz;p;p>>=1) tree[p] += x;
    }
    int query(int l, int r){
        ++r;
        int ret = 0;
        for (l+=sz,r+=sz;l<r;l>>=1,r>>=1){
            if (l&1) ret += tree[l++];
            if (r&1) ret += tree[--r];
        }
        return ret;
    }
}tree2;

mint pw[200200];
array<int, 4> a[200200];

mint solve(int n){
    mint ret = 0;
    sort(a+1, a+n+1);

    tree1.init(1, 1, n);
    tree2.init(n+1);

    for (int i=1;i<=n;i++){
        int cnt = tree2.query(1, a[i][1]);
        mint val = tree1.query(1, 1, n, a[i][1], n);
        val += pw[cnt] * a[i][3];
        ret += val * a[i][2];

        tree1.mul(1, 1, n, a[i][1], n, 2);
        tree1.set(1, 1, n, a[i][1], pw[cnt] * a[i][3]);
        tree2.update(a[i][1], 1);
    }

    return ret;
}

int main(){
    int n;
    scanf("%d", &n);

    pw[0] = 1;
    for (int i=1;i<=n;i++) pw[i] = pw[i-1] * 2;

    for (int i=1;i<=n;i++){
        a[i][0] = i;
        scanf("%d", &a[i][1]);
        a[i][2] = i, a[i][3] = a[i][1];
    }
    mint ans = solve(n);

    for (int i=1;i<=n;i++) a[i][0] = n+1-a[i][0];
    ans -= solve(n);

    for (int i=1;i<=n;i++) a[i][1] = n+1-a[i][1];
    ans += solve(n);

    for (int i=1;i<=n;i++) a[i][0] = n+1-a[i][0];
    ans -= solve(n);

    printf("%d\n", ans.val());
}

Submission Info

Submission Time
Task E - Total Area of Bounding Boxes
User qwerasdfzxcl
Language C++ 20 (gcc 12.2)
Score 800
Code Size 3142 Byte
Status AC
Exec Time 646 ms
Memory 15572 KiB

Compile Error

Main.cpp: In function ‘int main()’:
Main.cpp:109:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  109 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
Main.cpp:116:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  116 |         scanf("%d", &a[i][1]);
      |         ~~~~~^~~~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 2
AC × 14
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01-01.txt AC 4 ms 10736 KiB
01-02.txt AC 4 ms 10820 KiB
01-03.txt AC 339 ms 13584 KiB
01-04.txt AC 607 ms 15336 KiB
01-05.txt AC 615 ms 15456 KiB
01-06.txt AC 646 ms 15508 KiB
01-07.txt AC 618 ms 15572 KiB
01-08.txt AC 607 ms 15472 KiB
01-09.txt AC 607 ms 15456 KiB
01-10.txt AC 611 ms 15508 KiB
01-11.txt AC 367 ms 15380 KiB
01-12.txt AC 367 ms 15336 KiB
sample-01.txt AC 4 ms 10744 KiB
sample-02.txt AC 4 ms 10888 KiB