Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34125 liuziming 【S】T1 C++ 通过 100 823 MS 11904 KB 3905 2024-11-03 15:12:32

Tests(10/10):


#include<bits/stdc++.h> #define int long long using namespace std; int i,j,t,n,k,c[500010],a[500010],sum[500010],now[500010],ans=-1e12,nowlen,nowtot; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f*=-1; ch=getchar(); }while('0'<=ch&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }return x*f; }deque<pair<int,int>> nowmax; deque<pair<int,int>> nowmin; inline bool cmp(int a,int b){ return a>b; }inline int run(int l){ //cout<<x<<' '<<l<<'\n'; nowtot=0; nowmax.push_back(make_pair(1,a[1])); nowmin.push_back(make_pair(1,a[1])); for(i=1;i+l-1<=n;i++){ int r=i+l-1; //cout<<i<<' '<<r<<'\n'; if(i==1){ for(j=1;j<=r;j++){ while(nowmax.size()&&nowmax.back().second<=a[j]){ nowmax.pop_back(); }nowmax.push_back(make_pair(j,a[j])); while(nowmin.size()&&nowmin.back().second>=a[j]){ nowmin.pop_back(); }nowmin.push_back(make_pair(j,a[j])); } }while(nowmax.size()&&nowmax.back().second<=a[r]){ nowmax.pop_back(); }nowmax.push_back(make_pair(r,a[r])); while(nowmin.size()&&nowmin.back().second>=a[r]){ nowmin.pop_back(); }nowmin.push_back(make_pair(r,a[r])); while(nowmax.size()&&nowmax.front().first<i){ nowmax.pop_front(); }while(nowmin.size()&&nowmin.front().first<i){ nowmin.pop_front(); } now[++nowtot]=nowmax.front().second-nowmin.front().second; }sort(now+1,now+nowtot+1,cmp); nowmax.clear(); nowmin.clear(); return now[k]; }inline int bs_to_findl(int x){ int l=1,r=n-k+1,mid=0; while(l<r){ mid=(l+r)>>1; if(run(mid)>=x){ r=mid; }else{ l=mid+1; } }if(run(r)>=x){ return r; }else{ return 0; } }signed main(){ //ios::sync_with_stdio(0); //freopen("choose.in","r",stdin); //freopen("choose.out","w",stdout); //cin>>t; t=read(); while(t--){ //cout<<t<<'\n'; n=read();k=read(); memset(c,0,sizeof(c)); ans=-1e12;nowlen=0; for(int i=1;i<=n;i++){ a[i]=read(); } // cout<<n<<' '<<k<<'\n'; // for(int i=1;i<=n;i++){ // cout<<a[i]<<' '; // } int maxx=run(n-k+1); //cout<<maxx<<'\n'; //fflush(stdout); nowmax.clear();nowmin.clear(); int r=1; deque<pair<int,int>> nowmax;nowmax.push_back(make_pair(1,a[1])); deque<pair<int,int>> nowmin;nowmin.push_back(make_pair(1,a[1])); for(int i=1;i<=n;i++){ while(nowmax.size()&&nowmax.front().first<i){ nowmax.pop_front(); }while(nowmin.size()&&nowmin.front().first<i){ nowmin.pop_front(); }while(r<i){ r++; }while(r<=n){ if(nowmax.front().second-nowmin.front().second>=maxx){ //cout<<i<<' '<<r<<'\n'; c[r-i]++; c[n-i+1]--; break; }r++; while(nowmax.size()&&nowmax.back().second<=a[r]){ nowmax.pop_back(); }nowmax.push_back(make_pair(r,a[r])); while(nowmin.size()&&nowmin.back().second>=a[r]){ nowmin.pop_back(); }nowmin.push_back(make_pair(r,a[r])); } }int sum=0; for(int i=1;i<=n;i++){ sum=sum+c[i-1]; if(sum>=k){ cout<<maxx<<' '<<i<<"\n"; break; } } } }


测评信息: