QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#671684 | #5417. Chat Program | hansue# | TL | 14ms | 15024kb | C++20 | 2.6kb | 2024-10-24 14:02:03 | 2024-10-24 14:02:03 |
Judging History
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){
s.clear();
memset(sum,0,sizeof(sum));
int res=0;
tot_ori=0;
tot=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;
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;
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();
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: 15024kb
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: 14ms
memory: 14596kb
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: 14ms
memory: 14528kb
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 ...