Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用连续区间最大值的O(N)的放爷算法,516s水过//============================================================================ // Name : main2019.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <deque> using namespace std; class nwidx{ public: int num; int idx; nwidx(int n, int i): num(n), idx(i){} }; void findMax(int N, int B, int K, int *src, int *tar){ deque<nwidx> dq; for(int i = 0; i < N; i++){ nwidx temp(src[i*K], i); while(!dq.empty() && dq.front().idx <= i - B){ dq.pop_front(); } while(!dq.empty() && dq.back().num <= temp.num){ dq.pop_back(); } dq.push_back(temp); if(i >= B-1) tar[(i-B+1)*K] = dq.front().num; } } void findMin(int N, int B, int K, int *src, int *tar){ deque<nwidx> dq; for(int i = 0; i < N; i++){ nwidx temp(src[i*K], i); while(!dq.empty() && dq.front().idx <= i - B){ dq.pop_front(); } while(!dq.empty() && dq.back().num >= temp.num){ dq.pop_back(); } dq.push_back(temp); if(i >= B-1) tar[(i-B+1)*K] = dq.front().num; } } int main() { int N, B, Q; cin >> N >> B >> Q; if(B == 1){ for(int i = 0; i < Q; i++){ cout << 0 << endl; } return 0; } int field[62501]; int max1[62501], max2[62501]; int min1[62501], min2[62501]; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ cin >> field[i * N + j]; } } for(int i = 0; i < N; i++){ findMax(N, B, 1, field+i*N, max1+i*(N-B+1)); findMin(N, B, 1, field+i*N, min1+i*(N-B+1)); } for(int i = 0; i < N-B+1; i++){ findMax(N, B, N-B+1, max1+i, max2+i); findMin(N, B, N-B+1, min1+i, min2+i); } /* for(int i = 0; i < N*(N-B+1); i++){ cout << max1[i] << " "; } cout << endl; for(int i = 0; i < N*(N-B+1); i++){ cout << min1[i] << " "; } cout << endl; for(int i = 0; i < (N-B+1)*(N-B+1); i++){ cout << max2[i] << " "; } cout << endl; for(int i = 0; i < (N-B+1)*(N-B+1); i++){ cout << min2[i] << " "; } cout << endl; */ for(int i = 0; i < Q; i++){ int x, y; cin >> x >> y; x--; y--; cout << max2[x*(N-B+1)+y] - min2[x*(N-B+1)+y] << endl; } //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator