답안 #1073219

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1073219 2024-08-24T10:37:22 Z vjudge1 Tricks of the Trade (CEOI23_trade) C++17
30 / 100
2180 ms 2097152 KB
#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;

using ll = long long;
using ld = long double;

//#define int ll
#define sz(x) ((int)(x).size())

using pii = pair<int,int>;
using tii = tuple<int,int,int>;

const int nmax = 25e4 + 5;

int K;

template<typename T>
struct Deq {
   vector<T> v;
   void push_front(T x) { v.emplace_back(x); }
   T& operator[](const int& x) { return rbegin(v)[x]; }
   void resize(int k) {
      if(k >= sz(v)) return;
      v.erase(begin(v), begin(v) + sz(v) - k);
      return;
   }
   int size() { return sz(v); }
}; // trebuie facut persistent

struct Tree {
   vector<int> g[nmax];
   int p[nmax];
   void add_edge(int a, int b) {
      g[a].emplace_back(b);
      p[b] = a;
   }
   
   struct mdeq : Deq<ll> {
      ll lazy = 0;
   };
   
   mdeq dp[nmax];
   vector<bool> merge[nmax];
   int calculated[nmax];
   Tree(int n) {
      memset(calculated, 0, sizeof(calculated));
   }
   template<class CB, class CB2> void calcdp(CB&& cost, CB2 atr, int node) {
      if(calculated[node]) return;
      calculated[node] = 1;
      
      
      for(auto x : g[node]) {
         calcdp(cost, atr, x);
         dp[x].resize(K);
         bool swapped = 0;
         
         auto T = dp[x];
         
         if(sz(T) > sz(dp[node]))
            swap(T, dp[node]);
            
         for(int i = 0; i < sz(T); i++)
            dp[node][i] = max(T[i] + T.lazy - dp[node].lazy, dp[node][i]);
      }
      dp[node].push_front(cost(node) - dp[node].lazy);
      dp[node].lazy += atr(node);
      merge[node].assign(sz(dp[node]), 0);
      return;
   }
   template<class CB> void propmerge(CB&& atr, vector<int> order) {
      for(auto node : order) {
         for(auto x : g[node]) {
            auto T = dp[x];
            for(int i = 0; i < sz(T) && i + 1 < sz(dp[node]); i++) {
               if(T[i] + T.lazy - dp[node].lazy + atr(node) == dp[node][i + 1])
                  merge[x][i] = merge[x][i] || merge[node][i + 1];
            }
         }
      }
      return;
   }
};

ll spart[nmax];

signed main() {
   cin.tie(0) -> sync_with_stdio(0);
   int n;
   cin >> n >> K;
   
   for(int i = 1, x; i <= n; i++) {
      cin >> spart[i];
      spart[i] += spart[i - 1];
   }
   
   vector<int> v(n + 1);
   for(int i = 1; i <= n; i++) cin >> v[i];
   Tree toleft(n), toright(n);
   
   vector<int> st;
   
   for(int i = 1; i <= n; i++) {
      while(sz(st) && v[st.back()] <= v[i]) st.pop_back();
      if(sz(st) == 0) toleft.add_edge(0, i);
      else toleft.add_edge(st.back(), i), toright.add_edge(i, st.back());
      st.emplace_back(i);
   }
   st.clear();
   
   for(int i = n; i > 0; i--) {
      while(sz(st) && v[st.back()] < v[i]) st.pop_back();
      if(sz(st) == 0) toright.add_edge(0, i);
      else toright.add_edge(st.back(), i), toleft.add_edge(i, st.back());
      st.emplace_back(i);
   }
   st.clear();
   
   toleft.calcdp([&](int x) { return x == 0? 0 : -spart[x]; }, [&](int x) { return v[x]; }, 0);
   toright.calcdp([&](int x) { return x == 0? 0 : spart[x - 1]; }, [&](int x) { return v[x]; }, 0);

   ll best_cost = -1e18;

   for(int P = 1; P <= n; P++) {
      auto& X = toleft.dp[P];
      auto& Y = toright.dp[P];
      bool swapped = 0;
      if(sz(X) > sz(Y)) swapped = 1, swap(X, Y);
      
      for(int i = 0; i < min(K, sz(X)); i++) {
         int j = K - i - 1;
         if(j >= sz(Y)) continue;
         
         best_cost = max(best_cost, X[i] + Y[j] + X.lazy + Y.lazy - v[P]);
      } 
      if(swapped) swap(X, Y);
   }
   
   for(int P = 1; P <= n; P++) {
      auto& X = toleft.dp[P];
      auto& Y = toright.dp[P];
      bool swapped = 0;
      if(sz(X) > sz(Y)) swapped = 1, swap(X, Y);
      
      
      for(int i = 0; i < min(K, sz(X)); i++) {
         int j = K - i - 1;
         if(j >= sz(Y)) continue;
         
         if(best_cost == X[i] + Y[j] + X.lazy + Y.lazy - v[P]) {
            if(!swapped)
               toleft.merge[P][i] = 1, toright.merge[P][j] = 1;
            else
               toright.merge[P][i] = 1, toleft.merge[P][j] = 1;
         }  
      }
      if(swapped) swap(X, Y);
   }
   
   vector<int> order(n);
   iota(all(order), 1);
   toleft.propmerge([&](int x) { return v[x]; }, order);
   
   reverse(all(order));
   toright.propmerge([&](int x) { return v[x]; }, order);
   
   cout << best_cost << '\n';
   for(int i = 1; i <= n; i++) {
      bool ok = 0;
      for(auto x : toleft.merge[i]) {
         if(ok) break;
         if(x) { ok = 1; break; }
      }
      for(auto x : toright.merge[i]) {
         if(ok) break;
         if(x) { ok = 1; break; }
      }
      cout << ok;
   }
   cout << '\n';
}


/**
      Töte es durch genaue Untersuchung\Töte es kann es nur noch schlimmer machen\Es lässt es irgendwie atmen
--
*/ 

Compilation message

trade.cpp: In function 'int main()':
trade.cpp:93:19: warning: unused variable 'x' [-Wunused-variable]
   93 |    for(int i = 1, x; i <= n; i++) {
      |                   ^
trade.cpp: In instantiation of 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>; CB2 = main()::<lambda(int)>]':
trade.cpp:120:94:   required from here
trade.cpp:57:15: warning: unused variable 'swapped' [-Wunused-variable]
   57 |          bool swapped = 0;
      |               ^~~~~~~
trade.cpp: In instantiation of 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>; CB2 = main()::<lambda(int)>]':
trade.cpp:121:98:   required from here
trade.cpp:57:15: warning: unused variable 'swapped' [-Wunused-variable]
trade.cpp: In instantiation of 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>&; CB2 = main()::<lambda(int)>]':
trade.cpp:55:16:   required from 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>; CB2 = main()::<lambda(int)>]'
trade.cpp:120:94:   required from here
trade.cpp:57:15: warning: unused variable 'swapped' [-Wunused-variable]
trade.cpp: In instantiation of 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>&; CB2 = main()::<lambda(int)>]':
trade.cpp:55:16:   required from 'void Tree::calcdp(CB&&, CB2, int) [with CB = main()::<lambda(int)>; CB2 = main()::<lambda(int)>]'
trade.cpp:121:98:   required from here
trade.cpp:57:15: warning: unused variable 'swapped' [-Wunused-variable]
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 51292 KB Output is correct
2 Correct 32 ms 51216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 51280 KB Output is correct
2 Correct 31 ms 51136 KB Output is correct
3 Correct 33 ms 51292 KB Output is correct
4 Correct 32 ms 51744 KB Output is correct
5 Correct 33 ms 51928 KB Output is correct
6 Correct 32 ms 51216 KB Output is correct
7 Correct 32 ms 51544 KB Output is correct
8 Correct 33 ms 51804 KB Output is correct
9 Partially correct 32 ms 51544 KB Partially correct
10 Correct 32 ms 51544 KB Output is correct
11 Partially correct 33 ms 51544 KB Partially correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 51280 KB Output is correct
2 Correct 31 ms 51136 KB Output is correct
3 Correct 33 ms 51292 KB Output is correct
4 Correct 32 ms 51744 KB Output is correct
5 Correct 33 ms 51928 KB Output is correct
6 Correct 32 ms 51216 KB Output is correct
7 Correct 32 ms 51544 KB Output is correct
8 Correct 33 ms 51804 KB Output is correct
9 Partially correct 32 ms 51544 KB Partially correct
10 Correct 32 ms 51544 KB Output is correct
11 Partially correct 33 ms 51544 KB Partially correct
12 Correct 30 ms 51288 KB Output is correct
13 Correct 31 ms 51288 KB Output is correct
14 Correct 32 ms 51244 KB Output is correct
15 Correct 31 ms 51752 KB Output is correct
16 Correct 33 ms 52052 KB Output is correct
17 Correct 31 ms 51292 KB Output is correct
18 Correct 39 ms 51540 KB Output is correct
19 Correct 34 ms 51792 KB Output is correct
20 Partially correct 31 ms 51544 KB Partially correct
21 Correct 30 ms 51548 KB Output is correct
22 Partially correct 31 ms 51580 KB Partially correct
23 Correct 478 ms 418132 KB Output is correct
24 Correct 35 ms 53840 KB Output is correct
25 Correct 186 ms 187124 KB Output is correct
26 Correct 52 ms 71764 KB Output is correct
27 Correct 375 ms 327572 KB Output is correct
28 Correct 32 ms 53596 KB Output is correct
29 Correct 366 ms 320664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 51232 KB Output is correct
2 Correct 202 ms 147448 KB Output is correct
3 Correct 241 ms 146984 KB Output is correct
4 Correct 229 ms 147828 KB Output is correct
5 Correct 211 ms 147580 KB Output is correct
6 Correct 216 ms 148096 KB Output is correct
7 Correct 230 ms 147336 KB Output is correct
8 Correct 249 ms 146812 KB Output is correct
9 Correct 238 ms 146976 KB Output is correct
10 Correct 219 ms 146932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 51232 KB Output is correct
2 Correct 202 ms 147448 KB Output is correct
3 Correct 241 ms 146984 KB Output is correct
4 Correct 229 ms 147828 KB Output is correct
5 Correct 211 ms 147580 KB Output is correct
6 Correct 216 ms 148096 KB Output is correct
7 Correct 230 ms 147336 KB Output is correct
8 Correct 249 ms 146812 KB Output is correct
9 Correct 238 ms 146976 KB Output is correct
10 Correct 219 ms 146932 KB Output is correct
11 Correct 28 ms 51284 KB Output is correct
12 Correct 222 ms 147452 KB Output is correct
13 Correct 253 ms 146816 KB Output is correct
14 Correct 230 ms 147836 KB Output is correct
15 Correct 233 ms 147348 KB Output is correct
16 Correct 217 ms 148096 KB Output is correct
17 Correct 229 ms 147360 KB Output is correct
18 Correct 265 ms 146980 KB Output is correct
19 Correct 255 ms 146908 KB Output is correct
20 Correct 218 ms 146940 KB Output is correct
21 Correct 33 ms 51288 KB Output is correct
22 Correct 28 ms 51292 KB Output is correct
23 Correct 28 ms 51804 KB Output is correct
24 Correct 32 ms 52056 KB Output is correct
25 Correct 36 ms 51312 KB Output is correct
26 Correct 34 ms 51556 KB Output is correct
27 Correct 31 ms 51796 KB Output is correct
28 Partially correct 28 ms 51548 KB Partially correct
29 Correct 32 ms 51544 KB Output is correct
30 Partially correct 36 ms 51368 KB Partially correct
31 Correct 2023 ms 1699076 KB Output is correct
32 Correct 257 ms 158008 KB Output is correct
33 Correct 2180 ms 1706964 KB Output is correct
34 Correct 2033 ms 1706736 KB Output is correct
35 Partially correct 2057 ms 1706880 KB Partially correct
36 Partially correct 2055 ms 1706112 KB Partially correct
37 Correct 1935 ms 1708280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 51292 KB Output is correct
2 Correct 32 ms 51216 KB Output is correct
3 Correct 32 ms 51280 KB Output is correct
4 Correct 31 ms 51136 KB Output is correct
5 Correct 33 ms 51292 KB Output is correct
6 Correct 32 ms 51744 KB Output is correct
7 Correct 33 ms 51928 KB Output is correct
8 Correct 32 ms 51216 KB Output is correct
9 Correct 32 ms 51544 KB Output is correct
10 Correct 33 ms 51804 KB Output is correct
11 Partially correct 32 ms 51544 KB Partially correct
12 Correct 32 ms 51544 KB Output is correct
13 Partially correct 33 ms 51544 KB Partially correct
14 Correct 30 ms 51288 KB Output is correct
15 Correct 31 ms 51288 KB Output is correct
16 Correct 32 ms 51244 KB Output is correct
17 Correct 31 ms 51752 KB Output is correct
18 Correct 33 ms 52052 KB Output is correct
19 Correct 31 ms 51292 KB Output is correct
20 Correct 39 ms 51540 KB Output is correct
21 Correct 34 ms 51792 KB Output is correct
22 Partially correct 31 ms 51544 KB Partially correct
23 Correct 30 ms 51548 KB Output is correct
24 Partially correct 31 ms 51580 KB Partially correct
25 Correct 478 ms 418132 KB Output is correct
26 Correct 35 ms 53840 KB Output is correct
27 Correct 186 ms 187124 KB Output is correct
28 Correct 52 ms 71764 KB Output is correct
29 Correct 375 ms 327572 KB Output is correct
30 Correct 32 ms 53596 KB Output is correct
31 Correct 366 ms 320664 KB Output is correct
32 Correct 31 ms 51232 KB Output is correct
33 Correct 202 ms 147448 KB Output is correct
34 Correct 241 ms 146984 KB Output is correct
35 Correct 229 ms 147828 KB Output is correct
36 Correct 211 ms 147580 KB Output is correct
37 Correct 216 ms 148096 KB Output is correct
38 Correct 230 ms 147336 KB Output is correct
39 Correct 249 ms 146812 KB Output is correct
40 Correct 238 ms 146976 KB Output is correct
41 Correct 219 ms 146932 KB Output is correct
42 Correct 28 ms 51284 KB Output is correct
43 Correct 222 ms 147452 KB Output is correct
44 Correct 253 ms 146816 KB Output is correct
45 Correct 230 ms 147836 KB Output is correct
46 Correct 233 ms 147348 KB Output is correct
47 Correct 217 ms 148096 KB Output is correct
48 Correct 229 ms 147360 KB Output is correct
49 Correct 265 ms 146980 KB Output is correct
50 Correct 255 ms 146908 KB Output is correct
51 Correct 218 ms 146940 KB Output is correct
52 Correct 33 ms 51288 KB Output is correct
53 Correct 28 ms 51292 KB Output is correct
54 Correct 28 ms 51804 KB Output is correct
55 Correct 32 ms 52056 KB Output is correct
56 Correct 36 ms 51312 KB Output is correct
57 Correct 34 ms 51556 KB Output is correct
58 Correct 31 ms 51796 KB Output is correct
59 Partially correct 28 ms 51548 KB Partially correct
60 Correct 32 ms 51544 KB Output is correct
61 Partially correct 36 ms 51368 KB Partially correct
62 Correct 2023 ms 1699076 KB Output is correct
63 Correct 257 ms 158008 KB Output is correct
64 Correct 2180 ms 1706964 KB Output is correct
65 Correct 2033 ms 1706736 KB Output is correct
66 Partially correct 2057 ms 1706880 KB Partially correct
67 Partially correct 2055 ms 1706112 KB Partially correct
68 Correct 1935 ms 1708280 KB Output is correct
69 Correct 31 ms 51292 KB Output is correct
70 Correct 236 ms 148212 KB Output is correct
71 Correct 285 ms 149528 KB Output is correct
72 Correct 220 ms 150372 KB Output is correct
73 Correct 229 ms 150160 KB Output is correct
74 Correct 230 ms 150408 KB Output is correct
75 Correct 236 ms 149228 KB Output is correct
76 Correct 259 ms 149632 KB Output is correct
77 Correct 245 ms 148348 KB Output is correct
78 Correct 255 ms 148868 KB Output is correct
79 Correct 40 ms 51284 KB Output is correct
80 Correct 40 ms 51284 KB Output is correct
81 Correct 35 ms 51804 KB Output is correct
82 Correct 49 ms 52040 KB Output is correct
83 Correct 35 ms 51384 KB Output is correct
84 Correct 32 ms 51652 KB Output is correct
85 Correct 30 ms 51872 KB Output is correct
86 Partially correct 30 ms 51656 KB Partially correct
87 Correct 30 ms 51540 KB Output is correct
88 Partially correct 33 ms 51520 KB Partially correct
89 Correct 1948 ms 1698996 KB Output is correct
90 Correct 235 ms 158080 KB Output is correct
91 Correct 1925 ms 1707036 KB Output is correct
92 Correct 1913 ms 1706880 KB Output is correct
93 Partially correct 2097 ms 1706820 KB Partially correct
94 Partially correct 2141 ms 1706108 KB Partially correct
95 Correct 1932 ms 1708144 KB Output is correct
96 Correct 582 ms 418136 KB Output is correct
97 Correct 34 ms 53804 KB Output is correct
98 Correct 208 ms 187336 KB Output is correct
99 Correct 52 ms 71808 KB Output is correct
100 Correct 368 ms 327456 KB Output is correct
101 Correct 42 ms 53588 KB Output is correct
102 Correct 401 ms 320464 KB Output is correct
103 Runtime error 1585 ms 2097152 KB Execution killed with signal 9
104 Halted 0 ms 0 KB -