社区讨论
蒟蒻,0分求调分块(qwq)
P5356[Ynoi Easy Round 2017] 由乃打扑克参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo1zahqk
- 此快照首次捕获于
- 2023/10/23 05:26 2 年前
- 此快照最后确认于
- 2023/11/03 05:50 2 年前
一直 wa 有时还会 T.
分块(Ynoi)萌新求大佬。悬赏关注!!!
WA & TLE Code
CPP#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,a[N],b[N],add[N];
int op,x,y,k;
int block,cnt,l[N],r[N],pos[N];
void build_block(){
block=sqrt(n);
cnt=n/block;
if(n%block) cnt++;
for(int i=1;i<=cnt;i++)
l[i]=(i-1)*block+1,r[i]=i*block;
r[cnt]=n;
for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
for(int i=1;i<=cnt;i++)
sort(b+l[i],b+r[i]+1);
}
void modify(int L,int R,int v){
int p=pos[L],q=pos[R];
if(p==q){
for(int i=L;i<=R;i++) a[i]+=v;
for(int i=l[p];i<=r[p];i++) b[i]=a[i];
sort(b+l[p],b+r[p]+1);
}else{
for(int i=p+1;i<=q-1;i++) add[i]+=v;
for(int i=L;i<=r[p];i++) a[i]+=v;
for(int i=l[p];i<=r[p];i++) b[i]=a[i];
sort(b+l[p],b+r[p]+1);
for(int i=l[q];i<=R;i++) a[i]+=v;
for(int i=l[q];i<=r[q];i++) b[i]=a[i];
sort(b+l[q],b+r[q]+1);
}
}
int query(int L,int R,int c){
int p=pos[L],q=pos[R],ans=0;
if(p==q){
for(int i=L;i<=R;i++)
if(a[i]+add[p]<c) ans++;
}else{
for(int i=L;i<=r[p];i++)
if(a[i]+add[p]<c) ans++;
for(int i=l[q];i<=R;i++)
if(a[i]+add[q]<c) ans++;
for(int i=p+1;i<=q-1;i++){
int ll=l[i],rr=r[i],mid,res=0;
while(ll<=rr){
mid=(ll+rr)>>1;
if(b[mid]+add[i]<=c) res=mid-l[i],rr=mid-1;
else ll=mid+1;
}
ans+=res;
}
}
return ans+1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
build_block();
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&op,&x,&y,&k);
if(op==2) modify(x,y,k);
else{
int L=-1e6,R=1e6,mid,ans=-1;
while(L<=R){
mid=(L+R)>>1;
int temp=query(x,y,mid);
if(temp>=k) ans=mid,R=mid-1;
else L=mid+1;
}
printf("%d\n",ans-1);
}
}
return 0;
}
/*
7 4
-1 2 -5 7 6 -3 1
1 2 5 2
2 3 6 1
2 1 4 2
1 1 7 3
10 6
2 3 5 6 4 4 10 -1 4 6
1 4 9 3
2 1 5 -1
2 3 7 3
1 2 8 4
2 1 10 1
1 1 10 5
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...