第3题: 倒水
【题目描述】
从前有一个DTZ,它面前有一排格子,每个格子都放着一个杯子,每个杯子下面都配有一个集水盘,每个杯子都有有限的容量,而集水盘没有容量限制。
由于水利局局长Skylynf想喝水,DTZ需要往杯子里面倒水。
DTZ有两种操作,1.倒水;2.交换。具体如下:
· 1.倒水:DTZ不是一个一个杯子地倒水,而是一片片的倒水。它每次选择一个连续区域a~b,第a个杯子倒到第b个杯子(包含a和b),往里面的每个杯子倒入相同的水(即杯子们的水量同时加上一个数)。由于杯子大小不一。倒了若干次以后,某些杯子会溢出来很多水,流进这些杯子下面的集水盘里面。如果第a个杯子(即最前面那个杯子)溢水了,DTZ就会毫不犹豫地交换第a个杯子和第b个杯子,但不移动原本的集水盘。(以上2个操作同属1个倒水操作)
· 2.交换:但是DTZ特别调皮,除了上述情况,他有时候会在倒完一片水之后,交换一些杯子的位置,但不移动原本的集水盘。
Skylynf在想知道DTZ一系列操作完成后,最后所有杯子水量的情况的同时,喝令DTZ算出每个集水盘有多少被浪费的水。
同时,DTZ被红云威胁去帮它解密码,好让红云有时间喂养它的蜘蛛们,但他倒水任务在身,请你赶快帮他完成任务,不然DTZ就会变成一台Iphone6.
所以请帮DTZ计算一下倒水的结果吧。
【输入描述】
第一行2个整数n,m,表示方格阵有n个格子(1<=n<=3000 1<=m<=100),DTZ总共倒了m次水。
接下来一行n个整数,每个数字之间用空格隔开。表示每个杯子的最大容量为X 份水(1<=X<=1000)。
接下来m行,每行3个整数a, b, s (1<=a<=b<=n 0<=s<=30),
· 如果s等于0,则表示DTZ要把第a个杯子和第b个杯子交换位置;
· 如果s不为0,那就表示DTZ要倒水,这次倒水从第a个杯子倒到第b个杯子(包含a和b)每一个杯子倒s份水。
【输出描述】
第一行n个整数,每个整数之间用空格隔开,表示最后每个杯子里面有多少水。
接下来一行再有n个整数,表示最后每个杯子的集水盘里面有多少水。
【输入样例】
3 3
1 2 3
1 2 1
1 3 0
2 3 1
【输出样例】
0 2 1
0 0 1
var
i,j,k,n,m,x,y,z:longint;a,b,c:array[-10..10001]of longint;
begin
assign(input,'c.in');reset(input);
assign(output,'c.out');rewrite(output);
readln(n,m);
for i:=1 to n do
begin
read(b[i]);
end;
readln;
for i:=1 to m do
begin
readln(x,y,z);
if z=0 then
begin
a[0]:=a[x];
a[x]:=a[y];
a[y]:=a[0];
b[0]:=b[x];
b[x]:=b[y];
b[y]:=b[0];
end
else
begin
for j:=x+1 to y do
begin
a[j]:=a[j]+z;
if a[j]>b[j] then
begin
c[j]:=c[j]+a[j]-b[j];
a[j]:=b[j];
end;
end;
a[x]:=a[x]+z;
if a[x]>b[x] then
begin
c[x]:=c[x]+a[x]-b[x];
a[x]:=b[x];
a[0]:=a[x]; a[x]:=a[y]; a[y]:=a[0];
b[0]:=b[x]; b[x]:=b[y]; b[y]:=b[0];
end;
end;
end;
for i:=1 to n do
begin
write(a[i],' ');
end;
writeln;
for i:=1 to n do
begin
write(c[i],' ');
end;
close(input);
close(output);
end.