cogs 358. [SDOI2012] 体育课

★   输入文件:sdoi12_line.in   输出文件:sdoi12_line.out   简单对比

时间限制:10 s   内存限制:128 MB

体育课(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

UPD:2017.7.7 by Mike

我猜样例是错的,第一个测试点发出来当样例算了

sdoi12_line.in

10 7

10 9 8 7 6 5 4 3 2 1

1 4 7

3 2 4 3

1 2 3

1 3 6

2 1 10

1 8 10

1 2 3

sdoi12_line.out

0

4

6

9

13

看到1星的山东省选题,本想写一写,然而连暴力都写不出来:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N=100010;

int Height[N],diff[N];
int how,n,m,l,r,t;

inline int read()
{
	int x=0;int f=1;char c=getchar();
	while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
	while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
	return x*f;
}

inline void add(int l,int r,int t)
{
	int js=0;
	if(l==1)
	{
		for(int i=r+1;i<=n;i++)
			diff[i]-=t;
		for(int i=2;i<=r;i++)
			diff[i]+=(++js)*t;
	}
	else
		for(int i=l;i<=r;i++)
			diff[i]+=(++js)*t;
	return ;
}

inline int Find_max(int l,int r)
{
	int answer=-1;
	for(int i=l;i<=r;i++)
		answer=max(answer,diff[i]);
	return answer;
}

int main()
{
	n=read();
	m=read();
	for(int i=1; i<=n; i++)
	{
		Height[i]=read();
		diff[i]=Height[i]-Height[1];
		diff[i]=max(diff[i],0);
	}

	for(int i=1; i<=m; i++)
	{
		how=read();
		switch(how)
		{
			case 1:
			{
				l=read(),r=read();
				printf("%d\n",Find_max(l,r));
				break;
			}
			case 2:
			{
				l=read(),r=read();
				swap(diff[l],diff[r]);
				break;
			}
			case 3:
			{
				l=read(),r=read(),t=read();
				add(l,r,t);
				break;
			}
		}
	}
	return 0;
}
/*
10 7
10 9 8 7 6 5 4 3 2 1
1 4 7
3 2 4 3
1 2 3
1 3 6
2 1 10
1 8 10
1 2 3
0
4
6
9
13
*/

看到ac代码,hehehe

#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() {

	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;
}

  

时间: 2024-10-25 08:25:54

cogs 358. [SDOI2012] 体育课的相关文章

COGS基本法初稿

COGS基本法 序言 我们COGS人民,为建立更完善的联盟,树立正义,保障网络安宁,提供公共OJ,杜绝极少数恐怖分子对我OJ的破坏行为,并使我们自己和OIER得享自由的幸福,特为COGS制定本基本法. 第一条权利机构 权利机构由老常为领导核心的第一代领导集体及COGS QQ群的元老组成,COGS的权力机构为君主立宪制,其中老常为世袭君主,议会由首相刘易铖,长老王梦迪,内阁大臣张灵犀,外交大臣张子昂.国家工程师李冬麟组成.首相.内阁大臣.外交大臣必须由河南省实验中学有着良好素质和学习水平的学生组成

COGS——T 2739. 凯伦和咖啡

http://www.cogs.pro/cogs/problem/problem.php?pid=2739 ★★☆   输入文件:coffee.in   输出文件:coffee.out   简单对比时间限制:1 s   内存限制:512 MB [题目描述] 为了在上课时保持清醒,凯伦需要一些咖啡.咖啡爱好者凯伦想知道最佳的温度来冲煮完美的咖啡.因此,她花了一些时间阅读几本食谱,其中包括广受好评的“咖啡的艺术”. 她知道有n个食谱,其中第i个食谱建议应当在li和ri度之间冲煮以达到最佳的味道.凯伦

COGS——T 8. 备用交换机

http://www.cogs.pro/cogs/problem/problem.php?pid=8 ★★   输入文件:gd.in   输出文件:gd.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接.因电子设备容易损坏,需给通讯点配备备用交换机.但备用交换机数量有限,不能全部配备,只能给部分重要城市配置.于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配

COGS——C2098. Asm.Def的病毒

http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’.”方教授介绍道. “哦.”主席面无表情地点点头. “‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子.可惜透明计算网络能轻松地辨认出病毒,所以我建议……

BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关的量只有t = dp(j) - F(i) * T(j) , 我们要最小化它. dp(j)->y, T(j)->x, 那么y = F(i) * x + t, 就是给一些点和一个斜率...然后最小化截距, 显然维护下凸包就可以了. 然后因为无比坑爹的出题人....时间可以为负数, 所以要用平衡树维护(

COGS 497——奶牛派对

http://218.28.19.228/cogs/problem/problem.php?pid=497 我们发现每头牛需要走的路程即为它到x的最短路+x到它的最短路. 转化: 于是这道题变成了一道典型的单源最短路问题,只需求出每个点到x的最短路dl,以及从x到此点的最短路d2,然后去找max(dl+d2)即可. 效率分析: 使用dijsktra算法,时间复杂度为O(n^2). [我的程序] 1 type aa=array[1..1000,1..1000] of longint; 2 var

Calculation of COGM and COGS

Use You can use the Product Cost Planning functions to calculate the cost of goods manufactured (COGM) and cost of goods sold (COGS) for products such as materials and services. The costs may then be analyzed and business decisions (such as "make or

cogs 1901. [国家集训队2011]数颜色

Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔.2. R P Col 把第P支画笔替换为

COGS——T1310. [HAOI2006]聪明的猴子

http://cogs.pro/cogs/problem/problem.php?pid=1310 ★   输入文件:monkey.in   输出文件:monkey.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的部分植物的树冠上来回穿梭,以找到喜欢吃的果实. 现在,在这个地区露出水面的有