結果
問題 | No.1625 三角形の質問 |
ユーザー |
![]() |
提出日時 | 2021-07-23 23:29:32 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2,160 ms / 6,000 ms |
コード長 | 13,060 bytes |
コンパイル時間 | 3,450 ms |
コンパイル使用メモリ | 245,364 KB |
最終ジャッジ日時 | 2025-01-23 09:06:13 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 19 |
コンパイルメッセージ
main.cpp: In function ‘void solve(int, int*, int*, long long int*, int, int*, int*, long long int*, void*)’: main.cpp:431:18: warning: ‘res’ may be used uninitialized [-Wmaybe-uninitialized] 431 | res[qind[i]] = t.getMaxVal(0, qy[i]+1); | ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ main.cpp:300:7: note: ‘res’ was declared here 300 | T res; | ^~~
ソースコード
#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#pragma GCC optimize("inline")#include<bits/stdc++.h>using namespace std;template<class T> struct cLtraits_identity{using type = T;};template<class T> using cLtraits_try_make_signed =typename conditional<is_integral<T>::value,make_signed<T>,cLtraits_identity<T>>::type;template <class S, class T> struct cLtraits_common_type{using tS = typename cLtraits_try_make_signed<S>::type;using tT = typename cLtraits_try_make_signed<T>::type;using type = typename common_type<tS,tT>::type;};void*wmem;char memarr[96000000];template<class S, class T> inline auto min_L(S a, T b)-> typename cLtraits_common_type<S,T>::type{return (typename cLtraits_common_type<S,T>::type) a <= (typename cLtraits_common_type<S,T>::type) b ? a : b;}template<class S, class T> inline auto max_L(S a, T b)-> typename cLtraits_common_type<S,T>::type{return (typename cLtraits_common_type<S,T>::type) a >= (typename cLtraits_common_type<S,T>::type) b ? a : b;}template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );(*arr)=(T*)(*mem);(*mem)=((*arr)+x);}template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){walloc1d(arr, x2-x1, mem);(*arr) -= x1;}template<class T1, class T2, class T3> void sortA_L(int N, T1 a[], T2 b[], T3 c[], void *mem = wmem){int i;pair<T1, pair<T2, T3> >*arr;walloc1d(&arr, N, &mem);for(i=(0);i<(N);i++){arr[i].first = a[i];arr[i].second.first = b[i];arr[i].second.second = c[i];}sort(arr, arr+N);for(i=(0);i<(N);i++){a[i] = arr[i].first;b[i] = arr[i].second.first;c[i] = arr[i].second.second;}}template<class T1, class T2, class T3, class T4> void sortA_L(int N, T1 a[], T2 b[], T3 c[], T4 d[], void *mem = wmem){int i;pair<pair<T1, T2>, pair<T3, T4> >*arr;walloc1d(&arr, N, &mem);for(i=(0);i<(N);i++){arr[i].first.first = a[i];arr[i].first.second = b[i];arr[i].second.first = c[i];arr[i].second.second = d[i];}sort(arr, arr+N);for(i=(0);i<(N);i++){a[i] = arr[i].first.first;b[i] = arr[i].first.second;c[i] = arr[i].second.first;d[i] = arr[i].second.second;}}inline int my_getchar_unlocked(){static char buf[1048576];static int s = 1048576;static int e = 1048576;if(s == e && e == 1048576){e = fread_unlocked(buf, 1, 1048576, stdin);s = 0;}if(s == e){return EOF;}return buf[s++];}inline void rd(int &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}struct MY_WRITER{char buf[1048576];int s;int e;MY_WRITER(){s = 0;e = 1048576;}~MY_WRITER(){if(s){fwrite_unlocked(buf, 1, s, stdout);}}};MY_WRITER MY_WRITER_VAR;void my_putchar_unlocked(int a){if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);MY_WRITER_VAR.s = 0;}MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;}inline void wt_L(char a){my_putchar_unlocked(a);}inline void wt_L(long long x){int s=0;int m=0;char f[20];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}template<class S, class T> inline S chmax(S &a, T b){if(a<b){a=b;}return a;}template<class T> int coordcomp_L(int n, T arr[], int res[] = NULL, void *mem = wmem){int i;int k = 0;pair<T,int>*r;walloc1d(&r, n, &mem);for(i=(0);i<(n);i++){r[i].first = arr[i];r[i].second = i;}sort(r, r+n);if(res != NULL){for(i=(0);i<(n);i++){if(i && r[i].first != r[i-1].first){k++;}res[r[i].second] = k;}}else{for(i=(0);i<(n);i++){if(i && r[i].first != r[i-1].first){k++;}arr[r[i].second] = k;}}return k+1;}template<class T> int coordcomp_L(int n1, T arr1[], int n2, T arr2[], int res1[] = NULL, int res2[] = NULL, void *mem = wmem){int i;int k = 0;pair<T,int>*r;walloc1d(&r, n1+n2, &mem);for(i=(0);i<(n1);i++){r[i].first = arr1[i];r[i].second = i;}for(i=(0);i<(n2);i++){r[n1+i].first = arr2[i];r[n1+i].second = n1+i;}sort(r, r+n1+n2);for(i=(0);i<(n1+n2);i++){if(i && r[i].first != r[i-1].first){k++;}if(r[i].second < n1){if(res1!=NULL){res1[r[i].second] = k;}else{arr1[r[i].second] = k;}}else{if(res2!=NULL){res2[r[i].second-n1] = k;}else{arr2[r[i].second-n1] = k;}}}return k+1;}template<class T> struct segtree_Point_Maxval{int N;int logN;T*mx;void malloc(int maxN, int once = 0){int i;for(i=1;i<maxN;i*=2){;}mx = new T[2*i];if(once){setN(maxN);}}void walloc(int maxN, int once = 0, void **mem = &wmem){int i;for(i=1;i<maxN;i*=2){;}walloc1d(&mx, 2*i, mem);if(once){setN(maxN);}}void free(void){delete [] mx;}T& operator[](int i){return mx[N+i];}void setN(int n, int zerofill = 1, int dobuild = 1){int i;for(i=1,logN=0;i<n;i*=2,logN++){;}N = i;if(zerofill){for(i=(0);i<(N);i++){mx[N+i] = 0;}}if(dobuild){build();}}void build(void){int i;for(i=N-1;i;i--){mx[i] =max_L(mx[2*i], mx[2*i+1]);}}inline void build(int a){while(a > 1){a /= 2;mx[a] =max_L(mx[2*a], mx[2*a+1]);}}inline void change(int a, T val){mx[a+N] = val;build(a+N);}inline void add(int a, T val){mx[a+N] += val;build(a+N);}inline T getMaxVal(int a, int b){T res;T tmp;int fga = 0;int fgb = 0;a += N;b += N;while(a < b){if(a%2){if(fga){res =max_L(res, mx[a]);}else{res = mx[a];fga = 1;}a++;}if(b%2){b--;if(fgb){tmp =max_L(mx[b], tmp);}else{tmp = mx[b];fgb = 1;}}a /= 2;b /= 2;}if(fga==1 && fgb==0){return res;}if(fga==0 && fgb==1){return tmp;}if(fga==1 && fgb==1){res =max_L(res, tmp);return res;}return res;}};long long crossProd_L(long long x1, long long y1, long long x2, long long y2){return x1 * y2 - x2 * y1;}int N;int Q;int T[200000];int A[200000];int B[200000];int C[200000];int D[200000];int E[200000];int F[200000];int L[200000];int R[200000];int ind[200000];int x[200000];int y[200000];long long s[200000];int qx[200000];int qy[200000];void solve(int n, int x[], int y[], long long s[], int q, int x1[], int y1[], long long res[], void *mem = wmem){int i;int xs;int*larr;int*nx;int*ny;int*qx;int*qy;int*nind;int*qind;long long*sarr;segtree_Point_Maxval<long long> t;walloc1d(&larr, 2*n+2*q, &mem);walloc1d(&nx, n, &mem);walloc1d(&ny, n, &mem);walloc1d(&qx, q, &mem);walloc1d(&qy, q, &mem);walloc1d(&nind, n, &mem);walloc1d(&qind, q, &mem);for(i=(0);i<(n);i++){larr[i] = x[i];}for(i=(0);i<(n);i++){larr[n+i] = y[i];}for(i=(0);i<(q);i++){larr[n+n+i] = x1[i];}for(i=(0);i<(q);i++){larr[n+n+q+i] = y1[i];}xs =coordcomp_L(2*n+2*q,larr,NULL,mem);for(i=(0);i<(n);i++){nx[i] = larr[i];}for(i=(0);i<(n);i++){ny[i] = larr[n+i];}for(i=(0);i<(q);i++){qx[i] = larr[n+n+i];}for(i=(0);i<(q);i++){qy[i] = larr[n+n+q+i];}for(i=(0);i<(n);i++){nind[i] = i;}for(i=(0);i<(q);i++){qind[i] = i;}sortA_L(n, nx, ny, nind, mem);sortA_L(q, qx, qy, qind, mem);walloc1d(&sarr, xs, &mem);t.walloc(xs, 0, &mem);t.setN(xs);for(i=(0);i<(xs);i++){t[i] = sarr[i] = -1;}t.build();for(i=(q)-1;i>=(0);i--){while(n && nx[n-1] >= qx[i]){if(sarr[ny[n-1]] < s[nind[n-1]]){sarr[ny[n-1]] = s[nind[n-1]];t.change(ny[n-1], sarr[ny[n-1]]);}n--;}res[qind[i]] = t.getMaxVal(0, qy[i]+1);}}long long res[200000];long long tmp[200000];int main(){wmem = memarr;int i;int j;int k;int nst;int ned;int nn;int qst;int qed;rd(N);rd(Q);{int Q5rsz4fz;for(Q5rsz4fz=(0);Q5rsz4fz<(N);Q5rsz4fz++){rd(A[Q5rsz4fz]);rd(B[Q5rsz4fz]);rd(C[Q5rsz4fz]);rd(D[Q5rsz4fz]);rd(E[Q5rsz4fz]);rd(F[Q5rsz4fz]);}}nn = N;for(i=(0);i<(Q);i++){rd(T[i]);if(T[i]==1){rd(A[nn]);rd(B[nn]);rd(C[nn]);rd(D[nn]);rd(E[nn]);rd(F[nn]);ind[i] = nn++;}if(T[i]==2){rd(L[i]);rd(R[i]);}}for(i=(0);i<(nn);i++){x[i] =min_L(min_L(A[i], C[i]), E[i]);y[i] =max_L(max_L(A[i], C[i]), E[i]);s[i] = abs(crossProd_L(C[i]-A[i], D[i]-B[i], E[i]-A[i], F[i]-B[i]));}nst = ned = N;qst = qed = 0;for(i=(0);i<(Q);i++){if(T[i]==1){ned++;}else{res[qed] = -1;for(k=(nst);k<(ned);k++){if(L[i]<=x[k]&&y[k]<=R[i]){chmax(res[qed], s[k]);}}qx[qed] = L[i];qy[qed] = R[i];qed++;}if(nst + 1000 < ned){if(qst < qed){solve(nst, x, y, s, qed-qst, qx+qst, qy+qst, tmp+qst);while(qst < qed){chmax(res[qst], tmp[qst]);qst++;}}nst = ned;}}if(qst < qed){solve(nst, x, y, s, qed-qst, qx+qst, qy+qst, tmp+qst);while(qst < qed){chmax(res[qst], tmp[qst]);qst++;}}for(i=(0);i<(qed);i++){wt_L(res[i]);wt_L('\n');}return 0;}// cLay version 20210717-1 [beta]// --- original code ---// int N, Q, T[2d5], A[], B[], C[], D[], E[], F[], L[], R[], ind[];// int x[], y[]; ll s[];// int qx[], qy[];//// void solve(int n, int x[], int y[], ll s[], int q, int x1[], int y1[], ll res[], void *mem = wmem){// int i, xs;// int *larr;// int *nx, *ny, *qx, *qy, *nind, *qind;// ll *sarr;// segtree_Point_Maxval<ll> t;// walloc1d(&larr, 2*n+2*q, &mem);// walloc1d(&nx, n, &mem);// walloc1d(&ny, n, &mem);// walloc1d(&qx, q, &mem);// walloc1d(&qy, q, &mem);// walloc1d(&nind, n, &mem);// walloc1d(&qind, q, &mem);//// rep(i,n) larr[i] = x[i];// rep(i,n) larr[n+i] = y[i];// rep(i,q) larr[n+n+i] = x1[i];// rep(i,q) larr[n+n+q+i] = y1[i];// xs = coordcomp(2*n+2*q,larr,NULL,mem);// rep(i,n) nx[i] = larr[i];// rep(i,n) ny[i] = larr[n+i];// rep(i,q) qx[i] = larr[n+n+i];// rep(i,q) qy[i] = larr[n+n+q+i];//// rep(i,n) nind[i] = i;// rep(i,q) qind[i] = i;//// sortA(n, nx, ny, nind, mem);// sortA(q, qx, qy, qind, mem);//// walloc1d(&sarr, xs, &mem);//// t.walloc(xs, 0, &mem);// t.setN(xs);// rep(i,xs) t[i] = sarr[i] = -1;// t.build();//// rrep(i,q){// while(n && nx[n-1] >= qx[i]){// if(sarr[ny[n-1]] < s[nind[n-1]]){// sarr[ny[n-1]] = s[nind[n-1]];// t.change(ny[n-1], sarr[ny[n-1]]);// }// n--;// }// res[qind[i]] = t.getMaxVal(0, qy[i]+1);// }// }//// ll res[], tmp[];// {// int i, j, k, nst, ned, nn, qst, qed;// rd(N,Q,(A,B,C,D,E,F)(N));// nn = N;// rep(i,Q){// rd(T[i]);// if(T[i]==1) rd(A[nn], B[nn], C[nn], D[nn], E[nn], F[nn]), ind[i] = nn++;// if(T[i]==2) rd(L[i], R[i]);// }// rep(i,nn){// x[i] = min(A[i], C[i], E[i]);// y[i] = max(A[i], C[i], E[i]);// s[i] = abs(crossProd(C[i]-A[i], D[i]-B[i], E[i]-A[i], F[i]-B[i]));// }// nst = ned = N;// qst = qed = 0;// rep(i,Q){// if(T[i]==1){// ned++;// } else {// res[qed] = -1;// rep(k,nst,ned) if(L[i]<=x[k]&&y[k]<=R[i]) res[qed] >?= s[k];// qx[qed] = L[i];// qy[qed] = R[i];// qed++;// }// if(nst + 1000 < ned){// if(qst < qed){// solve(nst, x, y, s, qed-qst, qx+qst, qy+qst, tmp+qst);// while(qst < qed){// res[qst] >?= tmp[qst];// qst++;// }// }// nst = ned;// }// }// if(qst < qed){// solve(nst, x, y, s, qed-qst, qx+qst, qy+qst, tmp+qst);// while(qst < qed){// res[qst] >?= tmp[qst];// qst++;// }// }// rep(i,qed) wt(res[i]);// }