hdu 1754 塊狀鏈表 單點修改+單點查詢

經典的線段樹題目,也可以用塊狀鏈表做。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <cmath>
  5 using namespace std;
  6 
  7 const int N = 200000;
  8 const int M = 800;
  9 int n, m, tot;
 10 
 11 int max( int a, int b )
 12 {
 13     return a > b ? a : b;
 14 }
 15 
 16 struct Block
 17 {
 18     int num[M];
 19     int size, maxn;
 20     void init()
 21     {
 22         size = maxn = 0;
 23     }
 24     void push( int tmp )
 25     {
 26         num[size++] = tmp;
 27         if ( tmp > maxn ) maxn = tmp;
 28     }
 29 } bl[M];
 30 
 31 void update( int pos, int v )
 32 {
 33     int cur = 0;
 34     while ( pos > bl[cur].size )
 35     {
 36         pos -= bl[cur].size;
 37         cur++;
 38     }
 39     bl[cur].num[pos - 1] = v;
 40     bl[cur].maxn = 0;
 41     for ( int i = 0; i < bl[cur].size; i++ )
 42     {
 43         bl[cur].maxn = max( bl[cur].maxn, bl[cur].num[i] );
 44     }
 45 }
 46 
 47 int query( int l, int r )
 48 {
 49     int cur = 0, inc = r - l;
 50     while ( l > bl[cur].size )
 51     {
 52         l -= bl[cur].size;
 53         cur++;
 54     }
 55     int ncur = cur;
 56     r = l + inc;
 57     while ( r > bl[ncur].size )
 58     {
 59         r -= bl[ncur].size;
 60         ncur++;
 61     }
 62     int ans = 0;
 63     for ( int i = cur + 1; i <= ncur - 1; i++ )
 64     {
 65         ans = max( ans, bl[i].maxn );
 66     }
 67     if ( cur == ncur )
 68     {
 69         for ( int j = l - 1; j < r; j++ )
 70         {
 71             ans = max( ans, bl[cur].num[j] );
 72         }
 73     }
 74     else
 75     {
 76         for ( int j = l - 1; j < bl[cur].size; j++ )
 77         {
 78             ans = max( ans, bl[cur].num[j] );
 79         }
 80         for ( int j = 0; j < r; j++ )
 81         {
 82             ans = max( ans, bl[ncur].num[j] );
 83         }
 84     }
 85     return ans;
 86 }
 87 
 88 int main()
 89 {
 90     while ( scanf("%d%d", &n, &m) != EOF )
 91     {
 92         tot = 0;
 93         bl[tot].init();
 94         int ps = sqrt((double)n);
 95         for ( int i = 0; i < n; i++ )
 96         {
 97             int tmp;
 98             scanf("%d", &tmp);
 99             if ( bl[tot].size == ps )
100             {
101                 tot++;
102                 bl[tot].init();
103             }
104             bl[tot].push(tmp);
105         }
106         char op[2];
107         int a, b;
108         while ( m-- )
109         {
110             scanf("%s%d%d", op, &a, &b);
111             if ( op[0] == 'Q' )
112             {
113                 printf("%d\n", query( a, b ));
114             }
115             else
116             {
117                 update( a, b );
118             }
119         }
120     }
121     return 0;
122 }

對于這個題操作種類很少,可以寫成二維數組的形式,看起來更簡潔。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 const int M = 550;
 8 int b[M][M];
 9 int maxn[M];
10 int n, q;
11 int ps;
12 
13 int max( int a, int b )
14 {
15     return a > b ? a : b;
16 }
17 
18 void setv( int i, int j, int v )
19 {
20     b[i][j] = v;
21     maxn[i] = max( maxn[i], b[i][j] );
22 }
23 
24 int query( int l, int r )
25 {
26     int cur = l / ps, ncur = r / ps;
27     l = l % ps, r = r % ps;
28     int ret = -1;
29     for ( int i = cur + 1; i <= ncur - 1; i++ )
30     {
31         ret = max( ret, maxn[i] );
32     }
33     if ( cur != ncur )
34     {
35         for ( int j = l; j < ps; j++ )
36         {
37             ret = max( ret, b[cur][j] );
38         }
39         for ( int j = 0; j <= r; j++ )
40         {
41             ret = max( ret, b[ncur][j] );
42         }
43     }
44     else
45     {
46         for ( int j = l; j <= r; j++ )
47         {
48             ret = max( ret, b[cur][j] );
49         }
50     }
51     return ret;
52 }
53 
54 void update( int pos, int val )
55 {
56     int i = pos / ps, j = pos % ps;
57     b[i][j] = val;
58     maxn[i] = -1;
59     for ( int k = 0; k < ps && i * ps + k < n; k++ )
60     {
61         maxn[i] = max( maxn[i], b[i][k] );
62     }
63 }
64 
65 int main ()
66 {
67     ps = 500;
68     while ( scanf("%d%d", &n, &q) != EOF )
69     {
70         memset( maxn, -1, sizeof(maxn) );
71         for ( int i = 0; i < n; i++ )
72         {
73             int tmp; scanf("%d", &tmp);
74             setv( i / ps, i % ps, tmp );
75         }
76         char op[2];
77         int a, b;
78         while ( q-- )
79         {
80             scanf("%s%d%d", op, &a, &b);
81             if ( op[0] == 'Q' )
82             {
83                 a--; b--;
84                 printf("%d\n", query( a, b ));
85             }
86             else
87             {
88                 a--;
89                 update( a, b );
90             }
91         }
92     }
93     return 0;
94 }

?

轉載于:https://www.cnblogs.com/huoxiayu/p/4471049.html

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

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

相關文章

靶場練習第四天~vulnhub靶場之Lazysysadmin

靶機下載鏈接: https://pan.baidu.com/s/1MMkgaYLRc78YX4s6nvqdjQ 提取碼: djpm 信息收集 查看kali的IP 使用nmap 192.168.101.0/24 探測靶機IP 發現開放445端口&#xff0c;并且開放的服務microsoft-ds。可以用enum4linux工具來掃描共享文件&#xff0c;使用方法: enum4linux…

關于代碼手寫UI,xib和StoryBoard

代碼手寫UI 這種方法經常被學院派的極客或者依賴多人合作的大型項目大規模使用。Geek們喜歡用代碼構建UI&#xff0c;是因為代碼是鍵盤敲出來的&#xff0c;這樣可以做到不開IB&#xff0c;手不離開鍵盤就完成工作&#xff0c;可以專注于編碼環境&#xff0c;看起來很cool很高效…

ODAC(V9.5.15) 學習筆記(十)TVirtualTable

名稱 類型 說明 Options TVirtualTableOptions 選擇項&#xff0c;包括&#xff1a; voPersistentData&#xff1a;在數據集關閉時不處理其相關數據內容 voStored&#xff1a;設計期對數據集的處理以及錄入的數據將保存在DFM文件中 AddField 增加一個字段&#xff0c…

SQLSERVER如何獲取一個數據庫中的所有表的名稱、一個表中所有字段的名稱

1.查詢數據庫中的所有數據庫名&#xff1a; 1 SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查詢某個數據庫中所有的表名&#xff1a; 1 SELECT Name FROM SysObjects Where XTypeU ORDER BY Name 3.查詢表結構信息&#xff1a; 1 SELECT (case when a.colorder1 …

靶場練習第五天~vulnhub靶場之basic_pentesting_1

一、信息收集 1.主機發現 靶機下載鏈接: https://pan.baidu.com/s/143q3cbZG6-8y8kMk51Lc_Q 提取碼: i8hv &#xff08;1&#xff09;Netdiscover&#xff1a;專用的二層發現工具&#xff0c;擁有主動和被動發現兩種方式 具體操作如下&#xff0c;查看一下kali的ip 然后使用…

計算機網絡學習筆記(二) 計算機網絡結構

什么是網絡結構&#xff1f; n 網絡邊緣: 主機網絡應用 n 接入網絡&#xff0c;物理介質:有線或無線通信鏈路 n 網絡核心&#xff08; 核心網絡&#xff09; :互聯的路由器&#xff08;或分組轉發設備&#xff09;網絡之網…

Javascript常用的設計模式詳解

Javascript常用的設計模式詳解 閱讀目錄 一&#xff1a;理解工廠模式二&#xff1a;理解單體模式三&#xff1a;理解模塊模式四&#xff1a;理解代理模式五&#xff1a;理解職責鏈模式六&#xff1a;命令模式的理解&#xff1a;七&#xff1a;模板方法模式八&#xff1a;理解ja…

靶場練習第六天~vulnhub靶場之Lampiao

靶機下載鏈接: https://pan.baidu.com/s/1h0uiwvBkX8iXFyMAO23e1A 提取碼: 2kjp 一、信息收集 1.靶機發現 &#xff08;1&#xff09;靶機lampiao與kali均為NAT模式 ,Kali的 IP為192.168.101.10, 掃描網段用命令nmap -sp192.168.101.0/24&#xff0c;發現靶機ip為192.168.10…

生成百度地圖 如何弄

http://api.map.baidu.com/lbsapi/creatmap/index.html轉載于:https://www.cnblogs.com/qinqiu/p/4476747.html

內存泄露從入門到精通三部曲之排查方法篇

最原始的內存泄露測試 重復多次操作關鍵的可疑的路徑&#xff0c;從內存監控工具中觀察內存曲線&#xff0c;是否存在不斷上升的趨勢且不會在程序返回時明顯回落。這種方式可以發現最基本&#xff0c;也是最明顯的內存泄露問題&#xff0c;對用戶價值最大&#xff0c;操作難度小…

靶場練習第七天~vulnhub靶場之mrRobot

靶機下載鏈接: 百度網盤 請輸入提取碼 提取碼: sqv3 一、主機發現 1.用ifconfig查看kali的ip&#xff0c;因為kali和靶機都開啟了NAT模式&#xff0c;使用namp -sP 192.168.101.0/24探測靶機ip 二、信息收集 1.使用nmap掃描靶機 使用nmap -A 192.168.101.108 &#xff0c;查…

JAVA第二次試驗

北京電子科技學院&#xff08;BESTI&#xff09; 實 驗 報 告 課程&#xff1a;Java程序設計 班級&#xff1a;1352 姓名&#xff1a;潘俊洋 學號&#xff1a;20135230 成績&#xff1a; 指導教師:婁嘉鵬 實驗日期:2015.5.4 實驗密級&#xff1a…

【轉】怎么樣從一個瘋狂下載者成為一個學習者!!!值得反省下的問題·~~

為了方便廣大網友&#xff0c;各種網站也應運而生。當網絡的建設和發展正進行的如火如荼&#xff0c;喧鬧之中&#xff0c;搭配學習這壺美酒的&#xff0c;竟是一瓶名叫資料下載的毒藥&#xff0c;更糟糕的是&#xff0c;美酒和毒藥已經被灌到了同一個杯子里&#xff0c;渾然一…

靶場練習第八天~vulnhub靶場之CH4INRULZ_v1.0.1

一、前期準備 1.靶機下載 鏈接: 百度網盤 請輸入提取碼 提取碼: z37y 2.用命令ifconfig查看kali 二、信息收集 1.主機發現&#xff0c;使用nmap命令 具體使用方法&#xff1a;nmap -sP 192.168.101.0/24 2.查看該靶機開放了哪些端口 nmap -A 192.168.101.109 直接訪問80端…

C# 不支持關鍵字: “.;database”。

解決方案分析:這個一定是鏈接字符串有問題&#xff0c;核對web.config 和程序的字符串是否有誤轉載于:https://www.cnblogs.com/louby/p/5208986.html

TImus 1073 Square Country DP

題意&#xff1a;給出一個數n(1<n<60000),這個數可以寫成一些數的平方的和&#xff0c; 問對于n&#xff0c;最少可以分成多少個數的平方的和。 比如&#xff1a;n344&#xff0c;則34418*184*42*2&#xff0c;輸出3. dp[i]表示i這個數最少可以分成多少個數的平方的和。 …

vulnhub靶機獲取不到ip

1.啟動靶機&#xff0c;出現如下圖所示&#xff0c;按e 2.進入如下圖所示時&#xff0c;將ro 替換為 rw signie init/bin/bash 3.按下Ctrl鍵X鍵&#xff0c;重啟服務進入如下界面 4.查看當前網卡IP信息 ip a 5.編輯網卡配置文件vi /etc/network/interfaces 6.發現網卡名字與剛…

apache整合tomcat部署集群

近日&#xff0c;由于公司項目需要&#xff0c;所以學習了apache整合tomcat以及集群的一些知識。 所以做下筆記日后回顧可以用到。 apache只有處理靜態事物的能力&#xff0c; 而tomcat的強項就是處理動態的請求&#xff0c;所以apache和tomcat整合相互取長補短&#xff0c;由a…

Cpk

CPK&#xff1a;Complex Process Capability index 的縮寫&#xff0c;是現代企業用于表示制程能力的指標。制程能力是過程性能的允許最大變化范圍與過程的正常偏差的比值。制程能力研究在於確認這些特性符合規格的程度&#xff0c;以保證制程成品不符規格的不良率在要求的水準…

靶場練習第九天~vulnhub靶場之dc-1

一、環境搭建 靶場下載鏈接: 百度網盤 請輸入提取碼 提取碼: ih67 1.查看kali的ip&#xff1a;ifconfig 二、信息收集 1.使用namp命令 主機探測: nmap -sP 192.168.101.0/24 查看靶機開放端口號和服務:nmap -A 192.168.101.111 發現開放80端口,訪問一下192.168.101.111 Dru…