社区讨论
求调悬关
P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m2izgi5f
- 此快照首次捕获于
- 2024/10/21 20:18 去年
- 此快照最后确认于
- 2025/11/04 16:35 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
#define int unsigned long long
const int N=2e5+5;
int n,q,W,a[N],Log[N],k,rss=0;
struct seg_T{
struct node{
int lz,s;
}t[N<<2];
inline int ls(int u){
return u<<1;
}
inline int rs(int u){
return u<<1|1;
}
inline void push_up(int u){
t[u].s=t[ls(u)].s+t[rs(u)].s;
}
inline void build(int u,int l,int r){
if(l==r){
t[u].s=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
push_up(u);
}
inline void tag(int u,int l,int r,int k){
t[u].s+=(r-l+1)*k;
t[u].lz+=k;
}
inline void push_dn(int u,int l,int r){
if(t[u].lz){
int mid=(l+r)>>1;
tag(ls(u),l,mid,t[u].lz);
tag(rs(u),mid+1,r,t[u].lz);
t[u].lz=0;
}
}
inline void upd(int u,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
tag(u,l,r,k);return;
}
int mid=(l+r)>>1;
push_dn(u,l,r);
if(ql<=mid){
upd(ls(u),l,mid,ql,qr,k);
}
if(qr>mid){
upd(rs(u),mid+1,r,ql,qr,k);
}
push_up(u);
}
inline int query(int u,int l,int r){
if(l==r){
return k?l:(l-1);
}
int mid=(l+r)>>1;
push_dn(u,l,r);
if(t[ls(u)].s*rss>=k){
return query(ls(u),l,mid);
}else{
k-=t[ls(u)].s*rss;
return query(rs(u),mid+1,r);
}
}
int query_(int u,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r){
return t[u].s;
}
int mid=(l+r)>>1;
int sum=0;
push_dn(u,l,r);
if(ql<=mid) sum+=query_(ls(u),l,mid,ql,qr);
if(qr>mid) sum+=query_(rs(u),mid+1,r,ql,qr);
return sum;
}
}bit;
inline void sol(){
int l,r,k,ans=0;
cin>>l>>r>>k;
bit.upd(1,1,n,l,r,k);
int s=bit.query_(1,1,n,1,n),res=0;
int power=W/s;
up(i,0,60){
if((Log[i]==power)&&(W%s==0)){
cout<<1ll*i*n-1<<'\n';
return;
}
if(Log[i]<=power){
res=i;
}else{
break;
}
}
ans+=1ll*res*n;
// cout<<res<<'\n';
rss=1ll<<res;
k=W-Log[res]*s;
int an=bit.query(1,1,n);
cout<<an<<'\n';
cout<<ans+an<<'\n';
return;
}
int32_t main(){
// freopen("wxyt3.in","r",stdin);
// freopen("my.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>q>>W;
up(i,1,n) cin>>a[i];
bit.build(1,1,n);
Log[0]=0;
up(i,1,60){
Log[i]=Log[i-1]+(1ll<<(i-1));
}
up(i,1,q){
::sol();
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...