【bzoj4695】最假女选手

zcy的励志故事.jpg

傻逼zcy突然想立一个flag,写一个segment-tree-beats的题娱乐一下

于是他就想起了这道题。

他打算今晚写完

然后光是写他就写的头昏脑涨,还犯了询问写反这种傻逼错误

后来他发现调不出来了

然后调了快2h,写个暴力对拍才发现pushup写的是萎的。

这题其实就是很恶心的吧操作扔在一起

但是还是维护最大值,最大值出现次数,次大值能解决的问题。

标记合并的时候注意讨论下,细节有点多,样例比较彩笔

建议提交之前先测试所有操作或者跟暴力对拍。

#include<bits/stdc++.h>
#define N 600005
#define lson (o<<1)
#define rson (o<<1|1)
#define inf 1<<30
using namespace std;
typedef long long ll;
int n;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘);
    do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘);
    return f*x;
}
//Segment-Tree-Beats!
int maxv[N<<2],seca[N<<2],cnta[N<<2],minv[N<<2],seci[N<<2],cnti[N<<2],tagv[N<<2];
ll sumv[N<<2];
inline void pushup(int o){
  int l=o<<1,r=o<<1|1;sumv[o]=sumv[l]+sumv[r];
  if(maxv[l]==maxv[r])maxv[o]=maxv[l],cnta[o]=cnta[l]+cnta[r],seca[o]=max(seca[l],seca[r]);
  else{
    if(maxv[l]>maxv[r]) swap(l,r);maxv[o]=maxv[r]; cnta[o]=cnta[r];seca[o]=max(seca[r],maxv[l]);
  }
  if(minv[l]==minv[r])
    minv[o]=minv[l],cnti[o]=cnti[l]+cnti[r],seci[o]=min(seci[l],seci[r]);
  else{
    if(minv[l]<minv[r]) swap(l,r);minv[o]=minv[r]; cnti[o]=cnti[r];seci[o]=min(seci[r],minv[l]);
  }
}
inline void puttag(int o,int l,int r,int v){
    tagv[o]+=v;sumv[o]+=(ll)(r-l+1)*v;
    minv[o]+=v;maxv[o]+=v;seca[o]+=v;seci[o]+=v;
}
inline void tmax(int o,int l,int r,int v){
    sumv[o]+=(ll)(cnti[o])*(v-minv[o]);
    minv[o]=v;maxv[o]=max(v,maxv[o]);
    if(minv[o]==maxv[o]){
        sumv[o]=1LL*(r-l+1)*v;cnta[o]=cnti[o]=r-l+1;seca[o]=-inf;seci[o]=inf;
    }else seca[o]=max(v,seca[o]);
}
inline void tmin(int o,int l,int r,int v){
    sumv[o]-=(ll)(cnta[o])*(maxv[o]-v);
    maxv[o]=v;minv[o]=min(v,minv[o]);
    if(maxv[o]==minv[o]){
        sumv[o]=(ll)(r-l+1)*v;cnta[o]=cnti[o]=r-l+1;seca[o]=-inf;seci[o]=inf;
    }else seci[o]=min(v,seci[o]);
}
inline void pushdown(int o,int l,int r){
    int mid=(l+r)>>1;
    if(tagv[o]){
        puttag(lson,l,mid,tagv[o]);puttag(rson,mid+1,r,tagv[o]);
        tagv[o]=0;
    }
    if(maxv[lson]>maxv[o]&&seca[lson]<maxv[o])tmin(lson,l,mid,maxv[o]);
    if(maxv[rson]>maxv[o]&&seca[rson]<maxv[o])tmin(rson,mid+1,r,maxv[o]);
    if(minv[lson]<minv[o]&&seci[lson]>minv[o])tmax(lson,l,mid,minv[o]);
    if(minv[rson]<minv[o]&&seci[rson]>minv[o])tmax(rson,mid+1,r,minv[o]);
}
void build(int o,int l,int r){
    tagv[o]=0;
    if(l==r){
        int x=read();
        sumv[o]=maxv[o]=minv[o]=x;cnta[o]=cnti[o]=1;seca[o]=-inf;seci[o]=inf;tagv[o]=0;return;
    }
    int mid=(l+r)>>1;
    build(lson,l,mid);build(rson,mid+1,r);
    pushup(o);
}
void changemax(int o,int l,int r,int ql,int qr,int v){
    if(minv[o]>=v)return;
    if(ql<=l&&r<=qr&&v<seci[o]){tmax(o,l,r,v);return;}
    pushdown(o,l,r);int mid=(l+r)>>1;
    if(ql<=mid)changemax(lson,l,mid,ql,qr,v);
    if(qr>mid)changemax(rson,mid+1,r,ql,qr,v);
    pushup(o);
}
void changemin(int o,int l,int r,int ql,int qr,int v){
    if(maxv[o]<=v)return;
    if(ql<=l&&r<=qr&&v>seca[o]){tmin(o,l,r,v);return;}
    pushdown(o,l,r);int mid=(l+r)>>1;
    if(ql<=mid)changemin(lson,l,mid,ql,qr,v);
    if(qr>mid)changemin(rson,mid+1,r,ql,qr,v);
    pushup(o);
}
void add(int o,int l,int r,int ql,int qr,int v){
    if(ql<=l&&r<=qr){puttag(o,l,r,v);return;}
    pushdown(o,l,r);int mid=(l+r)>>1;
    if(ql<=mid)add(lson,l,mid,ql,qr,v);
    if(qr>mid)add(rson,mid+1,r,ql,qr,v);
    pushup(o);
}
int querymax(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return maxv[o];
    pushdown(o,l,r);int mid=(l+r)>>1,ans=-inf;
    if(ql<=mid)ans=max(ans,querymax(lson,l,mid,ql,qr));
    if(qr>mid)ans=max(ans,querymax(rson,mid+1,r,ql,qr));
    return ans;
}
int querymin(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return minv[o];
    pushdown(o,l,r);int mid=(l+r)>>1,ans=inf;
    if(ql<=mid)ans=min(ans,querymin(lson,l,mid,ql,qr));
    if(qr>mid)ans=min(ans,querymin(rson,mid+1,r,ql,qr));
    return ans;
}
ll querysum(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return sumv[o];
    pushdown(o,l,r);int mid=(l+r)>>1;ll ans=0;
    if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
    if(qr>mid)ans+=querysum(rson,mid+1,r,ql,qr);
    return ans;
}
//End of Segment Tree
int main(){
    n=read();build(1,1,n);
    int T=read();
    while(T--){
        int opt=read(),l=read(),r=read(),v;
        if(opt==1)v=read(),add(1,1,n,l,r,v);
        if(opt==2)v=read(),changemax(1,1,n,l,r,v);
        if(opt==3)v=read(),changemin(1,1,n,l,r,v);
        if(opt==4)printf("%lld\n",querysum(1,1,n,l,r));
        if(opt==5)printf("%d\n",querymax(1,1,n,l,r));
        if(opt==6)printf("%d\n",querymin(1,1,n,l,r));
    }
}

这个代码可读性挺不错的,而且只有120行

时间: 2024-08-07 00:17:30

【bzoj4695】最假女选手的相关文章

bzoj4695 最假女选手

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4695 [题解] SegmentTree beats!(见jiry_2论文/营员交流) 考虑只有对p取max,区间加,查min/和怎么做. 有一道类似的题,是取min,见hdu5306. 按照segmentbeats这套理论,我们要维护最小值,最小值出现个数,次小值即可. 每次区间对$p$取max,如果当前节点满足$min < p < sec$,那么打区间max标记,而且我们也可以很方便算

HDU4695 最假女选手(吉司机线段树)

本题原理和代码讲解会在近日放到b站,对题目解法不是很了解的同学可以关注b站 朝暮不思 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<cstring> #include<map> #include<set> using

真硅谷巨骗、假女版乔布斯覆灭记:4星|《坏血》

详尽还原所谓“女版乔布斯”的硅谷创业明星.独角兽公司希拉洛斯及其创始人伊丽莎白的发展与覆灭历史. 伊丽莎白精力充沛,充满梦想,崇拜并刻意模仿乔布斯.她在2002年被斯坦福录取,2003年秋天辍学创业,想发明一种薄薄的贴片,实时监测病人身体状况并实时治疗.她顺利筹到了启动资金,在公司启动后想法略有收敛,改为迷你生化仪+一滴血实时检测. 公司多次筹得巨额资金,并说服了沃尔格林连锁药店和西夫韦连锁零售店两个巨头跟其合作,在门店部署便捷一滴血检测仪. 实际上希拉洛斯的产品一直停留在原型阶段,从来不可用.

关于吉利线段树

引言 这玩意儿又称\(Segment\ Tree\ Beats\) .由吉老师.\(Picks\).美国队长三位知名毒瘤发明. 我的精神受到了污染...... 线段树简介 线段树什么的太难了,不是很会啊..... 线段树最强的地方在于,如果标记支持合并,那么我们就能够快速进行区间修改了. 一类特殊标记 维护这样一个标记\((a,b)\) ,表示\(x\to max(x + a , b)\) . 显然标记可合并:\((a,b) + (c,d) = (a + c , max(b + c , d))\

大海扬波,靠地球自转、潮汐和飓风

忠诚,就忠诚自己的土壤: 追求,就追求自己的理想. --引自友人的诗 这是一曲振奋人心的搏斗之歌.它的主旋律,就是祖国的荣誉高于一切! 人们把体育比喻为一个民族精神的橱窗.那么,就让我们打开中国女排这个小小的窗口,看一看我们中华民族应有的精神风貌吧! 挥动黄手绢唱的歌 公元一千九百七十七年深秋.苍茫的暮色,笼罩着日本的商业都市大阪. 中国女排姑娘们乘坐的大型轿车,顺着五光十色的街道缓缓向前行驶. 多彩的夜景,与中国姑娘们喜悦的心境是相吻合的.今晚,一九七七年世界杯排球赛进入最后一个高潮--发奖.

新手福利

之所以写这篇文章,是因为我在上周六的飞镖比赛中,输给了一个玩镖没有我久的女选手,不禁令我感叹,长江后浪推前浪.之前我们队与她所在的队伍在联赛中也有过碰面,那时候的她投掷其他区域都不怎么精准,唯独19特别好.但是今天再遇到她,已经全部区域都能很精准地命中了.虽然我觉得,也许再和她对战一局,我或许能够取得胜利,但是不得不承认,现在比我起步晚的飞镖爱好者越来越多,而实力在我之上的也大有人在了. 记得我刚玩飞镖时,指点我的是一个Rating7级的日本爷爷,那时候我也以他为榜样.但是几个月后,我就超过了他

网红淘宝店的成与败

近年来,随着直播的人气火热上升,越来越多的网红出现在我们的眼前.很多人都想成为网红,为什么呢?因为他们有人气,有喜欢自己的粉丝,而他们能通过这些粉丝和人气来获取利益,例如通过自己的人气接广告或卖东西给喜欢自己的粉丝.这就是为什么淘宝里有越来越多的网红店,他们通过自身的人气效应给自己打广告,在直播或博客中秀出自己店里的商品. 想要了解网红淘宝店的成与败,我们先来谈论网红淘宝店的运营方式.网红淘宝店当然老板是网红,但其实在幕后有一个操作团体,他们不仅起到封装网红的作用,还帮他们进货出货,网红只要负责

apio2017游记

//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意,O(Tn^2)暴力ac了T<=100,n<=10000,这符合基本法吗)day-3-day-1 感觉期中考完挂day0 8:30的东航航班,因为"一带一路"会议,要提前三小时到机场,凌晨三点半起床,这时机场大巴都还没有的,幸好领队老师和coder107同乘一辆车,前一天说好捎了

【五】PHP数组操作函数(未完)

1.输出数组的结构:bool print_r(数组); $arr=array('jack','mike','tom'); print_r($arr);//Array ( [0] => jack [1] => mike [2] => tom ) 2.如何声明二位数组? $arr=array('name'=>array('jack','mike'),'sex'=>array('man','woman')); print_r($arr);//Array ( [name] =>