題目描述-->p2357 守墓人
敲了一遍線段樹,水過.
主要思路:
差分
簡單介紹一下差分(詳細概念太麻煩,看下面.
給定乙個陣列
7 8 6 5 1 8 18 20 35 //瞎敲的emmm
7 1 -2 -1 3 10 2 15//對應得到差分陣列.
我們發現從[1,i]求和,得到的就是我們的原陣列對應值.(這就是差分.
為什麼用差分+樹狀陣列?
對應差分,我們修改乙個位置都會對應影響一段區間.
差分的話,我們修改乙個位置就達到了修改後面區間的效果.
而我們修改乙個區間,只需要對於左端點增加k,右端點+1位置減去k即可.
對應差分操作,區間修改操作,我們可以推導出下面的式子.
**-->@胡小兔
學習一下(簡單了解)就可以了.
所以我們就可以很簡單碼出來.
碼量小又簡單,樹狀陣列你值得擁有
--------------------**---------------------
/*
目前樹狀陣列解法rank1(吸氧
timeuse:214ms
creator:顧z
date:2018.09.07
*/#include#define int long long
#define il inline
#define ri register int
#define lowbit(x) x&-x
il void in(int &x)
while(s<='9'&&s>='0')
x*=f;
}int n,m,last,opt,x,y,z,mian;
int sum1[500002],sum2[500002];
il void add(int pos,int x)
il long long query(int pos)
main(void)
}}
再粘一下線段樹**emm↓
/*
線段樹就跑的有些慢了 emmm(未吸氧
zkw線段樹應該會更快一些.
timeuse:594ms
creator:顧z
date:2018.09.03
*/#include#define int long long
#define il inline
#define ri register int
#define ls o<<1
#define rs o<<1|1
#define n 1000008
il void read(int &x)
while(s<='9'&&s>='0')
x*=f;
}int n,f,tr[n],tg[n],mian,c[n];
il void up(int o)
il void build(int o,int l,int r)
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(o);
return;
}il void down(int o,int l,int r)
}il int query(int o,int l,int r,int x,int y)
il void change(int o,int l,int r,int x,int y,int del)
down(o,l,r);
int mid=(l+r)>>1;
if(x<=mid)change(ls,l,mid,x,y,del);
if(y>mid)change(rs,mid+1,r,x,y,del);
up(o);
return;
}signed main()
}}
目前**樹狀陣列解法rank1 ** P2357 守墓人 樹狀陣列 線段樹
在乙個荒涼的墓地上 有乙個令人尊敬的守墓人,他看守的墓地從來 沒有被盜過,所以人們很放心的把自己的先人的墓 安頓在他那 守墓人能看好這片墓地是必然而不是偶然.因為.守墓人懂風水 0.0 他把墓地分為主要墓碑和次要墓碑,主要墓碑 只能有 1 個,守墓人把他記為 1 號,而次要墓碑有 n 1 個,守墓人...
洛谷P2357 守墓人(差分 樹狀陣列)
原題鏈結 什麼是差分?7 8 6 5 8 18 20 35 原陣列 7 1 2 1 3 10 2 15 差分陣列 差分陣列的字首sum i 即原陣列的a i 我們構建兩個樹狀陣列 sum1 7 1 2 1 3 10 2 15 sum2 7 2 6 4 15 60 14 120 第二個陣列是sum1 ...
洛谷P2357 守墓人 線段樹
如果普通暴力做 肯定過不了 那麼我們就要考慮 更高效的 資料結構 比如分塊 線段樹 樹狀陣列等 然後就可以用線段樹過了 要加laz ylazy lazy 標記 比分塊快200ms 200ms 200m s至於主墓的風水和 題目說它是編號1 11 那其實就是區間 1,1 1,1 1,1 的風水和了 就...