제출 #1136040

#제출 시각아이디문제언어결과실행 시간메모리
1136040mychecksedadMizuyokan 2 (JOI23_mizuyokan2)C++20
0 / 100
4094 ms4220 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 200; int n, ANS[N]; ll a[N], pref[N]; vector<array<int, 2>> solv(int A, int B){ vector<array<int, 2>> dp(B-A+2); dp[1][0] = 1; dp[1][1] = 1; for(int j = 2; j <= B - A + 1; ++j){ int l = A, r = j + A - 1 - 1, go = j + A - 1; while(l <= r){ int m = l + r>>1; if(pref[j - 1] - pref[m - 1] > a[j]){ go = m; l = m + 1; }else r = m - 1; } dp[j][0] = dp[j][1] = 1; if(go < j + A - 1){ for(int l = go; l >= max(A, go - K); --l){ if(l == A || pref[j - 1] - pref[l - 1] > a[l - 1]){ dp[j][0] = max(dp[j][0], dp[l - 1 - (A-1)][0] + 2); } } } for(int l = j + (A-1) - 1; l >= max(A, (j + (A-1) - K)); --l){ if(pref[j] - pref[l] > a[l]){ dp[j][1] = max(dp[j][1], dp[l-(A-1)][0] + 1); } } } return dp; } // void dfs(int l, int r, vi Q){ // vi L, R, CUR; // int m = l+r>>1; // for(auto [x, y, idx]: Q){ // if(y <= m) L.pb({x, y, idx}); // else if(x >= m + 1) R.pb({x, y, idx}); // else CUR.pb({x, y, idx}); // } // vector<array<int, 2>> dpL = solv(l, m); // vector<array<int, 2>> dpR = solv(m+1, r); // if(l == r) return; // dfs(l, m, L); // dfs(m+1, r, R); // } void solve(){ cin >> n; for(int i = 1; i <= n; ++i){ cin >> a[i]; } pref[0] = 0; for(int i = 1; i <= n; ++i){ pref[i] = pref[i - 1] + a[i]; } vector<array<int, 3>> Q; int q; cin >> q; for(int i = 0; i < q; ++i){ int x, y, A, B; cin >> x >> y >> A >> B; Q.pb({A+1, B, i}); ++A; a[x] = y; pref[0] = 0; for(int j = 1; j <= n; ++j){ pref[j] = pref[j - 1] + a[j]; } vector<array<int, 2>> dpp = solv(A, B); // // vector<array<ll, 2>> dp(n + 2); // // dp[A][0] = 1; // // dp[A][1] = 1; // // // for(int j = A; j <= B; ++j) cout << a[j] << ' '; // // // en; // // for(int j = A + 1; j <= B; ++j){ // // // dp[j][1] = dp[j - 1][1]; // // int l = A, r = j - 1, go = j; // // while(l <= r){ // // int m = l + r>>1; // // if(pref[j - 1] - pref[m - 1] > a[j]){ // // go = m; // // l = m + 1; // // }else r = m - 1; // // } // // dp[j][0] = dp[j][1] = 1; // // if(go < j){ // // for(int l = go; l >= max(A, go - K); --l){ // // if(l == A || pref[j - 1] - pref[l - 1] > a[l - 1]){ // // dp[j][0] = max(dp[j][0], dp[l - 1][0] + 2); // // } // // } // // } // // for(int l = j - 1; l >= max(A, (j-K)); --l){ // // if(pref[j] - pref[l] > a[l]){ // // dp[j][1] = max(dp[j][1], dp[l][0] + 1); // // } // // } // // } cout << max(dpp[B-A+1][0], dpp[B-A+1][1]) << '\n'; } // dfs(1, n, Q); // for(int i = 1; i <= q; ++i){ // cout << ANS[i-1] << '\n'; // } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; return 0; }
#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...