体育课(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] 体育课相关推荐

  1. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  2. 形状相似的物品_废弃物品在体育课中的再利用

    浙江省余姚市新城市小学  屠旭未 案例教学背景 有幸观摩了一堂课,在课上,教师灵活机智地运用了瘪气的破旧篮球,从开始时顶盆的"盆",到前抛实心球时的"实心球", ...

  3. 兰州大学第一届『飞马杯』程序设计竞赛 - ★★体育课排队★★(二分+最大流)

    题目链接:点击查看 题目大意:给出 nnn 个人,再给出 nnn 个指定位置,每个人每秒钟可以向上下左右四个方向移动一个单位,问最少需要多长时间,才能使所有人都到达指定位置 题目分析:数据比较小,可以 ...

  4. 美一8岁华裔男童体育课上头部重伤 家长吁调查

    中新网1月14日电 据美国<侨报>报道,1月初,美国纽约布鲁克林8岁大的华裔小学生高昇(Roger Gao)在校上体育课时,头部遭到创伤性损伤,被紧急送医住院.至今,其家长仍未接到校方的联 ...

  5. P2303 [SDOI2012] Longge 的问题

    P2303 [SDOI2012] Longge 的问题 思路 我们显然可以枚举每一对数的gcdgcdgcd进行求解,进而我们有如下推导: =>∑i=1ngcd(i,n)=>\sum _{i ...

  6. P2303 [SDOI2012] Longge(数论/欧拉函数)

    P2303 [SDOI2012] Longge 一道看似非常基础的数论题,但是蕴含了非常多的知识,求解 ∑i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n) i=1∑n​gcd(i,n) ...

  7. 兰州大学第一届 飞马杯 体育课排队 二分 + 最大流 + 输出路径

    传送门 文章目录 题意: 思路: 题意: 思路: 读懂题就会辣,经典模型了,二分时间,让后将其转换成二分图,左边是人,右边是位置,能在规定时间到的连边,跑匹配即可. // Problem: ★★体育课 ...

  8. P2498 [SDOI2012]拯救小云公主

    P2498 [SDOI2012]拯救小云公主 题意: 一个row * line的矩形,英雄在左下角(1,1),公主在右上角(row,line),有n个位置是boss.英雄现在要去公主那里,但是要避开b ...

  9. 计算机课伤害事故的防范,体育课安全伤害事故的防范与处理

    摘 要:近年来,在教育改革的背景下,学校方面特别重视体育教学这一环节.做好体育教学工作,一方面能够使学生达到强身健体的目的,另一方面能够使学生的综合素质水平得到有效提升.然而,在体育课中还会发生一些伤 ...

最新文章

  1. Python占位符总结:%方式和format方式
  2. 04_有序清单无序清单
  3. php配置支持mysql解决本地安装wordpress问题
  4. tableau地图城市数据_举个栗子!Tableau 技巧(156):在地图分析中创建缓冲区
  5. 人机融合群智计算【会议】
  6. Apache Kylin 入门 1 - 基本概念
  7. 不小心把桌面进程结束了怎么办_本命佛不小心摔碎了怎么办,怎么处理?
  8. LMS自适应滤波的MATLAB实现——实例仿真
  9. 给Vue实例添加新的属性
  10. 常见元件、封装及尺寸
  11. validation
  12. 全网舆情资讯舆情系统网址
  13. JZOJ 7.10B组第一题 可见点数
  14. acx_pthread.m4
  15. 根据起始点经纬度、距离、方位角计算目标点经纬度的方法
  16. “数据折叠”:今天,那些人工智能背后“标数据的人”正在回家
  17. 2038年问题 linux内核5.6,Linux 5.1延续为2038年问题所做的多年准备
  18. 网络生命大百科全书项目
  19. 论文查重需要多长时间?
  20. 美服疯狂坦克辅助瞄准外挂C#版开发(四)程序使用说明和完成源代码及其下载

热门文章

  1. 关于人工智能与深度学习技术的发展历程和未来展望
  2. 人体时钟插件honehoneclock
  3. python做前端还是后端_到底什么是前端、后端、后台啊?
  4. 企业微信配置h5配置主页地址和可信域名
  5. 12306网站之我见
  6. CryptoTab 服务器_如何架设FTP服务器,如何架设FTP服务器,具体架设方法
  7. python十六进制转换成八进制_Python 进制转换 二进制 八进制 十进制 十六进制
  8. 系统错误 无法启动此程序,因为计算机中丢失MSVCP140_1.dll。尝试重新安装该程序已解决此问题
  9. 听声辨物,这是AI视觉该干的???|ECCV 2022
  10. VC++ 获取Windows系统标准字体方法