QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#671707#5417. Chat Programhansue#TL 15ms16004kbC++202.6kb2024-10-24 14:08:242024-10-24 14:08:25

Judging History

你现在查看的是最新测评结果

  • [2024-10-24 14:08:25]
  • 评测
  • 测评结果:TL
  • 用时:15ms
  • 内存:16004kb
  • [2024-10-24 14:08:24]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAX=2e5+5;
int n,k,m,c,d;
int a[MAX],tmp[MAX];
int ori[MAX],tot_ori;
set<int> s;
int g[MAX],tot;
int sum[MAX*4];

int findf(int x){
	int l=1,r=tot,res=-1;
	while(l<=r){
		int mid=l+r>>1;
		if(g[mid]>=x){
			res=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	return res;
}
void modify(int k,int l,int r,int p,int v){
	if(r<p||l>p)
		return;
	if(l==r&&l==p){
		sum[k]+=v;
		return;
	}
	int mid=l+r>>1;
	modify(k<<1,l,mid,p,v);
	modify(k<<1|1,mid+1,r,p,v);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
int query(int k,int l,int r,int x,int y){
	if(y<l||x>r)
		return 0;
	if(l>=x&&r<=y)
		return sum[k];
	int mid=l+r>>1;
	int res=0;
	res=query(k<<1,l,mid,x,y);
	res+=query(k<<1|1,mid+1,r,x,y);
	return res;
}
bool check(int x){
	memset(sum,0,sizeof(sum));
	int res=0;
	tot_ori=0;
	
	for(int i=1;i<=n;++i){
		if(a[i]>=x)
			tot_ori++;
	}
	ori[1]=0;
	for(int i=1;i<=m;++i){
		if(a[i]>=x)
			ori[1]++;
	}
	for(int i=2;i+m-1<=n;++i){
		ori[i]=ori[i-1];
		if(a[i-1]>=x)
			ori[i]--;
		if(a[i+m-1]>=x)
			ori[i]++;
//		cout<<"(("<<i<<" "<<ori[i]<<endl;
	}
//	cout<<tot_ori<<endl;

	x-=c;
	for(int i=n-m+1;i<=n;++i){
		int p=findf(tmp[i]);
		modify(1,1,tot,p,1);
	}	
	int p=findf(x);
	if(p!=-1)
		res=max(res,query(1,1,tot,p,tot)+tot_ori-ori[n-m+1]);
	
	for(int i=n-m;i>=1;--i){
		x-=d;
		int p=findf(tmp[i+m]);
		modify(1,1,tot,p,-1);
		p=findf(tmp[i]);
//		cout<<"&"<<g[p]<<endl;
		modify(1,1,tot,p,1);
		p=findf(x);
//		cout<<"@"<<g[p]<<endl;
		if(p!=-1)
			res=max(res,query(1,1,tot,p,tot)+tot_ori-ori[i]);
//		cout<<i<<" * "<<query(1,1,tot,p,tot)+tot_ori-ori[i]<<" "<<ori[i]<<endl;
	}
//	cout<<res<<"*"<<endl;
	return res>=k;
}
int read(){
	int x = 0, f = 1;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-'){
			f = -1;
		}
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x*f;
}
signed main(){
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	cin>>n>>k>>m>>c>>d;
	for(int i=1;i<=n;++i)
		a[i]=read();
		
	for(int i=1;i<=n;++i)
		tmp[i]=a[i];	
	int cur=0;
	for(int i=1;i<=m;++i){
		tmp[n-m+i]+=cur;
		cur+=d;
	}
	cur=0;
	for(int i=n-m+1;i>=1;--i){
		tmp[i]+=cur;
		cur-=d;
	}
	
	for(int i=1;i<=n;++i){
		s.insert(tmp[i]);
	}
	for(set<int>::iterator i=s.begin();i!=s.end();++i)
		g[++tot]=*i;
		
	int l=0,r=2e15,res;
//	check(9);
	while(l<=r){
		int mid=l+r>>1;
	//	cout<<mid<<endl;
		if(check(mid)){
			res=mid;
			l=mid+1;
		}
		else
			r=mid-1;
	}
	cout<<res;
	return 0;

}


Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 11ms
memory: 13956kb

input:

6 4 3 1 2
1 1 4 5 1 4

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: 0
Accepted
time: 12ms
memory: 16004kb

input:

7 3 2 4 0
1 9 1 9 8 1 0

output:

9

result:

ok 1 number(s): "9"

Test #3:

score: 0
Accepted
time: 15ms
memory: 13948kb

input:

8 3 5 0 0
2 0 2 2 1 2 1 8

output:

2

result:

ok 1 number(s): "2"

Test #4:

score: -100
Time Limit Exceeded

input:

200000 200000 100000 0 1000000000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:


result: