2017.5.14测试 第3题: 倒水

3题: 倒水

【题目描述】 

从前有一个DTZ,它面前有一排格子,每个格子都放着一个杯子,每个杯子下面都配有一个集水盘,每个杯子都有有限的容量,而集水盘没有容量限制。

由于水利局局长Skylynf想喝水,DTZ需要往杯子里面倒水。

DTZ有两种操作,1.倒水;2.交换。具体如下:

· 1.倒水:DTZ不是一个一个杯子地倒水,而是一片片的倒水。它每次选择一个连续区域a~b,第a个杯子倒到第b个杯子(包含ab),往里面的每个杯子倒入相同的水(即杯子们的水量同时加上一个数)。由于杯子大小不一。倒了若干次以后,某些杯子会溢出来很多水,流进这些杯子下面的集水盘里面。如果第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个杯子(包含ab)每一个杯子倒s份水。

【输出描述】 

第一行n个整数,每个整数之间用空格隔开,表示最后每个杯子里面有多少水。

接下来一行再有n个整数,表示最后每个杯子的集水盘里面有多少水。

【输入样例】 

3 3

1 2 3

1 2 1

1 3 0

2 3 1

【输出样例】 

0 2 1

0 0 1 

var
 a,b,c:array[0..10000]of longint;
 n,m,i,j,x,y,s,t,ji:longint;
begin
 readln(n,m);
 for i:=1 to n do
  read(a[i]);
 for i:=1 to m do
  begin
   read(x,y,s);
   if s=0 then begin//交换
                t:=a[y];a[y]:=a[x];a[x]:=t;//交换目前杯子的水量
                t:=b[y];b[y]:=b[x];b[x]:=t;//交换杯子的容积
               end
          else begin
                for j:=x to y do//一片片地倒(一起倒)
                 begin
                  b[j]:=b[j]+s;
                  if b[j]>a[j] then
                   begin
                    c[j]:=c[j]+b[j]-a[j];//溢出来的掉进集水盘
                    b[j]:=a[j];
                    if j=x then ji:=1;//记号
                   end;
                 end;
                if ji=1 then begin//如果x溢出,就和y交换
                              t:=a[y];a[y]:=a[x];a[x]:=t;
                              t:=b[y];b[y]:=b[x];b[x]:=t;
                             end;
               end;
   ji:=0;//撤销记号
  end;
 for i:=1 to n do write(b[i],' ');
 writeln;
 for i:=1 to n do write(c[i],' ');
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值