[SDOI2012] 体育课
体育课(line)问题描述:
又是一节体育课的时间了,有n个同学排成了一排。他们都很讨厌排在第一个位置的同学,于是后面的同学中比第一个高的都会产生一个高兴值,这个高兴值等于他的身高减去第一个同学的身高。当然比第一个同学矮的同学产生兴奋值为0。
现在体育老师来了,他拥有神奇的魔法,现在他能做如下的三件事:
1:询问某段区间高兴值最大的那个是多少。
2:把某两个同学交换一下位置。
3:选取一段区间的人,把第一个人身高加上t,第二个加上2t,第三个加上3t以此类推。
但是体育老师不会数数,于是他找到你了,对于每一个询问,他要你帮他求出那个值。
输入说明:
第一行两个整数n,m表示有n个人,有m个操作。
第二行n个整数,顺序输入每个人的身高。(身高<=10^8)
接下来m行,每行第一个数位一个type表示是做哪一件事情。
如果type=1,那么接下来有两个整数l,r,表示询问这段区间的最大的高兴值
如果Type=2,接下来两个整数a,b,表示交换这两个位置的人
如果type=3,接下来三个整数l,r,t,表示把l个人的升高增加t,l+1个人增加2t…第r个人增加(r-l+1)t, (0<=t<= 10000)
输出说明:
对于每个询问按照顺序输出每个操作1的答案。
样例输入:
6 8
109 827 100 530 10 826
3 1 6 1
2 2 6
1 2 4
1 2 3
2 2 6
1 2 6
1 2 5
样例输出:
431
0
817
431
719
数据范围:
有20%的数据:n,m<=5000
另有10%的数据:没有第三种操作.
另有20%的数据: 没有第二种操作
对于100的数据:n,m<=100000
---------------------------------------------
样例有错
--------------------------------------------
方法一:
我们可以直接暴力。预计得分20分
方法二:
我们不考虑第三种操作,只需要维护一个最大值就可以了,预计得分40分
方法三:
我们考虑对于一段进行分段操作,分成sqrt(n)块。
有一个技巧是,我们求的是一段区间的最大值。我们把每个值a[i]修改为a[i]-a[i-1],这样的话问题变成求最大前缀和。而第三种操作就变成了对一段区间进行加t的操作。
对于每一个快,我们记录这一块的最大值maxs,和对一整段进行操作的话,后面能够超过这个最大值的最小的是多少min。
那么对于第二种操作我们直接暴力维护,时间复杂度o(sqrt(n));
对于第三种操作,如果跨立一个块得话,我们直接对这一段区间标记加上t。如果这个标记大于这一段的min的话,我们对这一块暴力进行维护。时间复杂度o(sqrt(n)).
对于第一种操作,我们可以变成求最大前缀和啦。时间复杂度o(sqrt(n));
这一整个时间复杂度为o((n+m)*sqrt(n));
复杂度十分玄学(我是看了贴吧的讨论写的)
----------------------------------------------------
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <cassert>using namespace std;typedef long long LL;void read(LL &x) {char c;bool flag = 0;while((c=getchar())<'0'||c>'9') flag |= (c=='-');x=c-'0';while((c=getchar())>='0'&&c<='9') x = x*10+c-'0';flag?x=-x:x;
}void read(int &x) {char c;bool flag = 0;while((c=getchar())<'0'||c>'9') flag |= (c=='-');x=c-'0';while((c=getchar())>='0'&&c<='9') x = x*10+c-'0';flag?x=-x:x;
}const LL inf = ~0u>>2;
void FRE();void upval(LL &a,const LL &b) {if(a<b) a=b;}#define MAXX 101000
#define N 600
int n,m;
LL h[MAXX],bsf[N];
int bsiz,bl[N],br[N],bk[MAXX];
LL lazy1[N],lazy2[N];
struct pii{LL h,pos;pii(LL h=0,LL pos=0):h(h),pos(pos){}} st[N][N];
int top[N];void reset(int bk) {bsf[bk] = inf; top[bk] = 0;for (LL i = bl[bk]; i <= br[bk]; i++) {while(top[bk] && st[bk][top[bk]].h <= h[i]) top[bk]--;st[bk][++top[bk]] = pii(h[i],i); }for (LL i = 2; i <= top[bk]; i++)bsf[bk] = min(bsf[bk], ((st[bk][1].h-st[bk][i].h)/(st[bk][i].pos-st[bk][1].pos)));
}void push_down(int bk) {if(!lazy1[bk] && !lazy2[bk]) return;for (LL i = bl[bk]; i <= br[bk]; i++)h[i] += lazy1[bk]+i*lazy2[bk];lazy1[bk] = lazy2[bk] = 0;
}void Swap(int x,int y) {push_down(bk[x]); push_down(bk[y]);swap(h[x],h[y]);reset(bk[x]); reset(bk[y]);
}LL Max(int x,int y) {int li = min(br[bk[x]],y); LL mx = 0;push_down(bk[x]);for (int i = x; i <= li; i++) upval(mx,h[i]);reset(bk[x]);for (int i = bk[x]+1; i < bk[y]; i++) {if(lazy2[i] >= bsf[i] && lazy2[i]) {push_down(i);reset(i);}upval(mx,st[i][1].h+lazy1[i]+lazy2[i]*st[i][1].pos);}if(bk[x] != bk[y]) {push_down(bk[y]);for (int i = bl[bk[y]]; i <= y; i++) upval(mx,h[i]);reset(bk[y]);}mx -= h[1]+lazy1[bk[1]]+lazy2[bk[1]];return mx>0 ? mx:0;
}void Add(int x,int y,LL t) {int li = min(br[bk[x]],y); LL L = x-1;push_down(bk[x]);for (int i = x; i <= li; i++) h[i] += (i-L)*t;reset(bk[x]);for (int i = bk[x]+1; i < bk[y]; i++) lazy1[i] += -L*t,lazy2[i] += t;if(bk[x] != bk[y]) {push_down(bk[y]);for (int i = bl[bk[y]]; i <= y; i++) h[i] += (i-L)*t;reset(bk[y]);}
}int main() {FRE();read(n); read(m);bsiz = sqrt(n+0.5);for (int i = 1; i <= n; i++) {read(h[i]);bk[i] = i/bsiz+1;if(!bl[bk[i]]) bl[bk[i]] = i;br[bk[i]] = i;} for (int i = 1; i <= bk[n]; i++) reset(i);for (int i = 1,tp,x,y,t; i <= m; i++) {read(tp); read(x); read(y);if(tp == 1) printf("%lld\n",Max(x,y));else if(tp == 2) Swap(x,y);else read(t),Add(x,y,t);}return 0;
}void FRE() {assert(freopen("sdoi12_line.in","r",stdin));assert(freopen("sdoi12_line.out","w",stdout));
}
[SDOI2012] 体育课相关推荐
- BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...
- 形状相似的物品_废弃物品在体育课中的再利用
浙江省余姚市新城市小学 屠旭未 案例教学背景 有幸观摩了一堂课,在课上,教师灵活机智地运用了瘪气的破旧篮球,从开始时顶盆的"盆",到前抛实心球时的"实心球", ...
- 兰州大学第一届『飞马杯』程序设计竞赛 - ★★体育课排队★★(二分+最大流)
题目链接:点击查看 题目大意:给出 nnn 个人,再给出 nnn 个指定位置,每个人每秒钟可以向上下左右四个方向移动一个单位,问最少需要多长时间,才能使所有人都到达指定位置 题目分析:数据比较小,可以 ...
- 美一8岁华裔男童体育课上头部重伤 家长吁调查
中新网1月14日电 据美国<侨报>报道,1月初,美国纽约布鲁克林8岁大的华裔小学生高昇(Roger Gao)在校上体育课时,头部遭到创伤性损伤,被紧急送医住院.至今,其家长仍未接到校方的联 ...
- P2303 [SDOI2012] Longge 的问题
P2303 [SDOI2012] Longge 的问题 思路 我们显然可以枚举每一对数的gcdgcdgcd进行求解,进而我们有如下推导: =>∑i=1ngcd(i,n)=>\sum _{i ...
- P2303 [SDOI2012] Longge(数论/欧拉函数)
P2303 [SDOI2012] Longge 一道看似非常基础的数论题,但是蕴含了非常多的知识,求解 ∑i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n) i=1∑ngcd(i,n) ...
- 兰州大学第一届 飞马杯 体育课排队 二分 + 最大流 + 输出路径
传送门 文章目录 题意: 思路: 题意: 思路: 读懂题就会辣,经典模型了,二分时间,让后将其转换成二分图,左边是人,右边是位置,能在规定时间到的连边,跑匹配即可. // Problem: ★★体育课 ...
- P2498 [SDOI2012]拯救小云公主
P2498 [SDOI2012]拯救小云公主 题意: 一个row * line的矩形,英雄在左下角(1,1),公主在右上角(row,line),有n个位置是boss.英雄现在要去公主那里,但是要避开b ...
- 计算机课伤害事故的防范,体育课安全伤害事故的防范与处理
摘 要:近年来,在教育改革的背景下,学校方面特别重视体育教学这一环节.做好体育教学工作,一方面能够使学生达到强身健体的目的,另一方面能够使学生的综合素质水平得到有效提升.然而,在体育课中还会发生一些伤 ...
最新文章
- Python占位符总结:%方式和format方式
- 04_有序清单无序清单
- php配置支持mysql解决本地安装wordpress问题
- tableau地图城市数据_举个栗子!Tableau 技巧(156):在地图分析中创建缓冲区
- 人机融合群智计算【会议】
- Apache Kylin 入门 1 - 基本概念
- 不小心把桌面进程结束了怎么办_本命佛不小心摔碎了怎么办,怎么处理?
- LMS自适应滤波的MATLAB实现——实例仿真
- 给Vue实例添加新的属性
- 常见元件、封装及尺寸
- validation
- 全网舆情资讯舆情系统网址
- JZOJ 7.10B组第一题 可见点数
- acx_pthread.m4
- 根据起始点经纬度、距离、方位角计算目标点经纬度的方法
- “数据折叠”:今天,那些人工智能背后“标数据的人”正在回家
- 2038年问题 linux内核5.6,Linux 5.1延续为2038年问题所做的多年准备
- 网络生命大百科全书项目
- 论文查重需要多长时间?
- 美服疯狂坦克辅助瞄准外挂C#版开发(四)程序使用说明和完成源代码及其下载
热门文章
- 关于人工智能与深度学习技术的发展历程和未来展望
- 人体时钟插件honehoneclock
- python做前端还是后端_到底什么是前端、后端、后台啊?
- 企业微信配置h5配置主页地址和可信域名
- 12306网站之我见
- CryptoTab 服务器_如何架设FTP服务器,如何架设FTP服务器,具体架设方法
- python十六进制转换成八进制_Python 进制转换 二进制 八进制 十进制 十六进制
- 系统错误 无法启动此程序,因为计算机中丢失MSVCP140_1.dll。尝试重新安装该程序已解决此问题
- 听声辨物,这是AI视觉该干的???|ECCV 2022
- VC++ 获取Windows系统标准字体方法