[TIOJ] 1227. 一個數列

題目連結:http://tioj.infor.org/problems/1227
序列小技巧,若允許離線或像本題保證修改完才會有查詢,可以用類似懶標記的方式,把序列的修改存下來(修改$[L,R)$則在L加R減,反之亦然),然後查詢時就把序列累推回去,並加回原序列,不過這題有點煩的地方是奇偶項要分成兩條處理
#include "lib1227.h"

long long odd[1000003]={0},even[1000003]={0};
long long* D; 
int N;
bool isSUM=false;

void init(int n, long long d[]){
	N=n;
	D=d;
}

void change(int a, int b, long long k){
	if(a%2==0){
		//a是偶數
		even[a/2]-= k;
		odd[a/2] += k;
		if((b-a)%2==0){
			//共有奇數個
			//因a是偶數,故b為偶
			even[b/2+1]+=k;
			odd[b/2] -=k;
		}else{
			//共有偶數個
			//因a是偶數,故b為奇
			even[b/2+1]+=k;
			odd[b/2+1] -=k;
		}
	}else{
		//a是奇數
		even[a/2+1] += k;
		odd[a/2]-= k;
		if((b-a)%2==0){
			//共有奇數個
			//因a是奇數,故b為奇
			even[b/2+1]-=k;
			odd[b/2+1] +=k;
		}else{
			//共有偶數個
			//因a是奇數,故b為偶
			even[b/2+1]-=k;
			odd[b/2]+=k;
		}
	}
}

long long query(int c){
	if(!isSUM){
		for(int i=1;i<N/2;i++){
			odd[i] += odd[i-1];
			even[i]+=even[i-1];
		}
		if(N%2==1)
			even[N/2]+=even[N/2-1];
		isSUM=true;
	}
	if(c%2==0)
		return D[c]+even[c/2];
	return D[c]+odd[c/2];
}

留言

這個網誌中的熱門文章

[TIOJ] 1271. [IOI 2012] Scrivener 斯克里夫尼

[TIOJ] 1429. [APIO '12] 忍者調度問題

[Codeforces] 731D. 80-th Level Archeology