Submission #696658

#TimeUsernameProblemLanguageResultExecution timeMemory
696658uyluluIzbori (COCI22_izbori)C++17
110 / 110
586 ms44828 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define endl "\n"

const int N = 4e5;

int num[N + 1],n;

map<int,vector<int>> mp;

struct node{
    int len = 0,val = 0,sum = 0;
};

int lz[4*N + 1];
node seg[4*N + 1];

void build(int id,int l,int r) {
    seg[id].len = (r - l + 1);

    if(l == r) {
        return;
    }
    int mid = (l + r)/2;
    build(id*2,l,mid);
    build(id*2 + 1,mid + 1,r);

}

node merge(node i1,node i2) {

    node res;
    res.len = i1.len + i2.len;

    res.val = (i1.val + i1.sum * i2.len + i2.val);
    res.sum = (i1.sum + i2.sum);

    return res;
}

void add(int id,int l,int r,int x) {
    lz[id] += x;

    int sz = seg[id].len,asd = (sz + 1) * sz / 2;

    seg[id].sum += (x * sz);
    seg[id].val += (x * asd);
}

void down(int id,int l,int r) {
    int t = lz[id];
    if(lz[id] == 0) return;
    lz[id] = 0;

    int mid = (l + r)/2;

    add(id*2,l,mid,t);
    add(id*2 + 1,mid + 1,r,t);
}

void update(int id,int l,int r,int u,int v,int x) {
    if(v < l || u > r) return;
    if(u <= l && v >= r) {
        add(id,l,r,x);

        return;
    }
    down(id,l,r);
    int mid = (l + r)/2;

    update(id*2,l,mid,u,v,x);
    update(id*2 + 1,mid + 1,r,u,v,x);

    seg[id] = merge(seg[id*2],seg[id*2 + 1]);
}

node query(int id,int l,int r,int u,int v) {
    if(v < l || u > r) return {0,0,0};
    if(u <= l && v >= r) {
        // cout<<l<<" "<<r<<endl;
        // cout<<seg[id].len<<" "<<seg[id].val<<" "<<seg[id].sum<<endl;

        return seg[id];
    }

    down(id,l,r);
    int mid = (l + r)/2;
    return merge(query(id*2,l,mid,u,v),query(id*2 + 1,mid + 1,r,u,v));
}
struct change{
    int l,r,x;
};

vector<change> thay;

inline void upd(int l,int r,int x) {
    thay.push_back({l,r,-x});

    update(1,0,2*n,l,r,x);
}

int res = 0;

inline void cal(vector<int> st) {

    int lst = 0;

    upd(n - (st[0] - 1),n,1);

    for(int i = 0;i < st.size();i++) {
        int nxt;
        lst++;


        if(i < st.size() - 1) {
            nxt = st[i + 1] - 1;
        } else {
            nxt = n;
        }

        node tmp = query(1,0,2*n,2*lst + n - nxt - 1,2*lst + n - st[i] - 1);

        res += tmp.val;
        tmp = query(1,0,2*n,0,2*lst + n - nxt - 2);

        res += tmp.sum * (nxt - st[i] + 1);

        upd(n - nxt + 2*lst,n - st[i] + 2*lst,1);
    }
    for(auto u : thay) {
        update(1,0,2*n,u.l,u.r,u.x);
    }

    thay.clear();
}

signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);

    cin>>n;
    for(int i = 1;i <= n;i++) {
        cin>>num[i];
        mp[num[i]].push_back(i);
    }
    build(1,0,2*n);

    for(auto u : mp) {
        cal(u.second);  
    }
    cout<<res<<endl;
}           

Compilation message (stderr)

Main.cpp: In function 'void cal(std::vector<long long int>)':
Main.cpp:112:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |     for(int i = 0;i < st.size();i++) {
      |                   ~~^~~~~~~~~~~
Main.cpp:117:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |         if(i < st.size() - 1) {
      |            ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...