標籤:否則 解題思路 dex 基本 data- trap series path 檔案夾
題意:
一段區間a一開始是1、2、3、4……n這種 每次1操作能夠將[l,r]覆蓋成x 同一時候得到abs(a[i]-x)的價值 2操作查詢[l,r]的價值
思路:
線段樹 又是一道加深線段樹理解的題
操作2是簡單的求和 線段樹基本操作 痛點在操作1
用cov表示該區間的值(假設為0說明是混合區間) 用val表示該區間的價值和
那麼在更新時就不不過找到 tree[i].l==l&&tree[i].r==r 就停止了 而是繼續向下遞迴 直到一段區間的cov>0才結束
之所以這麼做是由於要將x覆蓋到之前覆蓋過的連續的區間(事實上就是將曾經混合的區間合并成一個) 這是更新val所必須的
但如此做了我們會發現val僅僅計算到了更新過的位置 無法將這次更新down下去 那麼就須要設定一個lazy標誌
lazy記錄該區間還沒有被down下去的價值
代碼:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 101000#define L(x) (x<<1)#define R(x) ((x<<1)|1)typedef __int64 ll;int n,m;struct node{ int l,r,cov; ll val,lazy;}tree[N*4];ll ans;int abs(int x){ if(x<0) return -x; return x;}void up(int i){ tree[i].val=tree[L(i)].val+tree[R(i)].val;}void down(int i){ if(tree[i].cov) { tree[L(i)].cov=tree[i].cov; tree[R(i)].cov=tree[i].cov; tree[i].cov=0; } if(tree[i].lazy) { tree[L(i)].lazy+=tree[i].lazy; tree[L(i)].val+=tree[i].lazy*(tree[L(i)].r-tree[L(i)].l+1); tree[R(i)].lazy+=tree[i].lazy; tree[R(i)].val+=tree[i].lazy*(tree[R(i)].r-tree[R(i)].l+1); tree[i].lazy=0; }}void init(int l,int r,int i){ tree[i].l=l; tree[i].r=r; tree[i].val=tree[i].lazy=0; if(l==r) { tree[i].cov=l; return ; } int mid=(l+r)/2; init(l,mid,L(i)); init(mid+1,r,R(i));}void solve(int i,int key){ if(tree[i].cov) { tree[i].lazy+=abs(key-tree[i].cov); tree[i].val+=(ll)(abs(key-tree[i].cov))*(tree[i].r-tree[i].l+1); tree[i].cov=key; return ; } else { down(i); solve(L(i),key); solve(R(i),key); up(i); } tree[i].cov=key;}void update(int l,int r,int i,int key){ if(tree[i].l==l&&tree[i].r==r) { solve(i,key); return ; } down(i); int mid=(tree[i].l+tree[i].r)/2; if(r<=mid) update(l,r,L(i),key); else if(l>mid) update(l,r,R(i),key); else { update(l,mid,L(i),key); update(mid+1,r,R(i),key); } up(i);}void query(int l,int r,int i){ if(tree[i].l==l&&tree[i].r==r) { ans+=tree[i].val; return ; } down(i); int mid=(tree[i].l+tree[i].r)/2; if(r<=mid) query(l,r,L(i)); else if(l>mid) query(l,r,R(i)); else { query(l,mid,L(i)); query(mid+1,r,R(i)); } up(i);}int main(){ int p,l,r,w; scanf("%d%d",&n,&m); init(1,n,1); while(m--) { scanf("%d%d%d",&p,&l,&r); if(p==1) { scanf("%d",&w); update(l,r,1,w); } else { ans=0; query(l,r,1); printf("%I64d\n",ans); } } return 0;}
閱讀全文 著作權聲明:本文為博主原創文章,未經博主同意不得轉載。
舉報
0條評論
-
-
相關文章推薦
-
codeforces 424C. Magic Formulas (異或規律) 連結:http://codeforces.com/problemset/problem/424/C題目:People in the Tomskaya region like magic fo...
- theArcticOcean
- 2015-12-22 16:27
- 447
-
Codeforces 444C(線段樹) 區間顏色不一致就更新究竟。否則lazy標記#include#include#include#includeusing namespace std;#define lc l,m,index...
- swust_wbh
- 2014-07-07 01:24
- 795
-
CodeForces 631C Report(找規律) 題目連結:【CodeForces 631C】長度是n的數列。m個次訪問,兩種操作:1、t=1,將數列1~r從小到大排序。2、t=2,將數列1~r從大到小排列。輸出最後得到的數列假設i>j&&r...
- YHYYXT
- 2016-03-05 13:51
- 698
-
Codeforces 460C Present(二分) 題目連結:Codeforces 460C Present題目大意:有n盆花,能夠澆m次水。每次澆水的範圍為w。被澆到水的花長高1米,問說能夠使最矮的花的最高值是多少解題思路:二分答案。...
- u011328934
- 2014-08-25 00:07
- 783
-
codeforces 414 c 題意:給出一個長度為n
- u013573306
- 2014-04-16 15:55
- 460
-
Codeforces 479C Exams(貪心) 題目連結:Codeforces 479C Exams題目大意:期末考試了,有個人希望儘快考全然部的科目。於是和每一個科任老師單獨溝通。最後每一個科任老師願意給額外給定一個時間單獨給她考試。...
- u011328934
- 2014-11-02 23:30
- 915
-
CodeForces 140C 貪心+優先隊列 Description如今來做雪人,每一個雪人由三個不同大小的雪球構成:一個大的。一個中等的,一個小的。如今有?n?個雪球半徑分別為?r1,?r2, ...,?rn. 為了做雪人。三個雪球的大小必須...
- HowardEmily
- 2016-11-25 21:39
- 205
-
codeforces-757-【B、C思維】 題目連結:點擊開啟連結A. Gotta Catch Em‘ All!time limit per test1 secondmemory limit per te...
- wang907553141
- 2017-01-16 00:02
- 317
-
Codeforces 466C Number of Ways(高效) 題目連結:Codeforces 466C Number of Ways題目大意:給定一個序列。要求分成三段,每段和同樣,問有多少種拆分方法。解題思路:將所有首碼和為sum3的位置所有記...
- u011328934
- 2014-09-24 15:46
- 770
-
Codeforces 444C DZY Loves Colors 線段樹區間更新 // Codeforces 444C DZY Loves Colors 線段樹區間更新// 題目連結:// http://codeforces.com/problemset/pr...
- TIMELIMITE
- 2016-10-12 20:18
- 171
-
-
House +關注
-
原創
-
282
-
粉絲
-
1
-
喜歡
-
0
- LeetCode 67 Add Binary
- LeetCode 66 Plus One
- LeetCode 65 Valid Number
- LeetCode 64 Minimum Path Sum
很多其它文章
線上課程
-
utm_source=blog7" target="_blank">
-
【直播】機器學習&資料採礦7周實訓--韋瑋
-
-
【套餐】系統整合專案管理project師順利通關--徐朋
收藏助手 不良資訊舉報
<html>