QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#187333 | #3850. DJ Darko | Suiseiseki# | TL | 0ms | 0kb | C++14 | 4.4kb | 2023-09-24 16:27:48 | 2023-09-24 16:27:48 |
answer
#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
typedef long long ll;
const int Maxn=200000;
const int Maxb=4000;
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];
std::vector<int> ord[Maxv+5];
std::vector<std::pair<ll,ll> > sum[Maxv+5];
ll lazy[Maxv+5];
void init_build(int b){
int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
ord[b].resize(bel_r-bel_l+1);
for(int i=bel_l;i<=bel_r;i++){
ord[b][i-bel_l]=i;
}
std::sort(ord[b].begin(),ord[b].end(),[&](int p,int q){return a[p].first<a[q].first;});
sum[b].resize(bel_r-bel_l+1);
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);
std::vector<int> l_ord,r_ord;
int pos_l=0,pos_r=0;
l_ord.resize(bel_r-bel_l+1-(r-l+1)),r_ord.resize(r-l+1);
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.begin(),l_ord.end(),r_ord.begin(),r_ord.end(),ord[b].begin(),[&](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;
}
}
std::vector<int> cur_ord;
std::vector<std::pair<ll,ll> > cur_sum;
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(std::pair<ll,ll> &i:sum[b]){
i.first+=lazy[b];
}
lazy[b]=0;
}
void get_new(int l,int r){
cur_ord.clear(),cur_sum.clear();
int bel_l=find_belong(l),bel_r=find_belong(r);
if(bel_l==bel_r){
push_lazy(bel_l);
cur_ord.resize(r-l+1),cur_sum.resize(r-l+1);
int pos=0;
for(int i:ord[bel_l]){
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);
std::vector<int> l_ord,r_ord;
l_ord.resize(l_r-l+1),r_ord.resize(r-r_l+1);
cur_ord.resize(l_ord.size()+r_ord.size());
int pos_l=0,pos_r=0;
for(int i:ord[bel_l]){
if(i>=l){
l_ord[pos_l++]=i;
}
}
for(int i:ord[bel_r]){
if(i<=r){
r_ord[pos_r++]=i;
}
}
std::merge(l_ord.begin(),l_ord.end(),r_ord.begin(),r_ord.end(),cur_ord.begin(),[&](int p,int q){return a[p].first<a[q].first;});
cur_sum.resize(cur_ord.size());
for(int i=0;i<(int)cur_ord.size();i++){
cur_sum[i]=a[cur_ord[i]];
}
for(int i=1;i<(int)cur_ord.size();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.begin(),cur_sum.end(),std::make_pair(a,Inf_ll))-cur_sum.begin();
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++){
pos=std::upper_bound(sum[i].begin(),sum[i].end(),std::make_pair(a-lazy[i],Inf_ll))-sum[i].begin();
ans+=(pos==0?0:cur_sum[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:
200000000000000 1740533035 1817371037 459114294 1200015974 959052673 1550830326 724830797 720225971 965589536 -887149548 -11083534 526278277 624791682 410276618 534293049 520793834 368244608 793150931 496994987 -1299519110 176857224 546754298 -171132361 -262224698 -9535539 57084511 46831742 38382837...