제출 #1009672

#제출 시각아이디문제언어결과실행 시간메모리
1009672nguyennhSimple game (IZhO17_game)C++14
22 / 100
1031 ms4160 KiB
#include<bits/stdc++.h> #define el '\n' using namespace std; const int B = 800; const int MN = 1e5 + 5; vector<tuple<int , int , int>> queries[MN / B + 5]; vector<pair<int , int>> q2[MN / B + 5]; int32_t main (){ // freopen("simple.inp" , "r" , stdin); // freopen("simple.out" , "w" , stdout); ios_base::sync_with_stdio(0); cin.tie(0); int n , m; cin >> n >> m; vector<int> h(n + 5); for (int i = 1 ; i <= n ; i++) cin >> h[i]; int cnt = 0; for (int i = 1 ; i <= m ; i++){ if (i % B == 0) cnt = 0; int type , pos , val; cin >> type >> pos; if (type == 1){ cin >> val; queries[i / B].push_back(make_tuple(type , pos , val)); } else { queries[i / B].push_back(make_tuple(type , pos , -1)); q2[i / B].push_back(make_pair(pos , cnt++)); } } for (int i = 0 ; i <= m / B ; i++) sort(q2[i].begin() , q2[i].end()); for (int i = 0 ; i <= m / B ; i++){ int cnt = 0; vector<int> diff(n + 5); for (int j = 1 ; j < n ; j++){ int a = h[j] , b = h[j + 1]; if (a > b) swap(a , b); auto it1 = upper_bound(q2[i].begin() , q2[i].end() , make_pair(a , INT_MAX)) - q2[i].begin(); if (it1 == (int)q2[i].size()) continue; auto it2 = upper_bound(q2[i].begin() , q2[i].end() , make_pair(b , INT_MIN)) - q2[i].begin() - 1; if (it1 > it2) continue; if (q2[i][it1].first > a && q2[i][it2].first < b){ diff[it1]++; diff[it2 + 1]--; } } vector<int> ans(B + 10); for (int j = 0 ; j < q2[i].size() ; j++ ){ if (!j){ ans[q2[i][j].second] = diff[j]; continue; } diff[j] += diff[j - 1]; ans[q2[i][j].second] = diff[j]; } cnt = 0; vector<pair<int , int>> update; stack<pair<int , int>> st; auto roll_back = [&]() -> void { while (!st.empty()){ auto [pos , val] = st.top(); h[pos] = val; st.pop(); } }; auto modify = [&](int x , int nex , int H , int new_val , int id) -> void { if (h[x] < H){ if (h[nex] > H && new_val >= H) ans[id]--; else if (h[nex] < H && new_val > H) ans[id]++; } else if (h[x] > H) { if (h[nex] < H && new_val <= H) ans[id]--; else if (h[nex] > H && new_val < H) ans[id]++; } else { if (h[nex] > H && new_val < H) ans[id]++; else if (h[nex] < H && new_val > H) ans[id]++; } }; for ( auto [type , pos , val] : queries[i] ){ if (type == 1) update.push_back(make_pair(pos , val)); else { roll_back(); int H = pos; for (int j = 0 ; j < (int)update.size() ; j++){ auto [x , vl] = update[j]; if (x == 1) modify(x , x + 1 , H , vl , cnt); else if (x == n) modify(x , x - 1 , H , vl , cnt); else { modify(x , x - 1 , H , vl , cnt); modify(x , x + 1 , H , vl , cnt); } st.push(make_pair(x , h[x])); h[x] = vl; } cnt++; } } cnt = 0; for ( auto [type , pos , val] : queries[i] ){ if (type == 1) h[pos] = val; else cout << ans[cnt++] << el; } } }

컴파일 시 표준 에러 (stderr) 메시지

game.cpp: In function 'int32_t main()':
game.cpp:51:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     for (int j = 0 ; j < q2[i].size() ; j++ ){
      |                      ~~^~~~~~~~~~~~~~
game.cpp: In lambda function:
game.cpp:64:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   64 |         auto [pos , val] = st.top();
      |              ^
game.cpp: In function 'int32_t main()':
game.cpp:83:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   83 |     for ( auto [type , pos , val] : queries[i] ){
      |                ^
game.cpp:89:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   89 |           auto [x , vl] = update[j];
      |                ^
game.cpp:103:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  103 |     for ( auto [type , pos , val] : queries[i] ){
      |                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...