洛谷P3374 【模板】樹狀數組 1(CDQ分治)

来源:http://www.cnblogs.com/zwfymqz/archive/2017/12/12/8029962.html
-Advertisement-
Play Games

題目描述 如題,已知一個數列,你需要進行下麵兩種操作: 1.將某一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。 第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。 接下來M行每行包含3個整數, ...


題目描述

如題,已知一個數列,你需要進行下麵兩種操作:

1.將某一個數加上x

2.求出某區間每一個數的和

輸入輸出格式

輸入格式:

 

第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。

第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來M行每行包含3個整數,表示一個操作,具體如下:

操作1: 格式:1 x k 含義:將第x個數加上k

操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和

 

輸出格式:

 

輸出包含若幹行整數,即為所有操作2的結果。

 

輸入輸出樣例

輸入樣例#1: 複製
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
輸出樣例#1: 複製
14
16

說明

時空限制:1000ms,128M

數據規模:

對於30%的數據:N<=8,M<=10

對於70%的數據:N<=10000,M<=10000

對於100%的數據:N<=500000,M<=500000

樣例說明:

故輸出結果14、16

 

CDQ分治維護二維偏序

第一維用排序搞掉

第二維用CDQ分治

慢的要死。。

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<ctime>
 5 #include<cstdlib>
 6 using namespace std;
 7 #define ls T[now].ch[0]
 8 #define rs T[now].ch[1]
 9 const int MAXN=2*1e6+10;
10 inline char nc()
11 {
12     static char buf[MAXN],*p1=buf,*p2=buf;
13     return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
14 }
15 inline int read()
16 {
17     char c=nc();int x=0,f=1;
18     while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
19     while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();}
20     return x*f;
21 }
22 int n,m;
23 struct node
24 {
25     int idx;//第幾次詢問
26     int val;//修改的值
27     int type;//操作類型 
28     bool operator<( const node &a) const {
29         return idx==a.idx?type<a.type:idx<a.idx;}
30 }Q[MAXN];
31 int qidx=0;//操作的個數
32 int aidx=0;//詢問的個數
33 int ans[MAXN]; 
34 node tmp[MAXN];
35 void CDQ(int l,int r)
36 {
37     if(r-l<=1)    return ;
38     int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid,r);
39     int sum=0;
40     int p=l,q=mid,o=0;
41     while(p<mid&&q<r)
42     {
43         if(Q[p]<Q[q])
44         {
45             if(Q[p].type==1) sum+=Q[p].val;
46             tmp[o++]=Q[p++];
47         }
48         else
49         {
50             if( Q[q].type==2)    ans[Q[q].val]-=sum;
51             else if(Q[q].type==3)    ans[Q[q].val]+=sum;
52             tmp[o++]=Q[q++];
53         }
54     }
55     while(p<mid) tmp[o++]=Q[p++];
56     while(q<r) 
57     {
58         if( Q[q].type==2)    ans[Q[q].val]-=sum;
59         else if(Q[q].type==3)    ans[Q[q].val]+=sum;
60         tmp[o++]=Q[q++];
61     }
62     for(int i=0;i<o;i++) Q[i+l]=tmp[i];
63 }
64 int main()
65 {
66     #ifdef WIN32
67     freopen("a.in","r",stdin);
68     #else
69     #endif
70     n=read();m=read();
71     for(int i=1;i<=n;i++)
72     {
73         Q[qidx].idx=i;
74         Q[qidx].type=1;
75         Q[qidx].val=read();++qidx;
76     }
77     for(int i=0;i<m;i++)
78     {
79         int type=read();
80         Q[qidx].type=type;
81         if(type==1)    Q[qidx].idx=read(),Q[qidx].val=read();
82         else
83         {
84             int l=read(),r=read();
85             Q[qidx].idx=l-1;Q[qidx].val=aidx;++qidx;
86             Q[qidx].type=3;Q[qidx].idx=r;Q[qidx].val=aidx;aidx++;
87         }
88         ++qidx;
89     }
90     CDQ(0,qidx);
91     for(int i=0;i<aidx;i++)    printf("%d\n",ans[i]);
92     return 0;
93 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、棧 1.消失的方式不同:方法變數隨著棧方法的釋放而釋放 2.存儲的位置不同,預設複製的處理機制不同:不會給方法的屬性附初值,可以理解為類中的方法中的屬性為局部變數,無法給局部變數附初值,類的狀態由類的成員變數的值來體現,所以稱類是有狀態的對象,而方法中的變數不能預設附初值,則屬於無狀態,而且存儲 ...
  • name = 'mafen mamengmeng' # 首字元大寫 print(name.capitalize()) # 統計指定字元數 print(name.count('m')) # 字元長度 print(len(name)) # 轉換位元組數組,b''bytes 類型 print(type(na... ...
  • 本文同時發表在 "https://github.com/zhangyachen/zhangyachen.github.io/issues/125" 假設我們有如下結構體: 我們需要對結構體內的欄位進行驗證合法性: Id的值在某一個範圍內。 Name的長度在某一個範圍內。 Email格式正確。 我們可 ...
  • 本文同時發表在 "https://github.com/zhangyachen/zhangyachen.github.io/issues/123" 寫一下fopen/getc/putc等C庫的粗略實現,參考了K&R,但是有幾點根據自己理解的小改動,下麵再具體說一下^_^ 寫這篇文章主要是幫助自己理解 ...
  • Infi-chu: http://www.cnblogs.com/Infi-chu/ 模塊:difflib 安裝:Python版本大於等於2.3系統自帶 功能:對比文本之間的差異,而且支持輸出可讀性比較強的HTML文檔,與Linux中的diff命令比較相似。 兩個字元串的差異對比: 此外diffli ...
  • 第一階段:一年之內的 JAVA 從業人員 這個階段是你成長極快的階段,而且你可能會經常加班。但是加班不代表你就可以鬆懈了,永遠記得我說的那句話,從你入行那一刻起,你就要不停的學習。在這一年裡,你至少需要看完《 Java 編程思想》這本書。這本書的內容是幫助你對於 Java 有一個更加深入的瞭解,是 ...
  • 1、Java開發環境概述 JDK:Java開發工具包(Java Development Kit),包括java編譯器、java運行時環境和常用的類庫; JRE:Java運行時環境(Java Runtime Environment)。 2、跨平臺特性 ①平臺指的是操作系統(Windows,Linux, ...
  • 如果上一篇我轉發的關於ubuntu的博文,你看完覺得還沒準備好,那麼,本篇從最基礎的開始,安裝虛擬機到正常使用ubuntu 虛擬機 1.什麼是虛擬機 虛擬機(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整電腦系統。 通俗的說,我們平常看得見摸 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...