我好像被卡空间了啊?
惨啊..
代码好丑啊QAQ
考虑更新
类似VEB Tree的记录当前最大值
不过这样子还是不容易更新最小值的 于是记录一个次大值 和最大值个数便于更新
对于最大值用类似方法维护

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char c;
#define ll long long
bool flag;
inline void read(int&a)
{a=0;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));c=c=='-'?flag=true,getchar():c;while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();a=flag?flag=false,-a:a;
}
constint INF=1<<29;
struct Seg
{int maxtime,fmax,smax;//int l,r;int mintime,fmin,smin;int maxtag,mintag,addtag;ll sum;Seg(){}Seg(int data):maxtag(-INF),fmax(data),smax(-INF),maxtime(1),mintag(-INF),fmin(data),smin(INF),mintime(1),addtag(0),sum(data)//l(l),r(r){}
}T[2000001];
void Min(int&a,int b){a<b?a:a=b;}
void Max(int&a,int b){a>b?a:a=b;}
void MinTag(int place,int tag,int L,int R)
{if(T[place].fmax<=tag)return;T[place].sum-=(T[place].fmax-tag)*1ll*T[place].maxtime;T[place].fmax=tag;//Min(T[place].fmin,tag);if(R-L+1==T[place].maxtime)Min(T[place].fmin,tag);else Min(T[place].smin,tag);T[place].mintag=tag;if(T[place].maxtag^-INF)if(T[place].maxtag>T[place].mintag)T[place].maxtag=T[place].mintag;
}
void MaxTag(int place,int tag,int L,int R)
{if(T[place].fmin>=tag)return;T[place].sum-=(T[place].fmin-tag)*1ll*T[place].mintime;T[place].fmin=tag;if(R-L+1==T[place].maxtime)Max(T[place].fmax,tag);else Max(T[place].smax,tag);T[place].maxtag=tag;if(T[place].mintag^-INF)if(T[place].maxtag>T[place].mintag)T[place].mintag=T[place].maxtag;
}void AddTag(int place,int tag,int L,int R)
{T[place].sum+=tag*1ll*(R-L+1);T[place].fmax+=tag;if(R-L+1!=T[place].maxtime)T[place].smax+=tag;T[place].fmin+=tag;if(R-L+1!=T[place].maxtime)T[place].smin+=tag;//T[place].smin+=tag;T[place].addtag+=tag;if(T[place].maxtag!=-INF)T[place].maxtag+=tag;if(T[place].mintag!=-INF)T[place].mintag+=tag;
}
void Push(int place,int L,int R)
{int mid=L+R>>1;if(T[place].addtag){AddTag(place<<1,T[place].addtag,L,mid);AddTag(place<<1|1,T[place].addtag,mid+1,R);T[place].addtag=0;}if(T[place].maxtag^-INF){MaxTag(place<<1,T[place].maxtag,L,mid);MaxTag(place<<1|1,T[place].maxtag,mid+1,R);T[place].maxtag=-INF;}if(T[place].mintag^-INF){MinTag(place<<1,T[place].mintag,L,mid);MinTag(place<<1|1,T[place].mintag,mid+1,R);T[place].mintag=-INF;}}void Up(int place)
{T[place].maxtime=T[place].mintime=0;int lc=place<<1,rc=lc|1;T[place].sum=T[lc].sum+T[rc].sum;if(T[lc].fmax==T[rc].fmax){T[place].fmax=T[rc].fmax;T[place].maxtime=T[lc].maxtime+T[rc].maxtime;T[place].smax=max(T[lc].smax,T[rc].smax);}else if(T[lc].fmax>T[rc].fmax){T[place].fmax=T[lc].fmax;T[place].maxtime=T[lc].maxtime;T[place].smax=max(T[lc].smax,T[rc].fmax);}else{T[place].fmax=T[rc].fmax;T[place].maxtime=T[rc].maxtime;T[place].smax=max(T[rc].smax,T[lc].fmax);}if(T[lc].fmin==T[rc].fmin){T[place].fmin=T[rc].fmin;T[place].mintime=T[lc].mintime+T[rc].mintime;T[place].smin=min(T[lc].smin,T[rc].smin);}else if(T[lc].fmin<T[rc].fmin){T[place].fmin=T[lc].fmin;T[place].mintime=T[lc].mintime;T[place].smin=min(T[lc].smin,T[rc].fmin);}else{T[place].fmin=T[rc].fmin;T[place].mintime=T[rc].mintime;T[place].smin=min(T[rc].smin,T[lc].fmin);}
}void MIN(int place,int l,int r,int p,int L,int R)
{if(T[place].fmax<=p){return;}if(L>=l&&R<=r&&T[place].fmax>p&&T[place].smax<p){return MinTag(place,p,L,R);}Push(place,L,R);int Mid=L+R>>1;if(l<=Mid)MIN(place<<1,l,r,p,L,Mid);if(r>Mid)MIN(place<<1|1,l,r,p,Mid+1,R);Up(place);
}void MAX(int place,int l,int r,int p,int L,int R)
{if(T[place].fmin>=p){return;}if(L>=l&&R<=r&&T[place].fmin<p&&T[place].smin>p){return MaxTag(place,p,L,R);}Push(place,L,R);int Mid=L+R>>1;if(l<=Mid)MAX(place<<1,l,r,p,L,Mid);if(r>Mid)MAX(place<<1|1,l,r,p,Mid+1,R);Up(place);
}
void Add(int place,int l,int r,int tag,int L,int R)
{if(L>=l&&R<=r)return AddTag(place,tag,L,R);Push(place,L,R);int mid=L+R>>1;if(mid>=l)Add(place<<1,l,r,tag,L,mid);if(mid<r)Add(place<<1|1,l,r,tag,mid+1,R);Up(place);
}ll Sum(int place,int l,int r,int L,int R)
{if(L>=l&&R<=r)return T[place].sum;Push(place,L,R);int mid=L+R>>1;ll res=0;if(mid>=l)res+=Sum(place<<1,l,r,L,mid);if(mid<r)res+=Sum(place<<1|1,l,r,mid+1,R);return res;
}int Querymin(int place,int l,int r,int L,int R)
{if(L>=l&&R<=r)return T[place].fmin;Push(place,L,R);int mid=L+R>>1;int res=INF;if(mid>=l)Min(res,Querymin(place<<1,l,r,L,mid));if(mid<r)Min(res,Querymin(place<<1|1,l,r,mid+1,R));return res;
}int Querymax(int place,int l,int r,int L,int R)
{if(L>=l&&R<=r)return T[place].fmax;int mid=L+R>>1;Push(place,L,R);int res=-INF;if(mid>=l)Max(res,Querymax(place<<1,l,r,L,mid));if(mid<r)Max(res,Querymax(place<<1|1,l,r,mid+1,R));return res;
}int Data[1000001];
void Build(int place,int l,int r)
{T[place]=Seg(Data[l]);if(l^r)Build(place<<1,l,r+l>>1),Build(place<<1|1,1+(r+l>>1),r),Up(place);
}
void out(ll a)
{if(a<0)putchar('-'),a=-a;if(a>9)out(a/10);putchar('0'+a%10);
}int main()
{int n,m;read(n);for(int i=1;i<=n;i++)read(Data[i]);Build(1,1,n);read(m);while(m--){/*      //if(!m){puts("   **************  ");puts("   **************  ");puts("   **************  ");puts("   **************  ");Print(1,1,n);puts("   **************  ");puts("   **************  ");puts("   **************  ");puts("   **************  ");puts("   **************  ");}*/int op;read(op);int l,r,t;read(l),read(r);if(op==1)read(t),Add(1,l,r,t,1,n);else if(op==2)read(t),MAX(1,l,r,t,1,n);else if(op==3)read(t),MIN(1,l,r,t,1,n);else if(op==4)out(Sum(1,l,r,1,n)),putchar('\n');else if(op==5)out(Querymax(1,l,r,1,n)),putchar('\n');else    out(Querymin(1,l,r,1,n)),putchar('\n');}return 0;
}

BZOJ4695: 最假女选手相关推荐

  1. bzoj4695: 最假女选手 (分块纪念)

    Description 在刚刚结束的水题嘉年华的压轴节目放水大赛中,wyywyy如愿以偿的得到了最假女选手的奖项.但是作为主办人的 C_SUNSHINE为了证明wyywyy确实在放水,决定出一道基础题 ...

  2. bzoj 4695 最假女选手

    bzoj 4695 最假女选手 Segment Tree Beats!!! [吉司机的ppt][https://files.cnblogs.com/files/wawawa8/Segment_tree ...

  3. bzoj 4695 最假女选手 吉利线段树

    最假女选手 Time Limit: 50 Sec  Memory Limit: 128 MB Submit: 480  Solved: 118 [Submit][Status][Discuss] De ...

  4. 线段树 区间修改 最小值+最大值 最假女选手

    最假女选手 题目描述 在刚刚结束的水题嘉年华的压轴节目放水大赛中,wyywyy如愿以偿的得到了最假女选手的奖项.但是作为主办人的 C_SUNSHINE为了证明wyywyy确实在放水,决定出一道基础题考 ...

  5. 【bzoj4695】最假女选手 线段树区间最值操作

    题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] ...

  6. 【BZOJ4695】最假女选手

    [题目链接] 点击打开链接 [思路要点] 题目中提到的操作均为区间操作,考虑使用线段树. 2号操作和3号操作并非线段树的一般操作,无法直接支持标记合并. 考虑一个被2号操作定位的区间,记区间最小值为\ ...

  7. 【BZOJ4695】最假女选手 jls线段树

    传送⻔ 题意 分析 首先考虑如果将单调修改转化为区间修改 在进行操作二的时候,如果区间内的最小值小于xxx,区间内的严格次小值大于等于xxx,那么我们可以去对这个区间进行整体修改 所以,我们需要在线段 ...

  8. bzoj 4695: 最假女选手

    --一道丧病线段树膜板题-- 被常数卡的死去活来--QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多-- #include <bits/stdc++.h> #de ...

  9. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...

最新文章

  1. 百度被曝将成立芯片公司!头部互联网玩家,为何纷纷入局造芯?
  2. Libnids库-网络入侵检测的基础框架
  3. 【项目管理和构建】——Maven简介(一)
  4. jsonp解决ajax跨域问题,用JSONP解决ajax跨域问题
  5. java每天定时任务
  6. python3档案管理程序源码_php人事档案管理系统,源码免费分享
  7. Python人脸检测实战之疲劳检测
  8. Feign客户端415错误:FeignException$UnsupportedMediaType: [415 ]
  9. Cisco交换机产品线和主要产品--- 型号说明
  10. 新手如何对文件进行简单的上传
  11. Vim 3 vimrc
  12. 【程序源代码】小程序商城系统(CoreShop)
  13. JFrog制品库的Aql语句
  14. Network boot from AMD Am79C970A
  15. 企业怎么选择低代码/无代码?J2PaaS云开发平台将为市场提供新参考!
  16. [渝粤教育] 西南科技大学 网站建设与维护 在线考试复习资料
  17. 用Eicon接口卡来连接帧中继线路(转)
  18. 圆点自动跟随鼠标移动
  19. win10系统如何启动sql服务器,win10在装SQLServer时提示服务没有法启动如何办?
  20. c语言实验傅里叶变换运行结果,DSP实验报告1new.doc

热门文章

  1. 童装Java_基于jsp的童装行业网上商城及推荐-JavaEE实现童装行业网上商城及推荐 - java项目源码...
  2. python飞信api_Python调用飞信接口发送短信
  3. tp剩余未验证内容-5
  4. 前端面试总结 :http、html和浏览器篇
  5. JWT Token的Java实现
  6. 疤痕大作战,美分子医用硅酮凝胶
  7. [论文笔记] the book of why 1.因果推断三步骤:关联、干预、反事实推断
  8. 腾讯云原生实时数仓建设实践
  9. python代码写名字_python|教你一行代码用Ta的名字比心
  10. 多行宏:未识别的标记