河蟹王國有一位河蟹國王,他的名字叫羊駝。河蟹王國富饒安定,人們和諧相處。有一天,羊駝國王心血來潮,想在一部分人中挑出最和諧的人。於是,羊駝國王將他的子民排成了一列(==!!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希望到達的城市。接下來...