12:Challenge 5(線段樹區間直接修改)

来源:http://www.cnblogs.com/zwfymqz/archive/2017/07/19/7208036.html
-Advertisement-
Play Games

給一個長為N的數列,有M次操作,每次操作是以下兩種之一: (1)將某連續一段同時改成一個數 (2)求數列中某連續一段的和 ...


總時間限制: 
10000ms
 
單個測試點時間限制: 
1000ms
 
記憶體限制: 
262144kB
描述

給一個長為N的數列,有M次操作,每次操作是以下兩種之一:

(1)將某連續一段同時改成一個數

(2)求數列中某連續一段的和

輸入
第一行兩個正整數N和M。
第二行N的整數表示這個數列。
接下來M行,每行開頭是一個字元,若該字元為'M',則表示一個修改操作,接下來三個整數x、y和z,表示在[x,y]這段區間的數改為z;若該字元為'Q',則表示一個詢問操作,接下來兩個整數x和y,表示求[x,y]這段區間的和。
輸出
對每一個詢問操作單獨輸出一行,表示答案。
樣例輸入
5 3
1 2 3 4 5
Q 1 5
M 2 3 2
Q 3 5
樣例輸出
15
11
提示
1<=N<=10^5,1<=M<=10^5,輸入保證合法,且所有整數及答案可用帶符號32位整型存儲。
對於線段樹的直接修改,
我們首先考慮要維護一個修改標記,
註意這個標記是可以每次被覆蓋的!
然後值直接區間修改就好
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #define ls k<<1
  5 #define rs k<<1|1
  6 using namespace std;
  7 const int MAXN=100001;
  8 const int maxn=0x7ffff;
  9 void read(int &n)
 10 {
 11     char c='+';int x=0;bool flag=0;
 12     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
 13     while(c>='0'&&c<='9')
 14     x=(x<<1)+(x<<3)+c-48,c=getchar();
 15     flag==1?n=-x:n=x;
 16 }
 17 int n,m;
 18 int ans=0;
 19 struct node
 20 {
 21     int l,r,w,f;
 22     node()
 23     {
 24         l=r=w=0;
 25         f=-maxn;
 26     }
 27 }tree[MAXN<<2];
 28 void update(int k)
 29 {
 30     tree[k].w=tree[ls].w+tree[rs].w;
 31 }
 32 void build(int ll,int rr,int k)
 33 {
 34     tree[k].l=ll;tree[k].r=rr;
 35     if(ll==rr)
 36     {
 37         read(tree[k].w);
 38         return ;
 39     }
 40     int mid=(ll+rr)>>1;
 41     build(ll,mid,ls);
 42     build(mid+1,rr,rs);
 43     update(k);
 44 }
 45 void push(int k)
 46 {
 47     tree[ls].w=(tree[ls].r-tree[ls].l+1)*tree[k].f;
 48     tree[rs].w=(tree[rs].r-tree[rs].l+1)*tree[k].f;
 49     tree[ls].f=tree[k].f;
 50     tree[rs].f=tree[k].f;
 51     tree[k].f=-maxn;
 52     
 53 }
 54 void change(int k,int wl,int wr,int v)
 55 {
 56     if(wr<tree[k].l||wl>tree[k].r)
 57         return ;
 58     if(wl<=tree[k].l&&tree[k].r<=wr)
 59     {
 60         tree[k].w=(tree[k].r-tree[k].l+1)*v;
 61         tree[k].f=v;
 62         return ;
 63     }
 64     int mid=(tree[k].l+tree[k].r)>>1;
 65     if(tree[k].f!=-maxn)
 66         push(k);
 67         change(ls,wl,wr,v);
 68         change(rs,wl,wr,v);
 69     update(k);
 70 }
 71 void ask(int k,int wl,int wr)
 72 {
 73     if(wr<tree[k].l||wl>tree[k].r)
 74         return ;
 75     if(wl<=tree[k].l&&tree[k].r<=wr)
 76     {
 77         ans+=tree[k].w;
 78         return ;
 79     }
 80     int mid=(tree[k].l+tree[k].r)>>1;
 81     if(tree[k].f!=-maxn)
 82         push(k);
 83         ask(ls,wl,wr);
 84         ask(rs,wl,wr);
 85     update(k);
 86 }
 87 int main() 
 88 {
 89     read(n);read(m);
 90     build(1,n,1);
 91     for(int i=1;i<=m;i++)
 92     {
 93         char c;int x,y;
 94         cin>>c;
 95         read(x);read(y);
 96         if(c=='M')
 97         {
 98             int v;
 99             read(v);
100             change(1,x,y,v);
101         }
102         else
103         {
104             ans=0;
105             ask(1,x,y);
106             printf("%d\n",ans);
107         }
108     }
109     return 0;
110 }
111 12: Challenge 5最近的提交

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 對於java開發者而言,註解應該不是一個陌生的概念,早在JavaSE階段,例如@Override標記重寫父類方法或實現介面方法,@Test標記單元測試方法,所以我們可以簡單地把它理解為一種有特殊含義的標記...在開發過程中,我們還可以用註解方式替代配置文件實現相關功能,例如Java web開發 ...
  • 操作系統:CentOS6.9_x64 python版本 : python2.7.13 添加低許可權新用戶: 使用virtualenv安裝python2.7環境 可以參考我之前寫的博文: http://www.cnblogs.com/MikeZhang/p/virtualenvPython_201506 ...
  • 對Python有一定瞭解的人應該知道,Python並不是一門函數式編程語言,而是一門支持多種範式的語言,這也使得在Python中也能實現函數式編程, 對於學習到Python函數式編程的朋友,在這裡推薦大家看一本名字叫《Python函數式編程》(Functional Programming in Py ...
  • 繼續我的這個項目的第三晚的開發了,時間比較少,今晚寫的代碼不多,今晚仍然是造輪子寫一個公共的控制器和一個公共的JS。直接上代碼吧! 以下是一個公共的控制器,後臺控制器都繼承於它,構造函數中進行驗證當前用戶是否登錄狀態和提供快獲取當前登錄用戶的數據。 以下一段JS,主要是做一些表單操作的方法。 今晚就 ...
  • 微信自2013年流行起來,現在的發展已經超過了我們的想象,那麼對應的公眾平臺,小程式等都是讓人眼前一亮的東西,這裡來學習一下微信工作號的對接,實現為Java,希望大家一起學習! 這裡大概描述一下所需的準備工作內容,具體實現可網上查詢或微信公眾號留意: 1、開通一個微信公眾號,去註冊一個就好。http ...
  • 一) 數組: 1) 數組的長度和類型固定 2) 幾大要素: int[] arr = new int[5]; 下標(數組的下標從0開始) 元素:arr[i] i>=0&&i<5 類型,此處為int型 長度,查看數組長度arr.length,此處為5 二) 數組中兩大基本概念:棧-堆 1、本質區別: 數 ...
  • 註意:本教程使用的開發環境是:(專業版) 1 創建javaSE項目 1.1 file -> new -> project 註意:如果是第一次使用,就需要配置 project SDK , 就是制定一個JDK,將自己安裝好的JDK加進來就行啦 是否按照模板來創建(一般不選擇這一項) 設置項目名稱和項目存 ...
  • 前言:工作中看到項目組裡的大牛寫代碼大量的用到了StringUtils工具類來做字元串的操作,便學習整理了一下,方便查閱。 isEmpty(String str) 是否為空,空格字元為false isNotEmpty(String str) 是否為非空,空格字元為true isBlank(Strin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...