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 |
为什么会Runtime Error呢?好神奇。。基本思想就是用一个set存下 各个值及其位置 然后,每次循环时确保set的begin() 和 end()-1处的值在window范围里边 取出最大,最小值,放进两个vector里边,按理说复杂度 O(nlogn)应该没有问题阿 #include<iostream> #include<set> #include<vector> #include<iterator> using namespace std; //array是输入数组 int array[1000010]; //Elem记录值以及值的位置 class Elem { public: int value; int pos; friend bool operator < (const Elem& e1, const Elem& e2) { if(e1.value==e2.value) return e1.pos<e2.pos; return e1.value<e2.value; } }; //如果n<k,简单情形,直接打印 void Simplify(int N,int K) { int imin=array[0]; int imax=array[0]; int i; for(i=1;i<N;i++){ if(array[i]<imin)imin=array[i]; if(array[i]>imax)imax=array[i]; } cout<<imin<<endl <<imax<<endl; return ; } int main() { set<Elem> data; set<Elem>::iterator it; int n,k; cin>>n>>k; Elem e; int i,j; for(i=0;i<n;i++)cin>>array[i]; if(n<=k){ Simplify(n,k); return 0; } //先将前k个数,全部放进一个set里边 for(i=0;i<k;i++) { e.value=array[i]; e.pos=i; data.insert(e); } //存储最大值,最小值 vector<int> minV; vector<int> maxV; it=data.begin(); minV.push_back(it->value); it=data.end();it--; maxV.push_back(it->value); j=0; //后边的数,依次放进set, for(i=k;i<n;i++) { int startPos=i-k+1; e.value=array[i]; e.pos=i; //去掉window以外的数 while(1) { it=data.begin(); if(it->pos < startPos) data.erase(it); else break; } while(1) { it=data.end(); it--; if(it->pos < startPos) data.erase(it); else break; } data.insert(e); it=data.begin(); minV.push_back(it->value); it=data.end();it--; maxV.push_back(it->value); } //输出结果 for(i=0;i<(n-k);i++) cout<<minV[i]<<" "; cout<<minV[n-k]<<endl; for(i=0;i<(n-k);i++) cout<<maxV[i]<<" "; cout<<maxV[n-k]<<endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator