bzoj 4695 最假女选手 吉利线段树
最假女选手
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 480 Solved: 118
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
2
2 1 2 2
4 1 2
Sample Output
HINT
题解:吉利线段树的模板题
https://pan.baidu.com/s/1o7xSSQ2
1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 9 #define ll long long 10 #define inf 1000000007 11 #define N 500007 12 #define ls p<<1 13 #define rs p<<1|1 14 using namespace std; 15 inline ll read() 16 { 17 ll x=0,f=1;char ch=getchar(); 18 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 19 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 20 return x*f; 21 } 22 23 int n,m; 24 int mx[N<<2],cx[N<<2],sx[N<<2];//区间最大值,最大值个数 ,区间严格次大值 25 int mn[N<<2],cn[N<<2],sn[N<<2];//区间最小值,最小值个数 ,区间严格次小值 26 int add[N<<2];//区间tag标记 27 ll sum[N<<2];//区间和 28 29 inline void push_up(int p) 30 { 31 sum[p]=sum[ls]+sum[rs]; 32 33 if (mx[ls]>mx[rs]) mx[p]=mx[ls],cx[p]=cx[ls],sx[p]=max(sx[ls],mx[rs]); 34 if (mx[ls]<mx[rs]) mx[p]=mx[rs],cx[p]=cx[rs],sx[p]=max(mx[ls],sx[rs]); 35 if (mx[ls]==mx[rs]) mx[p]=mx[ls],cx[p]=cx[ls]+cx[rs],sx[p]=max(sx[ls],sx[rs]); 36 37 if (mn[ls]<mn[rs]) mn[p]=mn[ls],cn[p]=cn[ls],sn[p]=min(sn[ls],mn[rs]); 38 if (mn[ls]>mn[rs]) mn[p]=mn[rs],cn[p]=cn[rs],sn[p]=min(mn[ls],sn[rs]); 39 if (mn[ls]==mn[rs]) mn[p]=mn[ls],cn[p]=cn[ls]+cn[rs],sn[p]=min(sn[ls],sn[rs]); 40 // cout<<sum[p]<<endl; 41 } 42 inline void push_down(int p,int l,int r) 43 { 44 if (add[p]) 45 { 46 int mid=(l+r)>>1; 47 mx[ls]+=add[p],sx[ls]+=add[p],mn[ls]+=add[p],sn[ls]+=add[p],sum[ls]+=(mid-l+1)*add[p],add[ls]+=add[p]; 48 mx[rs]+=add[p],sx[rs]+=add[p],mn[rs]+=add[p],sn[rs]+=add[p],sum[rs]+=(r-mid)*add[p],add[rs]+=add[p]; 49 add[p]=0; 50 } 51 if (mx[ls]>mx[p]) 52 { 53 if (mn[ls]==mx[ls]) mn[ls]=mx[p]; 54 if (sn[ls]==mx[ls]) sn[ls]=mx[p]; 55 sum[ls]+=1ll*(mx[p]-mx[ls])*cx[ls],mx[ls]=mx[p]; 56 } 57 if (mx[rs]>mx[p]) 58 { 59 if (mn[rs]==mx[rs]) mn[rs]=mx[p]; 60 if (sn[rs]==mx[rs]) sn[rs]=mx[p]; 61 sum[rs]+=1ll*(mx[p]-mx[rs])*cx[rs],mx[rs]=mx[p]; 62 } 63 if (mn[ls]<mn[p]) 64 { 65 if (mx[ls]==mn[ls]) mx[ls]=mn[p]; 66 if (sx[ls]==mn[ls]) sx[ls]=mn[p]; 67 sum[ls]+=1ll*(mn[p]-mn[ls])*cn[ls],mn[ls]=mn[p]; 68 } 69 if (mn[rs]<mn[p]) 70 { 71 if (mx[rs]==mn[rs]) mx[rs]=mn[p]; 72 if (sx[rs]==mn[rs]) sx[rs]=mn[p]; 73 sum[rs]+=1ll*(mn[p]-mn[rs])*cn[rs],mn[rs]=mn[p]; 74 } 75 } 76 void build(int p,int l,int r) 77 { 78 if (l==r) 79 { 80 mx[p]=mn[p]=sum[p]=read(); 81 cx[p]=cn[p]=1; 82 sx[p]=-inf,sn[p]=inf; 83 return; 84 } 85 int mid=(l+r)>>1; 86 build(ls,l,mid),build(rs,mid+1,r); 87 push_up(p); 88 } 89 void vadd(int p,int l,int r,int x,int y,int z) 90 { 91 if (l==x&&y==r) 92 { 93 mx[p]+=z,sx[p]+=z,mn[p]+=z,sn[p]+=z; 94 sum[p]+=1ll*(r-l+1)*z,add[p]+=z; 95 return; 96 } 97 push_down(p,l,r); 98 int mid=(l+r)>>1; 99 if (y<=mid) vadd(ls,l,mid,x,y,z); 100 else if (x>mid) vadd(rs,mid+1,r,x,y,z); 101 else vadd(ls,l,mid,x,mid,z),vadd(rs,mid+1,r,mid+1,y,z); 102 push_up(p); 103 } 104 void vmax(int p,int l,int r,int x,int y,int z) 105 { 106 //cout<<p<<" "<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<z<<endl; 107 if (mn[p]>=z) return; 108 if (l==x&&y==r&&sn[p]>z) 109 { 110 //cout<<p<<" "<<l<<" "<<r<<endl; 111 if (mx[p]==mn[p]) mx[p]=z; 112 if (sx[p]==mn[p]) sx[p]=z; 113 sum[p]+=1ll*(z-mn[p])*cn[p],mn[p]=z; 114 return; 115 } 116 push_down(p,l,r); 117 int mid=(l+r)>>1; 118 if (y<=mid) vmax(ls,l,mid,x,y,z); 119 else if (x>mid) vmax(rs,mid+1,r,x,y,z); 120 else vmax(ls,l,mid,x,mid,z),vmax(rs,mid+1,r,mid+1,y,z); 121 push_up(p); 122 } 123 void vmin(int p,int l,int r,int x,int y,int z) 124 { 125 if (mx[p]<=z) return; 126 if (l==x&&y==r&&sx[p]<z) 127 { 128 //cout<<l<<" "<<r<<" "<<p<<endl; 129 if (mn[p]==mx[p]) mn[p]=z; 130 if (sn[p]==mx[p]) sn[p]=z; 131 sum[p]+=1ll*(z-mx[p])*cx[p],mx[p]=z; 132 // cout<<sum[p]<<" "<<l<<" "<<r<<" "<<p<<endl; 133 return; 134 } 135 push_down(p,l,r); 136 int mid=(l+r)>>1; 137 if (y<=mid) vmin(ls,l,mid,x,y,z); 138 else if (x>mid) vmin(rs,mid+1,r,x,y,z); 139 else vmin(ls,l,mid,x,mid,z),vmin(rs,mid+1,r,mid+1,y,z); 140 // cout<<l<<" "<<r<<" "<<sum[p]<<endl; 141 push_up(p); 142 // cout<<p<<" "<<l<<" "<<r<<" "<<sum[p]<<" "<<sum[ls]<<" "<<sum[rs]<<endl; 143 } 144 ll qsum(int p,int l,int r,int x,int y) 145 { 146 //cout<<l<<" "<<r<<" "<<p<<" "<<sum[p]<<endl; 147 if (l==x&&y==r) return sum[p]; 148 push_down(p,l,r); 149 int mid=(l+r)>>1; 150 if (y<=mid) return qsum(ls,l,mid,x,y); 151 else if (x>mid) return qsum(rs,mid+1,r,x,y); 152 else return qsum(ls,l,mid,x,mid)+qsum(rs,mid+1,r,mid+1,y); 153 } 154 int qmax(int p,int l,int r,int x,int y) 155 { 156 if (l==x&&y==r) return mx[p]; 157 push_down(p,l,r); 158 int mid=(l+r)>>1; 159 if (y<=mid) return qmax(ls,l,mid,x,y); 160 else if (x>mid) return qmax(rs,mid+1,r,x,y); 161 else return max(qmax(ls,l,mid,x,mid),qmax(rs,mid+1,r,mid+1,y)); 162 } 163 int qmin(int p,int l,int r,int x,int y) 164 { 165 if (l==x&&y==r) return mn[p]; 166 push_down(p,l,r); 167 int mid=(l+r)>>1; 168 if (y<=mid) return qmin(ls,l,mid,x,y); 169 else if (x>mid) return qmin(rs,mid+1,r,x,y); 170 else return min(qmin(ls,l,mid,x,mid),qmin(rs,mid+1,r,mid+1,y)); 171 } 172 int main() 173 { 174 freopen("fzy.in","r",stdin); 175 freopen("fzy.out","w",stdout); 176 177 n=read(); 178 build(1,1,n); 179 m=read(); 180 while(m--) 181 { 182 int opt=read(),x=read(),y=read(),z; 183 if (opt==1) z=read(),vadd(1,1,n,x,y,z); 184 if (opt==2) z=read(),vmax(1,1,n,x,y,z); 185 if (opt==3) z=read(),vmin(1,1,n,x,y,z); 186 if (opt==4) printf("%lld\n",qsum(1,1,n,x,y)); 187 if (opt==5) printf("%d\n",qmax(1,1,n,x,y)); 188 if (opt==6) printf("%d\n",qmin(1,1,n,x,y)); 189 } 190 }
转载于:https://www.cnblogs.com/fengzhiyuan/p/8848060.html
bzoj 4695 最假女选手 吉利线段树相关推荐
- bzoj 4695 最假女选手
bzoj 4695 最假女选手 Segment Tree Beats!!! [吉司机的ppt][https://files.cnblogs.com/files/wawawa8/Segment_tree ...
- BZOJ.4695.最假女选手(线段树 Segment tree Beats!)
题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...
- bzoj 4695: 最假女选手
--一道丧病线段树膜板题-- 被常数卡的死去活来--QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多-- #include <bits/stdc++.h> #de ...
- 【BZOJ4695】最假女选手 jls线段树
传送⻔ 题意 分析 首先考虑如果将单调修改转化为区间修改 在进行操作二的时候,如果区间内的最小值小于xxx,区间内的严格次小值大于等于xxx,那么我们可以去对这个区间进行整体修改 所以,我们需要在线段 ...
- 线段树 区间修改 最小值+最大值 最假女选手
最假女选手 题目描述 在刚刚结束的水题嘉年华的压轴节目放水大赛中,wyywyy如愿以偿的得到了最假女选手的奖项.但是作为主办人的 C_SUNSHINE为了证明wyywyy确实在放水,决定出一道基础题考 ...
- bzoj4695: 最假女选手 (分块纪念)
Description 在刚刚结束的水题嘉年华的压轴节目放水大赛中,wyywyy如愿以偿的得到了最假女选手的奖项.但是作为主办人的 C_SUNSHINE为了证明wyywyy确实在放水,决定出一道基础题 ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] ...
- 【WC2016模拟】最假女选手
Description 维护一个序列,资瓷: 1:区间加 2:区间取max 3:区间取min 4:区间求和 5:区间求max 6:区间求min n<=5*1e5 Solution 最近正在搞数据 ...
- 【BZOJ4695】最假女选手
[题目链接] 点击打开链接 [思路要点] 题目中提到的操作均为区间操作,考虑使用线段树. 2号操作和3号操作并非线段树的一般操作,无法直接支持标记合并. 考虑一个被2号操作定位的区间,记区间最小值为\ ...
最新文章
- Moment矩计算公式
- 常考数据结构与算法:两数之和
- 设计模式笔记15:代理模式(Proxy Pattern)
- 自学python从零开始学_新手学习python-从零开始学习
- 修改Ubuntu下的jenkins端口号
- Javascript第五章为什么用firstChild获取table中最后一个节点会取到text或者tbody第十一课
- python和区块链哪个好_10个最流行的Python区块链开源项目
- Python执行Linux系统命令方法
- SQL 数据库语句练习
- spark入门教程(3)--Spark 核心API开发
- 如何改变hr标签的颜色
- JAVA编程的第二天JAVA编程环境搭建与JAVA入门案例
- English trip V2 - 8 Holidays and Birthdays Teacher:Julia Key: at on in
- docker-compose开机自启动设置
- 我在MTK平台下调试音频ALSA
- Windows10应用程序无法正常启动Oxc000007b 实用解决方法
- 钉钉电脑端屏蔽文件上传下载功能的方法
- 有效的医疗设备维修保养解决方案
- 史上最全的FTP网址
- freertos---队列管理
热门文章
- c++ 定时关机程序源码分享
- 《魔童降世》影评——从封神演义谈到宿命
- Ghost XP SP3 纯净标准版 V2013.10
- 图-工作日的西湖【曾经的付费视频课春节前放完,以及最后一场直播预告】
- Unity Lighting Mode
- 微软研究院玻璃存储项目Project Silica最新进展
- appserv mysql 用户名_appserv之进入mysql、phpmyadmin的用户名和密码_MySQL
- ubuntu安装最新版wine
- 乘方计算机在线应用,乘方计算器
- mysql报错系列持续整理1064 - You have an error in your SQL syntax;...near...