QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#187541 | #3850. DJ Darko | Suiseiseki# | TL | 0ms | 0kb | C++14 | 4.2kb | 2023-09-24 17:58:33 | 2023-09-24 17:58:33 |
answer
#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
typedef long long ll;
const int Maxn=200000;
const int Maxb=2000;
const int Maxv=(Maxn-1)/Maxb+1;
const ll Inf_ll=200000000000000ll;
int find_belong(int x){
return (x-1)/Maxb+1;
}
int find_bel_l(int x){
return (x-1)*Maxb+1;
}
int n,q;
int find_bel_r(int x){
return std::min(n,x*Maxb);
}
std::pair<ll,ll> a[Maxn+5];
int ord[Maxv+5][Maxb+5],b_len[Maxv+5];
std::pair<ll,ll> sum[Maxv+5][Maxb+5];
ll lazy[Maxv+5];
void init_build(int b){
int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
b_len[b]=bel_r-bel_l+1;
for(int i=bel_l;i<=bel_r;i++){
ord[b][i-bel_l]=i;
}
std::sort(ord[b],ord[b]+bel_r-bel_l+1,[&](int p,int q){return a[p].first<a[q].first;});
for(int i=0;i<bel_r-bel_l+1;i++){
sum[b][i]=a[ord[b][i]];
}
for(int i=1;i<bel_r-bel_l+1;i++){
sum[b][i].second+=sum[b][i-1].second;
}
}
void rebuild(int b,int l,int r,int v){
int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
l=std::max(l,bel_l),r=std::min(r,bel_r);
static int l_ord[Maxb+5],r_ord[Maxb+5];
int pos_l=0,pos_r=0;
for(int i:ord[b]){
if(l<=i&&i<=r){
r_ord[pos_r++]=i;
}
else{
l_ord[pos_l++]=i;
}
}
for(int i=l;i<=r;i++){
a[i].first+=v;
}
std::merge(l_ord,l_ord+pos_l,r_ord,r_ord+pos_r,ord[b],[&](int p,int q){return a[p].first<a[q].first;});
for(int i=0;i<bel_r-bel_l+1;i++){
sum[b][i]=a[ord[b][i]];
}
for(int i=1;i<bel_r-bel_l+1;i++){
sum[b][i].second+=sum[b][i-1].second;
}
}
int cur_len;
int cur_ord[Maxb<<1|5];
std::pair<ll,ll> cur_sum[Maxb<<1|5];
void push_lazy(int b){
int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
for(int i=bel_l;i<=bel_r;i++){
a[i].first+=lazy[b];
}
for(int j=0;j<b_len[b];j++){
std::pair<ll,ll> &i=sum[b][j];
i.first+=lazy[b];
}
lazy[b]=0;
}
void get_new(int l,int r){
int bel_l=find_belong(l),bel_r=find_belong(r);
if(bel_l==bel_r){
push_lazy(bel_l);
cur_len=r-l+1;
int pos=0;
for(int j=0;j<b_len[bel_l];j++){
int i=ord[bel_l][j];
if(l<=i&&i<=r){
cur_ord[pos++]=i;
}
}
for(int i=0;i<r-l+1;i++){
cur_sum[i]=a[cur_ord[i]];
}
for(int i=1;i<r-l+1;i++){
cur_sum[i].second+=cur_sum[i-1].second;
}
return;
}
push_lazy(bel_l),push_lazy(bel_r);
int l_r=find_bel_r(bel_l),r_l=find_bel_l(bel_r);
static int l_ord[Maxb+5],r_ord[Maxb+5];
cur_len=l_r-l+1+r-r_l+1;
int pos_l=0,pos_r=0;
for(int j=0;j<b_len[bel_l];j++){
int i=ord[bel_l][j];
if(i>=l){
l_ord[pos_l++]=i;
}
}
for(int j=0;j<b_len[bel_r];j++){
int i=ord[bel_r][j];
if(i<=r){
r_ord[pos_r++]=i;
}
}
std::merge(l_ord,l_ord+pos_l,r_ord,r_ord+pos_r,cur_ord,[&](int p,int q){return a[p].first<a[q].first;});
for(int i=0;i<cur_len;i++){
cur_sum[i]=a[cur_ord[i]];
}
for(int i=1;i<cur_len;i++){
cur_sum[i].second+=cur_sum[i-1].second;
}
}
ll query_sum(int l,int r,ll a){
int pos=std::upper_bound(cur_sum,cur_sum+cur_len,std::make_pair(a,Inf_ll))-cur_sum;
ll ans=(pos==0?0:cur_sum[pos-1].second);
int bel_l=find_belong(l),bel_r=find_belong(r);
if(bel_l==bel_r){
return ans;
}
for(int i=bel_l+1;i<bel_r;i++){
int pos=std::upper_bound(sum[i],sum[i]+Maxb,std::make_pair(a-lazy[i],Inf_ll))-sum[i];
ans+=(pos==0?0:sum[i][pos-1].second);
}
return ans;
}
ll sum_b[Maxn+5];
ll query(int l,int r){
get_new(l,r);
ll cur_all=sum_b[r]-sum_b[l-1];
ll left=-Inf_ll,right=Inf_ll;
while(left<right){
ll mid=floor((left+right)/2.0l);
if(query_sum(l,r,mid)>=cur_all/2){
right=mid;
}
else{
left=mid+1;
}
}
return left;
}
void modify(int l,int r,int a){
int bel_l=find_belong(l),bel_r=find_belong(r);
if(bel_l==bel_r){
rebuild(bel_l,l,r,a);
return;
}
rebuild(bel_l,l,r,a),rebuild(bel_r,l,r,a);
for(int i=bel_l+1;i<bel_r;i++){
lazy[i]+=a;
}
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].first);
}
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].second);
}
for(int i=1;i<=n;i++){
sum_b[i]=sum_b[i-1]+a[i].second;
}
for(int i=1;i<=find_belong(n);i++){
init_build(i);
}
for(int i=1;i<=q;i++){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==1){
int x;
scanf("%d",&x);
modify(l,r,x);
}
else{
printf("%lld\n",query(l,r));
}
}
return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
200000 200000 185413631 745038744 881479208 394948467 101727403 796960399 284541402 80768155 286582974 546327406 197495962 552359542 727479505 437895671 143092948 7626834 741609268 540494577 298656274 548860413 41137417 210529949 658779847 161355446 486548926 602900245 119414972 310187428 238177860 ...
output:
462406736 1749348519 1825400336 467651597 1203850537 960500120 1547426790 724377526 713736203 964188422 -893932302 -7385440 534421341 628792184 410247671 525257073 524967019 386561322 805092443 505998243 -1297430136 181637713 549833468 -155945466 -256964932 9160240 41787442 32565247 379410404 -20250...