bzoj 1901: Zju2112 Dynamic Rankings

Time Limit:?10 Sec??Memory Limit:?128 MB
Submit:?6245??Solved:?2593
[Submit][Status][Discuss]

Description

給定一個含有n個數的序列a[1],a[2],a[3]……a[n],程序必須回答這樣的詢問:對于給定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的數是多少(1≤k≤j-i+1),并且,你可以改變一些a[i]的值,改變后,程序還能針對改變后的a繼續回答上面的問題。你需要編一個這樣的程序,從輸入文件中讀入序列a,然后讀入一系列的指令,包括詢問指令和修改指令。對于每一個詢問指令,你必須輸出正確的回答。 第一行有兩個正整數n(1≤n≤10000),m(1≤m≤10000)。分別表示序列的長度和指令的個數。第二行有n個數,表示a[1],a[2]……a[n],這些數都小于10^9。接下來的m行描述每條指令,每行的格式是下面兩種格式中的一種。 Q i j k 或者 C i t Q i j k (i,j,k是數字,1≤i≤j≤n, 1≤k≤j-i+1)表示詢問指令,詢問a[i],a[i+1]……a[j]中第k小的數。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改變成為t。

Input

Output

 對于每一次詢問,你都需要輸出他的答案,每一個輸出占單獨的一行。

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

HINT

20%的數據中,m,n≤100; 40%的數據中,m,n≤1000; 100%的數據中,m,n≤10000。

題解:

  支持修改操作的可持久化線段樹,樹狀數組中的每一個點都相當于一棵線段樹,操作類比樹狀數組。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring> 
 5 using namespace std;
 6 const int maxn=2200001;
 7 int N,M,tot,top,siz;
 8 int v[10001],num[20001],hash[20001];
 9 int flag[10001],A[10001],B[10001],K[10001],root[10001];  
10 int sum[maxn],ls[maxn],rs[maxn];
11 int L[30],R[30],a,b;//L[] R[]存儲端點集合 
12 inline int lowbit(int x){
13     return x&(-x);
14 }
15 int find(int x){
16     int l=1,r=tot;
17     while(l<=r){
18         int mid=(l+r)>>1;
19         if(hash[mid]<x) l=mid+1;
20         else r=mid-1;
21     }
22     return l;
23 }
24 void update(int last,int l,int r,int &rt,int w,int x){
25     rt=++siz;//添加一個新節點 
26     sum[rt]=sum[last]+x;
27     ls[rt]=ls[last]; rs[rt]=rs[last];//覆蓋原有的節點 
28     if(l==r) return ;
29     int mid=(l+r)>>1;
30     if(w<=mid) update(ls[last],l,mid,ls[rt],w,x);
31     else update(rs[last],mid+1,r,rs[rt],w,x);
32 }
33 int query(int l,int r,int k){
34     if(l==r) return l;
35     int suml=0,sumr=0;
36     for(int i=1;i<=a;i++) suml+=sum[ls[L[i]]];//根為 L[i]的線段樹區間為(1,mid) 的sum值 
37     for(int i=1;i<=b;i++) sumr+=sum[ls[R[i]]];
38     int mid=(l+r)>>1;
39     if(sumr-suml>=k){//說明答案 在1~mid里 
40         for(int i=1;i<=a;i++) L[i]=ls[L[i]];
41         for(int i=1;i<=b;i++) R[i]=ls[R[i]];
42         return query(l,mid,k);
43     } 
44     else{
45         for(int i=1;i<=a;i++) L[i]=rs[L[i]];
46         for(int i=1;i<=b;i++) R[i]=rs[R[i]];
47         return query(mid+1,r,k-(sumr-suml));
48     }
49 }
50 int main(){
51     char s[3];
52     scanf("%d%d",&N,&M);
53 
54     for(int i=1;i<=N;i++){
55         scanf("%d",&v[i]);
56         num[++top]=v[i];
57     }
58     for(int i=1;i<=M;i++){
59         scanf("%s%d%d",s,&A[i],&B[i]);
60         if(s[0]=='Q'){
61             scanf("%d",&K[i]); flag[i]=1;
62         }
63         else num[++top]=B[i];//把初始值和修改值放在一起,方便知道線段樹的大小 
64     }
65     sort(num+1,num+top+1);
66     hash[++tot]=num[1];
67     for(int i=2;i<=top;i++){//去重 
68         if(num[i]!=num[i-1]) hash[++tot]=num[i];
69     }
70     for(int i=1;i<=N;i++){
71         int t=find(v[i]);//找到v[i]的位置,相當于離散化 
72         for(int j=i;j<=N;j+=lowbit(j)){//樹狀數組更新 
73             update(root[j],1,tot,root[j],t,1);
74         }
75     }
76     
77     for(int i=1;i<=M;i++){
78         if(flag[i]==1){//詢問 
79             a=0; b=0; A[i]--;
80             for(int j=A[i];j>0;j-=lowbit(j))
81                 L[++a]=root[j];
82             for(int j=B[i];j>0;j-=lowbit(j))
83                 R[++b]=root[j];
84             printf("%d\n",hash[query(1,tot,K[i])]);
85         }
86         else{//修改 
87             int t=find(v[A[i]]);
88             for(int j=A[i];j<=N;j+=lowbit(j))//刪除原有影響 
89                 update(root[j],1,tot,root[j],t,-1);
90             v[A[i]]=B[i];//更改 
91             t=find(B[i]);
92             for(int j=A[i];j<=N;j+=lowbit(j))
93                 update(root[j],1,tot,root[j],t,1);
94         }
95     }
96     return 0;
97 }

?

?

轉載于:https://www.cnblogs.com/CXCXCXC/p/5237201.html

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

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

相關文章

第 36 章 RRDTool

36.1. install $ apt-get install rrdtool原文出處&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陳景峯 轉載請與作者聯系&#xff0c;同時請務必標明文章原始出處和作者信息及本聲明。

手機號碼已經注冊寫到數據庫中,如何利用相同手機號碼再次注冊?

手機號碼已經注冊寫到數據庫中&#xff0c;如何利用相同手機號碼再次注冊&#xff1f; 解&#xff1a;刪除數據庫中以前注冊的手機號碼就可以了啊&#xff0c;delete那條記錄&#xff0c;轉載于:https://www.cnblogs.com/panxuejun/p/6122499.html

騰訊技術研究類和數據分析第一次筆試(2021.8.22)——Python

第一題&#xff1a;開鎖——數學期望 # 最優策略&#xff1a;鑰匙的選擇先從消耗時間最少的開始選擇&#xff0c;然后選擇第二小的依次類推 # 開鎖概率1/n def openLockTime(n, m, time):time_reverse [] # (n,m)->(m,n)for i in range(m):m_time []for j in range(n):m…

教你怎樣選擇伺服電機控制方式

伺服電機一般都有三種控制方式&#xff1a;速度控制方式&#xff0c;轉矩控制方式&#xff0c;位置控制方式 。 速度控制和轉矩控制都是用模擬量來控制的。位置控制是通過發脈沖來控制的。具體采用什么控制方式要根據客戶的要求&#xff0c;滿足何種運動功能來選擇。 …

.Net Discovery系列之四 深入理解.Net垃圾收集機制(下)

上一節給大家介紹了 .Net GC的運行機制&#xff0c;下面來講下與GC相關的重要方法。 第二節&#xff0e;GC關鍵方法解析 1.Dispose()方法 Dispose可用于釋放所有資源&#xff0c;包括托管的和非托管的&#xff0c;需要自己實現。 大多數的非托管資源都要求手動釋放&#xff0c;…

真靜態和偽靜態的區別

首先肯定的是純靜態和偽靜態都是SEO的產物&#xff0c;但純靜態和偽靜態還是有很大區別的。 純靜態是生成真實的HTML頁面保存到服務器端&#xff0c;用戶訪問時直接訪問這 個HTML頁面即可&#xff0c;從而大大的減輕了服務器壓力&#xff08;如dedecms就是采用的純靜態&#xf…

非常有趣的Console

console覺醒之路&#xff0c;打印個動畫如何&#xff1f; 原文地址: http://www.helloweba.com/view-blog-383.html 批量去掉或替換文本中的換行符&#xff08;notepad、sublime text2&#xff09; 原文地址&#xff1a;http://m.blog.csdn.net/article/details?id43228729 有…

shopee蝦皮科技測試工程師第一次筆試

10道單選題 10道多選題 2道編程題 第一題&#xff1a;十進制轉二進制計算1的個數&#xff08;負數轉為補碼&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/8/23 15:44 # Author : linlianqin # Site : # File : 十進制轉換為二進制&am…

假期實踐

第一天 地點:杭州頤高數碼城 第一天&#xff0c;我來到了自己家附近的頤高數碼城。文三路這邊有一個賣數碼產品的一條街&#xff0c;這里也是最貼近我專業實踐的地方&#xff0c;所以第一天的實踐我選擇了這里。 2001年開業的頤高數碼廣場座落于“電子一條街”文三路、學院路口…

3.AngularJS-過濾器

轉自&#xff1a;https://www.cnblogs.com/best/p/6225621.html 二、過濾器 使用過濾器格式化數據&#xff0c;變換數據格式&#xff0c;在模板中使用一個插值變量。語法格式如下&#xff1a; {{ express | filter:parameter1:p2:p3… | … | …}} 過濾器分了內置過濾器與自定義…

webstorm卡頓問題

解決webstorm卡頓問題 webstorm強大的功能就不多做介紹了。但是它的缺點也顯而易見&#xff1a;吃內存。 電腦配置稍低一點&#xff0c;運行webstorm就特別容易卡頓&#xff0c;特別是項目比較大的時候&#xff0c;那卡頓得不要不要的。 在我的筆記本8g內存 256ssd的配置下&…

cmd.exe啟動參數說明

啟動命令解釋程序 Cmd.exe 的新范例。如果在不含參數的情況下使用&#xff0c;cmd 將顯示操作系統的版本和版權信息。 語法 cmd [{/c | /k}] [/s] [/q] [/d] [{/a | /u}] [/t:FG] [/e:{on | off}] [/f:{on | off}] [/v:{on | off}] [String] 參數 /c 執行 String 指定的命令&am…

【深度學習】——訓練過程

包含哪些層 訓練過程 其實就是yf(x)的求參過程&#xff0c;先給參數一個初始值&#xff0c;然后根據初始函數計算得到預測值&#xff0c;根據預測值和真值計算損失&#xff0c;然后又根據損失函數進行反向傳播更新參數&#xff0c;更新參數后&#xff0c;再次計算預測值&#…

ABB RAPID 程序 WorldZone 歸納

在 RAPID 程序中&#xff0c;靜態的 WorldZone 不能被解除并再次激活&#xff0c;或者進行擦除。在 RAPID 程序中&#xff0c; 臨時的 WorldZone 可以被解除&#xff08;WZDisable&#xff09; &#xff0c; 再次激活&#xff08;WZEnable&#xff09; 或者擦除&#xff08;WZF…

thinkphp自定義模板標簽(一)

thinkphp內置的foreach和include等模板標簽使用是非常方便的&#xff1b;但是內置的那些標簽只能滿足常用功能&#xff0c;個性化的功能就需要我們自己編寫自定義模板標簽了&#xff1b;下面就是要講解如何實現&#xff1b; 示例環境&#xff1a;thinkphp3.2.3 thinkphp的模板標…

【深度學習】——激活函數(sigmoid、tanh、relu、softmax)

目錄 激活函數 1、作用 2、常用激活函數 3、衡量激活函數好壞的標準&#xff1a; 4、不同的激活函數 1&#xff09;sigmoid 2&#xff09;tanh函數 3&#xff09;RULE函數和leak-relu函數 4&#xff09;softmax函數 激活函數 1、作用 如果只是線性卷積的話&#xff0c…

SDUT 3377 數據結構實驗之查找五:平方之哈希表

數據結構實驗之查找五&#xff1a;平方之哈希表 Time Limit: 400MS Memory Limit: 65536KBSubmit StatisticProblem Description 給定的一組無重復數據的正整數&#xff0c;根據給定的哈希函數建立其對應hash表&#xff0c;哈希函數是H(Key)Key%P&#xff0c;P是哈希表表長&…

我的2017年前端之路總結

原文首發于我的博客 年末了&#xff0c;趕著剛考完兩門考試&#xff0c;在最后4門考試來臨之前抽空寫一下今年的小結。 今年格外忙。忙完本科畢設&#xff0c;又馬上投入了研究生實驗室的搬磚生涯。跟去年一樣&#xff0c;列個今年的學習成果清單&#xff1a; 過去的一年 技術成…

對軟件工程的疑問

在大學時光中學習了算法編程后&#xff0c;我發現我對于源程序理解很差&#xff0c;我只會很低程度的寫代碼&#xff0c;但是基本描述不出來。所以我的編程很差&#xff0c;而且由于我很少打代碼&#xff0c;所以我的編程能力基本沒有多少提高&#xff0c;我也沒有發現該學什么…

【深度學習】——分類損失函數、回歸損失函數、交叉熵損失函數、均方差損失函數、損失函數曲線、

目錄 代碼 回歸問題的損失函數 分類問題的損失函數 1、 0-1損失 (zero-one loss) 2、Logistic loss 3、Hinge loss 4、指數損失(Exponential loss) 機器學習的損失函數 Cross Entropy Loss Function&#xff08;交叉熵損失函數&#xff09; 交叉熵優點 Mean Squared E…