1. 程式人生 > >luoguP4231_三步必殺_差分

luoguP4231_三步必殺_差分

string mar amp 完成 register continue ace sum eight

luoguP4231_三步必殺_差分

題意:N 個柱子排成一排,一開始每個柱子損傷度為0。接下來勇儀會進行M 次攻擊,每次攻擊可以用4個參數l,r ,s ,e 來描述:

表示這次攻擊作用範圍為第l個到第r 個之間所有的柱子(包含l ,r ),對第一個柱子的傷害為s ,對最後一個柱子的傷害為e

攻擊產生的傷害值是一個等差數列。若l=1 ,r=5 ,s=2 ,e=10 ,則對第1~5個柱子分別產生2,4,6,8,10的傷害。

鬼族們需要的是所有攻擊完成之後每個柱子的損傷度。

分析:等差數列差分後相當於區間加,再套一個差分可解。

差分套差分求兩遍前綴和就是原數組。註意有幾個需要差分的單點修改。

代碼:

 1 // luogu-judger-enable-o2
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 #define LL long long
 7 #define N 10000002
 8 LL c[N];
 9 LL n,m;
10 void read(LL &x){
11     int f=1;x=0;char s=getchar();
12     while(s<0||s>9){if(s==
-)f=-1;s=getchar();} 13 while(s>=0&&s<=9){x=x*10+s-0;s=getchar();}x*=f; 14 } 15 int main(){ 16 read(n),read(m); 17 LL l,r,s,t; 18 register int i; 19 for(i=1;i<=m;i++){ 20 read(l),read(r),read(s),read(t); 21 if(l==r){ 22 c[l]+=s;c[l+1
]-=2*s;c[l+2]+=s;continue; 23 } 24 LL d=(t-s)/(r-l); 25 c[l]+=s;c[l+1]-=(s-d);c[r+1]-=((r-l)*d+s+d);c[r+2]+=((r-l)*d+s); 26 } 27 for(i=1;i<=n;i++){ 28 c[i]+=c[i-1]; 29 } 30 LL mx=0,sum=0; 31 for(i=1;i<=n;i++){ 32 c[i]+=c[i-1]; 33 mx=max(mx,c[i]); 34 sum^=c[i]; 35 } 36 printf("%lld %lld",sum,mx); 37 } 38

luoguP4231_三步必殺_差分