Submission #1258615

#TimeUsernameProblemLanguageResultExecution timeMemory
1258615phtungPilot (NOI19_pilot)C++20
100 / 100
436 ms70668 KiB
#include <bits/stdc++.h>

using namespace std;

#define name "IO"
#define int long long 

const int inf = 1e18 + 7; 
const int maxn = 1e6 + 5;
int n;

int Pow(int x, int y) 
{
    int ans = 1;
    while (y > 0) 
    {
        if (y & 1) ans = ans * x;
        y /= 2;
        x = x * x;
    }
    return ans;
}

struct DSU
{
    vector<int> par, sz;

    DSU(int n)
    {
        par.resize(n + 5); 
        sz.resize(n + 5, 1); 
        iota(par.begin(), par.end(), 0); 
    }

    int find(int x)
    {
        if(x != par[x]) par[x] = find(par[x]); 
        return par[x]; 
    }

    void join(int u, int v)
    {
        u = find(u);
        v = find(v);
        if(u == v) return;

        if(sz[u] < sz[v]) swap(u, v);
        par[v] = u;
        sz[u] += sz[v]; 
    }

    int Size(int u)
    {
        int len = sz[find(u)]; 
        return len * (len + 1) / 2ll; 
    }
};

void solve()
{
    int n, q;
    cin >> n >> q; 

    vector<int> a(n + 1, 0), id(n + 1); 
    for(int i = 1; i <= n; i++) cin >> a[i]; 

    vector<pair<int,int>> query(q);
    for(int i = 0; i < q; i++)
    {
        int x; cin >> x; 
        query[i] = {x, i}; 
    }

    iota(id.begin(), id.end(), 0);
    sort(id.begin(), id.end(), [&](int &x, int &y){
        return a[x] < a[y]; 
    }); 

    DSU dsu(n);
    sort(query.begin(), query.end()); 

    int ptr = 1; 
    int total = 0; 
    int ans[q]; 
    int check[n + 1]; 
    fill(check + 1, check + n + 1, 0); 

    for(auto [val, idx] : query)
    {
        while(ptr <= n && a[id[ptr]] <= val)
        {
            int pos = id[ptr]; 
            
            total += dsu.Size(pos); 

            if(pos > 1)
            {
                if(check[pos - 1])
                {
                    total -= dsu.Size(pos - 1);
                    total -= dsu.Size(pos); 
                    dsu.join(pos - 1, pos); 
                    total += dsu.Size(pos); 
                }
            }
            if(pos < n)
            {
                if(check[pos + 1])
                {
                    total -= dsu.Size(pos);
                    total -= dsu.Size(pos + 1);
                    dsu.join(pos, pos + 1);
                    total += dsu.Size(pos); 
                }
            }
            check[pos] = 1; 
            ptr++; 
        }

        ans[idx] = total; 
    }

    for(int i = 0; i < q; i++) cout << ans[i] << "\n"; 

}

signed main()
{
    if (fopen (name".INP", "r"))
    {
        freopen (name".INP", "r", stdin);
        freopen (name".OUT", "w", stdout);
    }

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    clock_t start = clock(); 

    int t = 1;

    while(t--) solve(); 

    std::cerr << "Time: " << clock() - start << "ms\n";

    return 0; 

}

Compilation message (stderr)

pilot.cpp: In function 'int main()':
pilot.cpp:131:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |         freopen (name".INP", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
pilot.cpp:132:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |         freopen (name".OUT", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...