제출 #1206174

#제출 시각아이디문제언어결과실행 시간메모리
1206174mychecksedadGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
30 / 100
5092 ms40132 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 = 2e6+10, K = 52, MX = 30; int n; int a[N], b[N], c[N], T[M], T3[M], ls[N], rs[N], TT[M], TT3[M]; array<int, 2> to[N]; bool B[N], C[N]; bool OK[M], OK3[M]; array<int, 2> gett(int val, int k){ return array<int,2>{(lower_bound(b+1, b+1+n, val - k) - b), (upper_bound(b+1, b+1+n, val + k) - b - 1)}; } int sz; void build(){ sz = 1; while(sz <= n) sz *= 2; --sz; for(int k = sz + 1; k <= sz + n; ++k){ T[k] = ls[k - sz] - 1; T3[k] = rs[k - sz] - 1; OK[k] = T[k] >= 0; OK3[k] = T3[k] >= 0; TT[k] = (T[k] >= 0 ? 0 : -1); TT3[k] = (T3[k] >= 0 ? 0 : -1); } for(int k = sz + n + 1; k <= sz + sz + 1; ++k){ T[k] = T3[k] = TT[k] = TT3[k] = 0; OK[k] = OK3[k] = 1; } for(int k = sz; k >= 1; --k){ T[k] = T[k<<1] + T[k<<1|1]; T3[k] = T3[k<<1] + T3[k<<1|1]; TT[k] = TT[k<<1] + min(TT[k<<1|1] + (T[k<<1] - TT[k<<1]), 0); TT3[k] = TT3[k<<1|1] + min(TT3[k<<1] + (T3[k<<1|1] - TT3[k<<1|1]), 0); OK[k] = (OK[k<<1] & (TT[k] >= 0)); OK3[k] = (OK3[k<<1|1] & (TT3[k] >= 0)); } } void upd(int k, int val){ k += sz; T[k] += val; OK[k] = T[k] >= 0; TT[k] = (T[k] >= 0 ? 0 : -1); for(k >>= 1; k > 0; k >>= 1){ T[k] = T[k<<1] + T[k<<1|1]; TT[k] = TT[k<<1] + min(TT[k<<1|1] + (T[k<<1] - TT[k<<1]), 0); OK[k] = (OK[k<<1] & (TT[k] >= 0)); } } void upd3(int k, int val){ k += sz; T3[k] += val; OK3[k] = T3[k] >= 0; TT3[k] = (T3[k] >= 0 ? 0 : -1); for(k >>= 1; k > 0; k >>= 1){ T3[k] = T3[k<<1] + T3[k<<1|1]; TT3[k] = TT3[k<<1|1] + min(TT3[k<<1] + (T3[k<<1|1] - TT3[k<<1|1]), 0); OK3[k] = (OK3[k<<1|1] & (TT3[k] >= 0)); } } void dfs(int l, int r, int k){ // cerr << l << ' ' << r << ' ' << T3[k] << ' ' << OK3[k] << ' ' << TT3[k] << '\n'; // int mid = l+r>>1; // if(l == r) return; // dfs(l, mid, k<<1); // dfs(mid+1, r, k<<1|1); for(int k = 1; k <= sz+n; ++k){ cerr << k << ' ' << T[k] << ' ' << T3[k] << ' ' << OK[k] << ' ' << OK3[k] << ' ' << TT[k] << ' ' << TT3[k] << '\n'; } } bool f(int k){ for(int i = 1; i <= 2*n; ++i) B[i] = C[i] = 0; for(int rep = 0; rep < 2; ++rep){ for(int i = 1; i <= n*3; ++i){ ls[i] = rs[i] = 0; if(i > 2*n) to[i] = to[i - n*2]; else to[i] = gett(a[i], k); // cerr << k << ' ' << i << ' ' << to[i][0] << ' ' << to[i][1] << '\n'; } int cnt_bad = 0; for(int i = 1; i <= n; ++i){ ls[to[i][0]]++; rs[to[i][1]]++; if(to[i][0] > to[i][1]) cnt_bad++; } build(); for(int i = n + 1; i <= 3 * n; ++i){ if(OK[1] && OK3[1] && cnt_bad == 0){ // i-n ... i-1 is nice B[i - n] = 1; } // if(k == 1e9 && i == n + 1 && rep == 0){ // dfs(1, n, 1); // } if(to[i - n][0] > to[i - n][1]) cnt_bad--; if(to[i][0] > to[i][1]) cnt_bad++; // if(to[i - n][0] <= to[i][0]) upd(1, n, to[i - n][0], to[i][0] - 1, 1, -1); // else upd(1, n, to[i][0], to[i - n][0] - 1, 1, 1); if(to[i - n][0] <= n) upd(to[i - n][0], -1); if(to[i][0] <= n) upd(to[i][0], 1); if(to[i - n][1] > 0) upd3(to[i - n][1], -1); if(to[i][1] > 0) upd3(to[i][1], 1); // if(to[i - n][1] <= to[i][1]) upd3(1, n, to[i - n][1] + 1, to[i][1], 1, 1); // else upd3(1, n, to[i][1] + 1, to[i - n][1], 1, -1); } for(int i = 1; i <= n; ++i){ swap(b[i], c[i]); } for(int i = 1; i <= 2*n; ++i) swap(B[i], C[i]); } // en; // for(int i = 1; i <= n*2; ++i){ // cerr << B[i]; // } // en; // for(int i = 1; i <= n*2; ++i){ // cerr << C[i]; // } // en; for(int i = 1; i <= n; ++i){ if(B[i] && C[i + n]) return 1; if(C[i] && B[i + n]) return 1; } return 0; } void solve(){ cin >> n; for(int i = 1; i <= n*2; ++i){ cin >> a[i]; } for(int i = n+n+1; i <= n+n+n; ++i) a[i] = a[i-n-n]; for(int i = 1; i <= n; ++i){ cin >> b[i]; } for(int i = 1; i <= n; ++i){ cin >> c[i]; } sort(b+1, b+1+n); sort(c+1, c+1+n); int L = 0, R = 1e9, ans = 1e9; while(L <= R){ int mid = L+R>>1; if(f(mid)){ ans = mid; R = mid-1; }else L = mid+1; } cout << ans; } 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; }

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

Main.cpp: In function 'std::array<int, 2> gett(int, int)':
Main.cpp:23:57: warning: narrowing conversion of '((std::lower_bound<int*, int>((((int*)(& b)) + 4), (((int*)(& b)) + ((((sizetype)n) + 1) * 4)), (val - k)) - ((int*)(& b))) <unknown operator> 4)' from 'long int' to 'int' [-Wnarrowing]
   23 |   return array<int,2>{(lower_bound(b+1, b+1+n, val - k) - b), (upper_bound(b+1, b+1+n, val + k) - b - 1)};
      |                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
Main.cpp:23:101: warning: narrowing conversion of '(((std::upper_bound<int*, int>((((int*)(& b)) + 4), (((int*)(& b)) + ((((sizetype)n) + 1) * 4)), (val + k)) - ((int*)(& b))) <unknown operator> 4) - 1)' from 'long int' to 'int' [-Wnarrowing]
   23 |   return array<int,2>{(lower_bound(b+1, b+1+n, val - k) - b), (upper_bound(b+1, b+1+n, val + k) - b - 1)};
      |                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
#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...