답안 #284974

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
284974 2020-08-28T08:37:10 Z achibasadzishvili Discharging (NOI20_discharging) C++17
38 / 100
984 ms 265432 KB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2,fma")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define ll long long
#define f first
#define s second
#define pb push_back
using namespace std;
ll n,a[1000002];
ll dp[1000002],rm[1000002][21],po[2000002],pw[200],raod,mn;
ll lef[1000002],rig[1000002];
vector<ll>del[1000002];
ll get(ll x,ll y){
  return a[y];
    ll lo = po[y - x + 1];
    if(rm[y][lo] > rm[x + pw[lo] - 1][lo])return rm[y][lo];
    return rm[x + pw[lo] - 1][lo];
}
ll ind(ll x,ll y){
    if(y == n)return -1;
    ll l = y + 1,r = n,mid,ind = -1;
    while(r >= l){
        mid = (l + r) / 2;
        if(dp[x] + get(x + 1 , mid) * (n - x) > dp[y] + get(y + 1 , mid) * (n - y)){
            r = mid - 1;
            ind = mid;
        }
        else
            l = mid + 1;
    }
    return ind;
}
void delet(ll x){
    if(lef[x] == rig[x] && lef[x] == -1)return;
    if(lef[x] == -1){
        lef[rig[x]] = -1;
        mn = rig[x];
        rig[x] = -1;
        return;
    }
    rig[lef[x]] = rig[x];
    lef[rig[x]] = lef[x];
    ll cur = ind(lef[x] , rig[x]);
    if(cur == -1){
        lef[x] = rig[x] = -1;
        return;
    }
    del[cur].pb(lef[x]);
    lef[x] = rig[x] = -1;
}
int main(){
    scanf("%d",&n);
    for(int i=1; i<=n; i++){
        scanf("%d",&a[i]);
    }
    //int cl = clock();
    //n = 1000000;
    //for(int i=1; i<=n; i++)
    //    a[i] = n-i+1;
    pw[0] = 1;
    
    for(int i=1; i<=21; i++){
        pw[i] = pw[i - 1] * 2;
        for(int j=pw[i - 1]; j<pw[i]; j++){
            if(j <= 1000000)
                po[j] = i - 1;
        }
    }
    for(int i=0; i<=n; i++)
        lef[i] = rig[i] = -1;
    for(int i=1; i<=n; i++){
        rm[i][0] = a[i];
        for(int j=1; j<=20; j++){
            if(i - pw[j] + 1 >= 1)
                rm[i][j] = max(rm[i][j - 1] , rm[i - pw[j - 1]][j - 1]);
        }
    }
    //cout << clock() - cl << '\n';
    for(int i=1; i<=n; i++){
        for(int j=0; j<del[i].size(); j++){
            delet(del[i][j]);
        }
        dp[i] = dp[mn] + get(mn + 1 , i) * (n - mn);
        rig[i - 1] = i;
        lef[i] = i - 1;
        ll cur = ind(i - 1 , i);
        if(cur != -1)
            del[cur].pb(i - 1);
    }
    //cout << "time: " << clock() - cl << " " << raod << '\n';
    cout << dp[n];
    
    
    return 0;
}

Compilation message

Discharging.cpp:5: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    5 | #pragma GCC optimization ("O3")
      | 
Discharging.cpp:6: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    6 | #pragma GCC optimization ("unroll-loops")
      | 
Discharging.cpp: In function 'int main()':
Discharging.cpp:55:13: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
   55 |     scanf("%d",&n);
      |            ~^  ~~
      |             |  |
      |             |  long long int*
      |             int*
      |            %lld
Discharging.cpp:57:17: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
   57 |         scanf("%d",&a[i]);
      |                ~^  ~~~~~
      |                 |  |
      |                 |  long long int*
      |                 int*
      |                %lld
Discharging.cpp:83:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |         for(int j=0; j<del[i].size(); j++){
      |                      ~^~~~~~~~~~~~~~
Discharging.cpp:55:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
Discharging.cpp:57:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   57 |         scanf("%d",&a[i]);
      |         ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 31608 KB Output is correct
2 Correct 19 ms 31616 KB Output is correct
3 Incorrect 19 ms 31616 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 32000 KB Output is correct
2 Correct 22 ms 32128 KB Output is correct
3 Correct 22 ms 32000 KB Output is correct
4 Correct 20 ms 32000 KB Output is correct
5 Correct 33 ms 31992 KB Output is correct
6 Correct 21 ms 32000 KB Output is correct
7 Correct 38 ms 31996 KB Output is correct
8 Correct 20 ms 32000 KB Output is correct
9 Correct 22 ms 32000 KB Output is correct
10 Correct 23 ms 32000 KB Output is correct
11 Correct 20 ms 32000 KB Output is correct
12 Correct 34 ms 31992 KB Output is correct
13 Correct 21 ms 31992 KB Output is correct
14 Correct 32 ms 32000 KB Output is correct
15 Correct 22 ms 32000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 32000 KB Output is correct
2 Correct 22 ms 32128 KB Output is correct
3 Correct 22 ms 32000 KB Output is correct
4 Correct 20 ms 32000 KB Output is correct
5 Correct 33 ms 31992 KB Output is correct
6 Correct 21 ms 32000 KB Output is correct
7 Correct 38 ms 31996 KB Output is correct
8 Correct 20 ms 32000 KB Output is correct
9 Correct 22 ms 32000 KB Output is correct
10 Correct 23 ms 32000 KB Output is correct
11 Correct 20 ms 32000 KB Output is correct
12 Correct 34 ms 31992 KB Output is correct
13 Correct 21 ms 31992 KB Output is correct
14 Correct 32 ms 32000 KB Output is correct
15 Correct 22 ms 32000 KB Output is correct
16 Correct 825 ms 263412 KB Output is correct
17 Correct 947 ms 263156 KB Output is correct
18 Correct 753 ms 265432 KB Output is correct
19 Correct 857 ms 262000 KB Output is correct
20 Correct 860 ms 262128 KB Output is correct
21 Correct 885 ms 263164 KB Output is correct
22 Correct 827 ms 263156 KB Output is correct
23 Correct 949 ms 260852 KB Output is correct
24 Correct 889 ms 261536 KB Output is correct
25 Correct 898 ms 260844 KB Output is correct
26 Correct 964 ms 259252 KB Output is correct
27 Correct 798 ms 264444 KB Output is correct
28 Correct 905 ms 262392 KB Output is correct
29 Correct 884 ms 260084 KB Output is correct
30 Correct 984 ms 259952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 573 ms 259648 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 31608 KB Output is correct
2 Correct 19 ms 31616 KB Output is correct
3 Incorrect 19 ms 31616 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 31608 KB Output is correct
2 Correct 19 ms 31616 KB Output is correct
3 Incorrect 19 ms 31616 KB Output isn't correct
4 Halted 0 ms 0 KB -