<html>

來源:互聯網
上載者:User

標籤:否則   解題思路   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;}


閱讀全文 著作權聲明:本文為博主原創文章,未經博主同意不得轉載。

舉報

  • 標籤:
  • q=codeforces&t=blog" target="_blank">codeforces /

  • 資料結構 /
  • 本文已收錄於下面專欄:
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師順利通關--徐朋
  • 檔案夾
  • 喜歡 取消愛好
  • 收藏
  • 分享 微博 QQ
收藏助手 不良資訊舉報

<html>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.