QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#726228#6434. Paimon SortingHanoistAC ✓179ms3568kbC++142.0kb2024-11-08 22:27:282024-11-08 22:27:30

Judging History

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

  • [2024-11-08 22:27:30]
  • 评测
  • 测评结果:AC
  • 用时:179ms
  • 内存:3568kb
  • [2024-11-08 22:27:28]
  • 提交

answer

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<functional>
#include<utility>
#include<cassert>
#include<set>
using namespace std;
inline int read(){
    int x = 0,f = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    return x * f;
}
const int N = 1e5 + 11;
int n,m;
int a[N],b[N];
#define mid (l + r >> 1)
struct yjx{
    int tre[N << 2];
    void clear(int k,int l,int r){
        tre[k] = 0;
        if(l == r){
            return;
        }
        clear(k << 1,l,mid);
        clear(k << 1 | 1,mid + 1,r);
    }
    void modify(int k,int l,int r,int x){
        if(l == r){
            tre[k] = 1;
            return;
        }
        if(x <= mid) modify(k << 1,l,mid,x);
        else modify(k << 1 | 1,mid + 1,r,x);
        tre[k] = tre[k << 1] + tre[k << 1 | 1];
    }
    int query(int k,int l,int r,int x,int y){
        if(x > y) return 0;
        if(x <= l && r <= y){
            return tre[k];
        }
        int ret = 0;
        if(x <= mid) ret = query(k << 1,l,mid,x,y);
        if(y > mid) ret += query(k << 1 | 1,mid + 1,r,x,y);
        return ret;
    }
}str;
int main(){
    int t,i,j,k,x,y;
    t = read();
    while(t--){
        n = read();
        int mx = 0;
        long long cnt = 0,temp = 0;
        str.clear(1,1,n);
        for(i = 1;i <= n;i++) a[i] = read();
        for(i = 1;i <= n;i++) b[i] = 0;
        for(i = 1;i <= n;i++){
            if(i > 1){
                if(a[i] > mx) cnt += 2 + temp,temp = 0;
                else cnt += 1ll * str.query(1,1,n,a[i] + 1,mx);
            }
            mx = max(mx,a[i]);
            ++b[a[i]];
            if(b[mx] >= 2) ++temp;
            str.modify(1,1,n,a[i]);
            printf("%lld",cnt);
            if(i < n) putchar(' ');
        }   
        puts("");
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3568kb

input:

3
5
2 3 2 1 5
3
1 2 3
1
1

output:

0 2 3 5 7
0 2 4
0

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 179ms
memory: 3348kb

input:

6107
19
10 13 8 8 11 18 12 9 15 19 6 13 11 11 17 9 14 2 18
12
1 8 10 2 10 2 6 1 5 9 5 7
16
14 4 2 15 12 14 10 3 2 9 15 4 12 9 5 15
10
3 2 5 6 7 8 6 1 6 4
18
6 5 12 12 11 2 10 10 5 10 13 15 13 10 17 7 11 2
1
1
2
1 1
3
2 1 2
17
11 15 3 10 7 15 15 10 5 17 3 3 14 13 11 11 2
3
2 2 3
7
6 1 7 5 3 5 1
7
2 1...

output:

0 2 4 6 7 9 11 16 17 19 28 31 36 41 43 51 55 67 68
0 2 4 6 6 8 10 14 17 18 22 25
0 1 3 5 7 8 11 16 22 26 26 31 33 37 42 42
0 1 3 5 7 9 11 17 19 23
0 1 3 3 4 8 10 12 16 18 27 29 30 34 36 42 46 55
0
0 0
0 1 1
0 2 4 6 9 9 9 11 15 21 27 33 35 38 42 46 55
0 0 3
0 1 3 5 8 10 14
0 1 3 4 6 9 9
0 1 1 3 7 11 ...

result:

ok 6107 lines