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 |
这题时限卡太死了吧,离散化+radix sort,TLE, 不管怎么改参数就是不过...In Reply To:弱弱地问一下...1 <= m <= 5 000, 是不是要求20s内把5000个case全部跑完? Posted by:qiqilrq at 2007-05-11 11:38:25 #include <iostream> #include <list> using namespace std; const int MIN = 50000; const int MID = 20002; int A[MID]; int C[2 * MID]; int R[MIN]; int main() { int i, j, p, N, M; int st, ed, K; scanf("%d%d", &N, &M); for(i=1; i<=N; i++) { scanf("%d", A+i); } for(i=1; i<=M; i++) { list <int> L[2*MID]; int lt=MID, rt=MID; //left , right int k; memset(C, 0, 2*MID*sizeof(int)); scanf("%d%d%d",&st, &ed, &K); for(j=st; j<=ed; j++) { p=A[j]/MIN + MID; if(A[j]<0) p--; C[p]++; if(p<lt) lt=p; if(p>rt) rt=p; L[p].push_back(A[j] - (p-MID)*MIN); } for(j=lt;K-C[j] > 0 && j<=rt; j++) { K-=C[j]; } //radixSort(j); memset(R, 0, MIN*sizeof(int)); list <int> ::iterator lit; // printf("list element: "); for(lit=L[j].begin(); lit!=L[j].end(); ++lit) { R[*lit]++; // printf("%d ", *lit); } // puts(""); for(k=0; k<MIN; k++) { // printf("R[%d]: %d \n",k, R[k]); if(K-R[k] > 0) K-=R[k]; else break; } printf("%d\n", k + MIN*(j-MID)); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator