Vijos 河蟹王國

2022-05-01 05:33:10 字數 1661 閱讀 9942

河蟹王國有一位河蟹國王,他的名字叫羊駝。河蟹王國富饒安定,人們和諧相處。有一天,羊駝國王心血來潮,想在一部分人中挑出最和諧的人。於是,羊駝國王將他的子民排成了一列(==!!b汗~好長呀)。每個人都有乙個初始的和諧值。羊駝國王每次會選擇乙個區間[l,r],這個區間中和諧值最大的人就是國王選出的人。而且,在某一時間,區間[l',r']裡的人會變得熟悉,因此他們每個人的和諧值都會上公升乙個相同的值c。羊駝國王想知道,對於每一次選擇,他選出的最大和諧值是多少。

第一行是乙個數n(1<=n<=100000),表示人數。

接下來的n行,每行乙個數,表示排成的序列第i個人和諧值的初始值。

接下來是乙個數m(1<=m<=100000),表示羊駝國王或他的子民有所活動(羊駝國王選擇乙個區間算一次,某區間裡的人增長和諧值算一次)的總次數。

接下來的m行,每行第乙個是乙個數k,k是1或2,若k=1,接下來有三個數l,r,c,表示區間[l,r]的所有人增加c的和諧值;若k=2,接下來有兩個數l,r,表示國王選擇了區間[l,r]。

每次對於國王選擇區間,輸出選擇區間裡的最大和諧值。

512

3453

2 1 4

1 1 3 3

2 3 5

4

6

每個測試點1s。

保證所有的數以及結果都在longint範圍內。

經典問題改編。

。。。帶標記下放的區間最大值,然後sb的我交了,,,4邊quq

1 #include2

#define ll long long

3const

int maxn=1e5+10

;4 inline ll min_(ll x,ll y)

5 inline ll max_(ll x,ll y)

6int

n,m;

7 ll t[maxn<<2],f[maxn<<2];8

void build(int k,int l,int

r)13

int mid=l+r>>1,ls=k<<1,rs=ls|1;14

build(ls,l,mid);

15 build(rs,mid+1

,r);

16 t[k]=max_(t[ls],t[rs]);17}

18void f_down(int k,int ls,int

rs)23

void add(int k,int l,int r,int al,int

ar,ll p)

28int mid=l+r>>1,ls=k<<1,rs=ls|1;29

if(f[k]) f_down(k,ls,rs);

30if(al<=mid) add(ls,l,mid,al,min_(ar,mid),p);

31if(ar>mid) add(rs,mid+1,r,max_(al,mid+1

),ar,p);

32 t[k]=max_(t[ls],t[rs]);33}

34#define inf 8e18

35 ll big(int k,int l,int r,int al,int

ar)44

intmain()

56if(k==2)60

}61return0;

62 }

巧克力王國

link 可以認為是k d樹模板題。當然這只是不帶修改的k d樹,帶修的以後寫了再說。作為一篇學習筆記,先介紹一下什麼是k d樹。要明白一點,即k是乙個變數,用來指代此資料結構處理和維護的空間維數,比如要維護平面上的點或者二元組集合那麼就應該叫做2 d樹 不然真的以為是kbd卡丹樹嗎,那樣叫實在有點...

5028 跳蚤王國

給定一棵 n 個點的樹,求每個點至少需要刪除多少條邊,然後重新加上同等數量的邊才能成為樹的重心。data constraint n 106首先,刪掉邊後重新連邊必然是連在根上。設f i 表示保證 i 的子樹大小小於等於n 2的最少刪邊數,gi 表示這樣刪完後剩餘的樹的大小。轉移顯然可以貪心一下,每次...

2017 8 27 魔法王國

輸入格式 輸入檔案的第一行包含整數n,m,a1,b1,a2,b2。這裡n 3 n 100 是王國裡的城市數 城市從1到n標號 m 2 m 1000 是魔法門的個數 是相鄰的城市,對應的分別是albert和betty的出發城市 也是相鄰的城市,對應的分別是albert和betty希望到達的城市。接下來...