結果
問題 | No.1251 絶対に間違ってはいけない最小化問題 |
ユーザー |
![]() |
提出日時 | 2020-10-09 21:29:28 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 35 ms / 2,000 ms |
コード長 | 10,045 bytes |
コンパイル時間 | 2,431 ms |
コンパイル使用メモリ | 217,180 KB |
最終ジャッジ日時 | 2025-01-15 03:59:36 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 42 |
ソースコード
#pragma GCC optimize ("Ofast")#include<bits/stdc++.h>using namespace std;void*wmem;char memarr[96000000];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 T1> void sortA_L(int N, T1 a[], void *mem = wmem){sort(a, a+N);}template<class T1, class T2> void sortA_L(int N, T1 a[], T2 b[], void *mem = wmem){int i;pair<T1, T2>*arr;walloc1d(&arr, N, &mem);for(i=(0);i<(N);i++){arr[i].first = a[i];arr[i].second = b[i];}sort(arr, arr+N);for(i=(0);i<(N);i++){a[i] = arr[i].first;b[i] = arr[i].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;}}inline void rd(long long &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 T> struct Arr1d{int n;int mem;T*d;T& operator[](int a){return d[a];}void sort(){reset();std::sort(d, d+n);}int set_cumulative_sum;int cumulative_sum_mem;T*cumulative_sum;void setSum(void){int i;set_cumulative_sum = 1;if(cumulative_sum_mem < n+1){delete[] cumulative_sum;cumulative_sum = new T[n+1];cumulative_sum_mem = n+1;}cumulative_sum[0] = 0;for(i=(0);i<(n);i++){cumulative_sum[i+1] = cumulative_sum[i] + d[i];}}T getSum(int i, int j){if(set_cumulative_sum==0){setSum();}return cumulative_sum[j+1] - cumulative_sum[i];}int set_const_len_left;int const_len_left_mem;int*const_len_left;void setConstLenLeft(void){int i;set_const_len_left = 1;if(const_len_left_mem < n){delete[] const_len_left;const_len_left = new int[n];const_len_left_mem = n;}for(i=(0);i<(n);i++){const_len_left[i] = 1;}for(i=(1);i<(n);i++){if(d[i]==d[i-1]){const_len_left[i] = const_len_left[i-1] + 1;}}}int ConstLenLeft(int st, T val){if(!set_const_len_left){setConstLenLeft();}if(val != d[st]){return 0;}return const_len_left[st];}int ConstLenLeft(int st){if(!set_const_len_left){setConstLenLeft();}return const_len_left[st];}int ConstLenLeftCyclic(int st, T val){if(!set_const_len_left){setConstLenLeft();}st %= n;if(st < 0){st += n;}if(val != d[st]){return 0;}if(const_len_left[st] != st+1 || d[st] != d[n-1]){return const_len_left[st];}if(const_len_left[n-1] == n){return 1073709056;}return const_len_left[st] + const_len_left[n-1];}int ConstLenLeftCyclic(int st){if(!set_const_len_left){setConstLenLeft();}st %= n;if(st < 0){st += n;}if(const_len_left[st] != st+1 || d[st] != d[n-1]){return const_len_left[st];}if(const_len_left[n-1] == n){return 1073709056;}return const_len_left[st] + const_len_left[n-1];}int set_const_len_right;int const_len_right_mem;int*const_len_right;void setConstLenRight(void){int i;set_const_len_right = 1;if(const_len_right_mem < n){delete[] const_len_right;const_len_right = new int[n];const_len_right_mem = n;}for(i=(0);i<(n);i++){const_len_right[i] = 1;}for(i=(n-1)-1;i>=(0);i--){if(d[i]==d[i+1]){const_len_right[i] = const_len_right[i+1] + 1;}}}int ConstLenRight(int st, T val){if(!set_const_len_right){setConstLenRight();}if(val != d[st]){return 0;}return const_len_right[st];}int ConstLenRight(int st){if(!set_const_len_right){setConstLenRight();}return const_len_right[st];}int ConstLenRightCyclic(int st, T val){if(!set_const_len_right){setConstLenRight();}if(val != d[st]){return 0;}st %= n;if(st < 0){st += n;}if(const_len_right[st] != n-st || d[st] != d[0]){return const_len_right[st];}if(const_len_right[0] == n){return 1073709056;}return const_len_right[st] + const_len_right[0];}int ConstLenRightCyclic(int st){if(!set_const_len_right){setConstLenRight();}st %= n;if(st < 0){st += n;}if(const_len_right[st] != n-st || d[st] != d[0]){return const_len_right[st];}if(const_len_right[0] == n){return 1073709056;}return const_len_right[st] + const_len_right[0];}int set_dhist;int dhist_mem;int*dhist;T dhist_mn;T dhist_mx;void setDHist(void){int i;int len;set_dhist = 1;if(n==0){return;}dhist_mn = dhist_mx = d[0];for(i=(1);i<(n);i++){if(dhist_mn > d[i]){dhist_mn = d[i];}if(dhist_mx < d[i]){dhist_mx = d[i];}}len = dhist_mx - dhist_mn + 1;if(dhist_mem < len){delete[] dhist;dhist = new int[len];dhist_mem = len;}for(i=(0);i<(len);i++){dhist[i] = 0;}for(i=(0);i<(n);i++){dhist[d[i] - dhist_mn]++;}}int dHist(T x){if(set_dhist==0){setDHist();}if(n == 0 || x < dhist_mn || x > dhist_mx){return 0;}return dhist[x - dhist_mn];}void reset(){set_cumulative_sum = 0;set_const_len_left = 0;set_const_len_right = 0;set_dhist = 0;}void memory_expand(int nn){if(mem < nn){delete[] d;d = new T[nn];mem = nn;}}void malloc(int nn){reset();memory_expand(nn);n = nn;}void setN(int nn){reset();memory_expand(nn);n = nn;}void set(vector<T> &a){int i;int nn = a.size();setN(nn);for(i=(0);i<(nn);i++){d[i] = a[i];}}void set(int nn, T a[]){int i;setN(nn);for(i=(0);i<(nn);i++){d[i] = a[i];}}void free(){destructor();}void constructor(){n = mem = 0;d = NULL;set_cumulative_sum = 0;cumulative_sum_mem = 0;cumulative_sum = NULL;set_const_len_left = 0;const_len_left_mem = 0;const_len_left = NULL;set_const_len_right = 0;const_len_right_mem = 0;const_len_right = NULL;set_dhist = 0;dhist_mem = 0;dhist = NULL;}void constructor(int nn){constructor();malloc(nn);}void destructor(){delete[] d;d = NULL;mem = n = 0;set_cumulative_sum = 0;cumulative_sum_mem = 0;delete[] cumulative_sum;cumulative_sum = NULL;set_const_len_left = 0;const_len_left_mem = 0;delete[] const_len_left;const_len_left = NULL;set_const_len_right = 0;const_len_right_mem = 0;delete[] const_len_right;const_len_right = NULL;set_dhist = 0;dhist_mem = 0;delete[] dhist;dhist = NULL;}Arr1d(){constructor();}Arr1d(int nn){constructor(nn);}~Arr1d(){destructor();}};int N;long long At[200000];long long Bt[200000];Arr1d<long long> A;Arr1d<long long> B;int main(){int i;wmem = memarr;long long res1;long long res2;long long tmp = 0;rd(N);{int Lj4PdHRW;for(Lj4PdHRW=(0);Lj4PdHRW<(N);Lj4PdHRW++){rd(At[Lj4PdHRW]);}}{int e98WHCEY;for(e98WHCEY=(0);e98WHCEY<(N);e98WHCEY++){rd(Bt[e98WHCEY]);}}sortA_L(N,At,Bt);A.set(N,At);B.set(N,Bt);for(i=(0);i<(N);i++){tmp += (A[i] - A[0]) * B[i];}res1 = 0;res2 = tmp;for(i=(1);i<(N);i++){tmp += B.getSum(0,i-1) * (A[i] - A[i-1]);tmp -= B.getSum(i,N-1) * (A[i] - A[i-1]);if(res2 > tmp){res1 = i;res2 = tmp;}}wt_L(A[res1]);wt_L(' ');wt_L(res2);wt_L('\n');return 0;}// cLay varsion 20201003-1// --- original code ---// int N;// ll At[2d5], Bt[2d5];// Arr1d<ll> A, B;// {// ll res1, res2;// ll tmp = 0;// rd(N,At(N),Bt(N));// sortA(N,At,Bt);// A.set(N,At);// B.set(N,Bt);// rep(i,N) tmp += (A[i] - A[0]) * B[i];// res1 = 0;// res2 = tmp;// rep(i,1,N){// tmp += B.getSum(0,i-1) * (A[i] - A[i-1]);// tmp -= B.getSum(i,N-1) * (A[i] - A[i-1]);// if(res2 > tmp){// res1 = i;// res2 = tmp;// }// }// wt(A[res1], res2);// }