【BZOJ-4631】踩氣球 線段樹 + STL

4631: 踩氣球

Time Limit:?10 Sec??Memory Limit:?256 MB
Submit:?224??Solved:?114
[Submit][Status][Discuss]

Description

六一兒童節到了, SHUXK 被迫陪著M個熊孩子玩一個無聊的游戲:有N個盒子從左到右排成一排,第i個盒子里裝著Ai個氣球。
SHUXK 要進行Q次操作,每次從某一個盒子里拿出一個沒被踩爆的氣球,然后熊孩子們就會立刻把它踩爆。
這M個熊孩子每個人都指定了一個盒子區間[Li, Ri]。 如果某一個時刻,一個熊孩子發現自己選定的盒子區間[Li, Ri]中的所有氣球都已經被踩爆了,他就會非常高興(顯然之后他一直會很高興)。
為了不辜負將自己的任務強行塞給 SHUXK 的那個人的期望, SHUXK 想向你詢問:?
他每次操作過后會有多少個熊孩子很高興。

Input

第一行包含兩個正整數N和M,分別表示盒子和熊孩子的個數。
第二行包含N個正整數Ai( 1 < = Ai < = 10^5),表示每個盒子里氣球的數量。
以下M行每行包含兩個正整數Li, Ri( 1 < = Li < = Ri < = N),分別表示每一個熊孩子指定的區間。
以下一行包含一個正整數Q,表示 SHUXK 操作的次數。
以下Q行每行包含一個正整數X,表示這次操作是從第X個盒子里拿氣球。為了體現在線,我們對輸入的X進行了加密。
假設輸入的正整數是x',那么真正的X = (x' + Lastans ? 1)Mod N + 1。其中Lastans為上一次詢問的答案。對于第一個詢問, Lastans = 0。
輸入數據保證1 < = x' < = 10^9, 且第X個盒子中有尚未被踩爆的氣球。
N < = 10^5 ,M < = 10^5 �,Q < = 10^5

Output

包含Q行,每行輸出一個整數,表示 SHUXK 一次操作后詢問的
答案。答案的順序應與輸入數據的順序保持一致。

Sample Input

5 3
1 1 1 1 1
5 5
2 2
1 3
5
4
2
5
2
3

Sample Output

0
1
1
2
3
【樣例說明】
實際上每次操作的盒子是: 4 2 1 3 5
在第二次操作后,第二個熊孩子會高興 (區間[2,2]中的氣球已經全部被踩爆)。
在第四次操作后,第三個熊孩子會高興(區間[1,3]中的氣球已經全部被踩爆)。
在第五次操作后,第一個熊孩子會高興(區間[5,5]中的氣球已經全部被踩爆)。

HINT

Source

Solution

比較好想的一道題

首先對序列建線段樹,把M個區間建到線段樹上,在線段樹的相應節點上記錄

維護區間的A[]值和

修改操作相當于單點-1

當一個區間的和=0時更新這個區間上的熊孩子區間的答案,然后統計ans

期望的時間復雜度大概是$O(MlogN)$

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
inline int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
#define MAXN 100010
int N,M,Q,size[MAXN],ans,last,A[MAXN];
struct SegmentTreeNode{int l,r,sum; vector<int>v; }tree[MAXN<<2];
inline void Update(int now) {tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;}
inline void PushUp(int now)
{if (tree[now].sum) return;int len=tree[now].v.size(),l=tree[now].l,r=tree[now].r;for (int i=0; i<=len-1; i++)size[ tree[now].v[i] ]-=r-l+1;for (int i=0; i<=len-1; i++)if (!size[ tree[now].v[i] ]) ans++;tree[now].v.clear();
} 
void BuildTree(int now,int l,int r)
{tree[now].l=l; tree[now].r=r;if (l==r) {tree[now].sum=A[l]; return;}int mid=(l+r)>>1;BuildTree(now<<1,l,mid);BuildTree(now<<1|1,mid+1,r);Update(now); PushUp(now);
}
inline void Change(int now,int pos,int D)
{int l=tree[now].l,r=tree[now].r;if (l==r) {tree[now].sum+=D;  PushUp(now); return;}int mid=(l+r)>>1;if (pos<=mid) Change(now<<1,pos,D);if (pos>mid) Change(now<<1|1,pos,D);Update(now); PushUp(now);
}
inline void Cover(int now,int L,int R,int id)
{int l=tree[now].l,r=tree[now].r;if (L<=l && R>=r) {tree[now].v.push_back(id); size[id]=R-L+1; return;}int mid=(l+r)>>1;if (L<=mid) Cover(now<<1,L,R,id);if (R>mid) Cover(now<<1|1,L,R,id);Update(now); PushUp(now);
}
inline int GetX(int x) {return (x+last-1)%N+1;}
int main()
{N=read(),M=read();for (int i=1; i<=N; i++) A[i]=read();BuildTree(1,1,N);for (int L,R,i=1; i<=M; i++) L=read(),R=read(),Cover(1,L,R,i);Q=read();for (int x,i=1; i<=Q; i++) x=GetX(read()),Change(1,x,-1),printf("%d\n",last=ans);return 0;
}

總感覺有種不科學的....畢竟就用了10分鐘就A了...

轉載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5793494.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3D Reconstruction三維重建halcon算子,持續更新

目錄3D Reconstruction三維重建Binocular Stereo雙目立體binocular_disparitybinocular_disparity_mgbinocular_disparity_msbinocular_distancebinocular_distance_mgbinocular_distance_msdisparity_image_to_xyzdisparity_to_distancedisparity_to_point_3ddistance_to_disp…

遺傳算法初級

遺傳算法是一種基于仿生學的計算機算法&#xff0c;通過模擬自然進化和優勝劣汰法則來搜索問題的最優解(我會說這其實就是稍微改良了一下的暴搜&#xff1f;) 它是由美國的J.Holland于1975年提出來的玄學概率學混合暴力搜索方法&#xff0c;廣泛適用于尋找算法優解、機器學習、…

C++ vector容器類型

vector類為內置數組提供了一種替代表示&#xff0c;與string類一樣 vector 類是隨標準 C引入的標準庫的一部分 &#xff0c;為了使用vector 我們必須包含相關的頭文件 &#xff1a;#include <vector> 使用vector有兩種不同的形式&#xff0c;即所謂的數組習慣和 STL習慣…

redis在linux命令行下連續進行命令操作

redis-cli -a password -n 9 keys "friend*" -a 是auth -n 是選擇數據池 keys就是找key啦、 要是后面再跟上 xargs */redis-cli del redis-cli -a password -n 9 keys "friend*" | xargs redis-cli -a password -n 9 del 就完美了23333 轉載于:https://www…

Calibration校準halcon算子,持續更新

目錄Calibration校準Binocular雙目相機binocular_calibrationCalibration Object 校準物體caltab_pointscreate_caltabdisp_caltabfind_calib_objectfind_caltabfind_marks_and_posegen_caltabsim_caltabCamera parameter相機參數cam_mat_to_cam_parcam_par_to_cam_matdeserial…

javascript:正則表達式、一個表單驗證的例子

閱讀目錄 本文內容&#xff1a;正則表達式&#xff1a;利用正則表達式進行表單驗證的例子&#xff1a;回到頂部本文內容&#xff1a; 正則表達式正則表達式的使用方法正則表達式的特殊匹配字符正則表達式修飾符利用正則表達式進行表單驗證的例子首發日期&#xff1a;2018-05-13…

Spring_01 spring容器、控制反轉(IOC)、依賴注入(DI)

目錄 1 什么是spring框架 2 spring框架的特點 3 spring容器 3.1 什么是spring容器 3.2 spring容器創建對象的編程步驟 3.4 spring容器創建對象的方式 3.5 bean元素的幾個重要屬性 4 IOC 4.1 什么是IOC 4.2 什么事DI 4.3 DI的三種方式 1 什么是spring框架 是一個開源的用來簡化企…

EntityFramework 插件之EntityFramework.Extended (批量處理)

接手了一個用EF來做的項目&#xff0c;由于項目中使用的原生處理&#xff0c;導致很多update都是采用先select 后 update的方式來實現&#xff0c;同時無法批量執行邏輯如&#xff1a;根據訂單類型統一更新狀態等。所以在經過了N多查找之后 發現了一個國外寫的擴展插件EntityFr…

一個傳值的問題”*”與”*”

1/********************************************************* 2* Desc:參數傳遞&#xff1a;使用引用傳遞指針和直接傳遞指針地址的區別 3* Author:charley 4* DateTime:2010-12-7 11:00 02***********************************************************/ 03#include <…

Classification分類halcon算子,持續更新

目錄ClassificationGaussian Mixture Models高斯混合模型add_class_train_data_gmmadd_sample_class_gmmclassify_class_gmmclear_class_gmmclear_samples_class_gmmcreate_class_gmmdeserialize_class_gmmevaluate_class_gmmget_class_train_data_gmmget_params_class_gmmget_…

spring boot 擴展之AutoConfigurationImportListener

最近閱讀spring boot源碼時發現&#xff0c;發現當spring使用ConfigurationClassParser加載使用Configuration注解類后&#xff0c;會使用AutoConfigurationImportSelector對加載的 Configuration注解的類進行一次過濾。當AutoConfigurationImportSelector過濾完成后會自動加載…

classpath: spring 中的查找方式

Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件. 比如 resource1.jar中的package com.test.rs 有一個 jarAppcontext.xml 文件,內…

《高效程序員的45個習慣》-之一

敏捷開發是當下最流行的開發方法&#xff0c;它采用的是一種以人為核心、迭代、循序漸進的開發思想&#xff0c;值得你關注和學習。 最近我就閱讀了一本有關敏捷開發的書籍&#xff0c;《高效程序員的45個習慣》。 它以“舉反例”的方式來講述了敏捷開發中程序員應該運用的…

教你如何在 elasticsearch 中重建索引

序言 Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎&#xff0c;為用戶提供搜索服務&#xff0c;當我們決定存儲某種數據時&#xff0c;我們需要使用PUT /teambition創建索引&#xff0c;在創建索引的時候需要將數據結構完整確定下…

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程&#xff0c;但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

MIME Type的介紹

轉載自&#xff1a; http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先&#xff0c;我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么&#xff0c;瀏覽器是如何區分它們&#xff0c;決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神&#xff0c;該項目的想法來源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代碼的重構&#xff0c;并且更換了博客主題。 關于項目&#xff0c;對于開發的練手項目&#xff0c;能夠工程化&#xff0c;嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification&#xff1a;分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…