題解 線段樹 關於時間

2021-08-19 17:12:42 字數 2486 閱讀 3624

這是本蒟蒻的原創題

確實很簡單

本蒟蒻loj賬號diogenes

本題的難點在於每個操作會重複多次。核心思想是把第t秒的操作提前到第一秒,再減去多餘的部分。有一種構造方法: ad

d[i.

.j] add

[i..

j]

表示區間【i

,j】 【i,

j】

需要加的值。 de

l[i.

.j] del

[i..

j]

表示區間【i

,j】 【i,

j】

統計答案時需要減去的值。

假設時間

t t

給區間[l

,r]' role="presentation" style="position: relative;">[l,

r][l

,r]加上

x x

,應當給ad

d[l.

.r]' role="presentation" style="position: relative;">add

[l..

r]ad

d[l.

.r]每個加上

x x

,給del[l..r]每個加上x∗

(t−1

)' role="presentation" style="position: relative;">x∗(

t−1)

x∗(t

−1)假設時間t求區間[l

,r] [l,

r]

的和,就計算ad

d[l.

.r]∗

t−de

l[l.

.r] add

[l..

r]∗t

−del

[l..

r]

用線段樹維護區間加,區間和。

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int getint()

else

for(;!isdigit(ch);ch=getchar());

for(;isdigit(ch);ch=getchar())

return t*p;

}inline

long

long getll()

else

for(;!isdigit(ch);ch=getchar());

for(;isdigit(ch);ch=getchar())

return t*p;

}struct seqtree

void treeresize(int n)

seqtree():n(0)

seqtree(int n):n(n),a(n+2),addv(n<<2),sumv(n<<2){}

void maintain(int o,int l,int r)

if(r>l)

}void dfsbuild(int o,int l,int r)

if(lif(mid>=l) dfsbuild(lc,l,mid);

if(mid1,r);

maintain(o,l,r);}}

void build(vector

x,unsigned

int l,unsigned

int r)

seqtree(vector

a)

void updata(int o,int l,int r,int y1,int y2,ll v)

else

}void pushdown(int o,int l,int r)

}ll getsum(int o,int l,int r,int y1,int y2)

pushdown(o,l,r);

ll ret=0;

if(y1<=mid) ret+=getsum(lc,l,mid,y1,y2);

if(y2> mid) ret+=getsum(rc,mid+1,r,y1,y2);

return ret;

}};struct node

node(ll a,ll b,ll c):a(a),b(b),c(c){}

};int n,m;

seqtree del;

int main()

seqtree sum(k),del(k);

scanf("%d",&m);

for(int i=0;iint d,a,b;long

long c;

scanf("%d",&d);

if(d==1)

if(d==2)

}return

0;}

線段樹 題解

nyoj 1068 題目鏈結 題目意思 典型的線段樹,插線問線.不過多了乙個,a 操作某乙個區間乙個數整體加上乙個數 s 操作查詢某乙個區間的總和,q 操作,查詢這個區間有多少個奇數.下面是 線段樹延遲更新,奇數的個數更新時注意 如果變化的是奇數,那麼 現在區間奇數個數 區間長度 原本區間的奇數個數...

關於線段樹

首先肯定推薦學姐部落格!炒雞優秀的學姐!主要是貼 並沒有什麼理論的講解。例題 洛谷p3372 模板 線段樹1 洛谷p3373 模板 線段樹2 線段樹支援單點查詢 單點修改 區間查詢 區間修改等操作。基本思想是二分 將線段樹節點用乙個結構體打包起來 建樹 build 1,1 n void build ...

線段樹練習二 題解

線段樹練習二 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 16 桌子長度 5 盒子數量 4 712 14 1 56 10 11 16 output 41 n nn 100000,1 m mm 10...