Submission #757626

#TimeUsernameProblemLanguageResultExecution timeMemory
757626HoriaHaivasSnowball (JOI21_ho_t2)C++14
100 / 100
122 ms9768 KiB
/*
    "TLE is like the wind, always by my side"
    - Yasuo - 2022 -
*/
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long

using namespace std;

int v[200001];
int rightmost[200001];
int leftmost[200001];
int weight[200001];
int w[200001];

bool intervaldone (int query, int pos)
{
     if (rightmost[query]+leftmost[query]>=v[pos+1]-v[pos])
         return 1;
     return 0;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,q,i,j,poz,r,pas;
    cin >> n >> q;
    for (i=1;i<=n;i++)
    {
         cin >> v[i];
    }
    poz=0;
    for (j=1;j<=q;j++)
    {
         cin >> w[j];
         poz+=w[j];
         rightmost[j]=max(rightmost[j-1],poz);
         leftmost[j]=min(leftmost[j-1],poz);
    }
    for (j=1;j<=q;j++)
         leftmost[j]=abs(leftmost[j]);
    weight[1]+=leftmost[q];
    weight[n]+=rightmost[q];
    for (j=1;j<n;j++)
    {
         r=0;
         pas=(1<<17);
         while (pas)
         {
             if (r+pas<=q && !intervaldone(r+pas,j))
                 r+=pas;
             pas=pas/2;
         }
         r++;
         if (r==q+1)
         {
             r--;
             weight[j]+=rightmost[q];
             weight[j+1]+=leftmost[q];
         }
        else if (rightmost[r]==rightmost[r-1])
         {
             weight[j]+=rightmost[r];
             weight[j+1]+=(v[j+1]-v[j])-rightmost[r];
         }
         else
         {
             weight[j+1]+=leftmost[r];
             weight[j]+=(v[j+1]-v[j])-leftmost[r];
         }
    }
    for (j=1;j<=n;j++)
    {
         cout << weight[j] << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...