日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

蓝桥杯C++ AB组辅导课 第二讲 二分与前缀和 Acwing

發布時間:2025/3/19 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯C++ AB组辅导课 第二讲 二分与前缀和 Acwing 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

例題

AcWing 789. 數的范圍

給定一個按照升序排列的長度為 n 的整數數組,以及 q 個查詢。

對于每個查詢,返回一個元素 k 的起始位置和終止位置(位置從 0 開始計數)。

如果數組中不存在該元素,則返回 -1 -1。

輸入格式
第一行包含整數 n 和 q,表示數組長度和詢問個數。

第二行包含 n 個整數(均在 1~10000 范圍內),表示完整數組。

接下來 q 行,每行包含一個整數 k,表示一個詢問元素。

輸出格式
共 q 行,每行包含兩個整數,表示所求元素的起始位置和終止位置。

如果數組中不存在該元素,則返回 -1 -1。

數據范圍

1≤n≤100000 1≤q≤10000 1≤k≤10000

輸入樣例:

6 3 1 2 2 3 3 4 3 4 5

輸出樣例:

3 4 5 5 -1 -1 #include <iostream> using namespace std;const int N = 1e5 + 10;int a[N];int main() {int n, q; cin >> n >> q;for (int i = 1; i <= n && cin >> a[i]; i ++ );while (q -- ){int k; cin >> k;int l = 0, r = n + 1;while (l + 1 != r){int m = l + r >> 1;if (a[m] < k) l = m;else r = m;}if (a[r] != k){cout << -1 << ' ' << -1 << endl;continue;}cout << r - 1 << ' ';l = 0, r = n + 1;while (l + 1 != r){int m = l + r >> 1;if (a[m] <= k) l = m;else r = m;}cout << l - 1 << endl;} }

AcWing 790. 數的三次方根

給定一個浮點數 n,求它的三次方根。

輸入格式
共一行,包含一個浮點數 n。

輸出格式
共一行,包含一個浮點數,表示問題的解。

注意,結果保留 6 位小數。

數據范圍

?10000≤n≤10000

輸入樣例:

1000.00

輸出樣例:

10.000000 #include <iostream> #include <iomanip> using namespace std;const double esp = 1e-8;int main() {double n; cin >> n;double l = -1e4 - 10, r = 1e4 + 10;while (r - l > esp){double m = (l + r) / 2;if (m * m * m >= n) r = m;else l = m;}cout << fixed << setprecision(6) << r; }

AcWing 795. 前綴和

輸入一個長度為 n 的整數序列。

接下來再輸入 m 個詢問,每個詢問輸入一對 l,r。

對于每個詢問,輸出原序列中從第 l 個數到第 r 個數的和。

輸入格式
第一行包含兩個整數 n 和 m。

第二行包含 n 個整數,表示整數數列。

接下來 m 行,每行包含兩個整數 l 和 r,表示一個詢問的區間范圍。

輸出格式
共 m 行,每行輸出一個詢問的結果。

數據范圍

1≤l≤r≤n, 1≤n,m≤100000, ?1000≤數列中元素的值≤1000

輸入樣例:

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

輸出樣例:

3 6 10 #include <iostream> using namespace std;const int N = 1e5 + 10;int n, m; int a[N];int main() {cin >> n >> m;for (int i = 1; i <= n && cin >> a[i]; i ++ ) a[i] += a[i - 1];while (m -- ){int l, r; cin >> l >> r;cout << a[r] - a[l - 1] << endl;} }

AcWing 796. 子矩陣的和

輸入一個 n 行 m 列的整數矩陣,再輸入 q 個詢問,每個詢問包含四個整數 x1,y1,x2,y2,表示一個子矩陣的左上角坐標和右下角坐標。

對于每個詢問輸出子矩陣中所有數的和。

輸入格式
第一行包含三個整數 n,m,q。

接下來 n 行,每行包含 m 個整數,表示整數矩陣。

接下來 q 行,每行包含四個整數 x1,y1,x2,y2,表示一組詢問。

輸出格式
共 q 行,每行輸出一個詢問的結果。

數據范圍

1≤n,m≤1000, 1≤q≤200000, 1≤x1≤x2≤n, 1≤y1≤y2≤m, ?1000≤矩陣內元素的值≤1000

輸入樣例:

3 4 3 1 7 2 4 3 6 2 8 2 1 2 3 1 1 2 2 2 1 3 4 1 3 3 4

輸出樣例:

17 27 21 #include <iostream> using namespace std;const int N = 1010;int n, m, q; int a[N][N];int main() {cin >> n >> m >> q;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ ){cin >> a[i][j];a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + a[i][j];}while (q -- ){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;cout << a[x2][y2] - a[x1 - 1][y2] - a[x2][y1 - 1] + a[x1 - 1][y1 - 1] << endl;} }

習題

AcWing 730. 機器人跳躍問題

機器人正在玩一個古老的基于 DOS 的游戲。

游戲中有 N+1 座建筑——從 0 到 N 編號,從左到右排列。

編號為 0 的建筑高度為 0 個單位,編號為 i 的建筑高度為 H(i) 個單位。

起初,機器人在編號為 0 的建筑處。

每一步,它跳到下一個(右邊)建筑。

假設機器人在第 k 個建筑,且它現在的能量值是 E,下一步它將跳到第 k+1 個建筑。

如果 H(k+1)>E,那么機器人就失去 H(k+1)?E 的能量值,否則它將得到 E?H(k+1) 的能量值。

游戲目標是到達第 N 個建筑,在這個過程中能量值不能為負數個單位。

現在的問題是機器人至少以多少能量值開始游戲,才可以保證成功完成游戲?

輸入格式
第一行輸入整數 N。

第二行是 N 個空格分隔的整數,H(1),H(2),…,H(N) 代表建筑物的高度。

輸出格式
輸出一個整數,表示所需的最少單位的初始能量值上取整后的結果。

數據范圍

1≤N,H(i)105,

輸入樣例1:

5 3 4 3 2 4

輸出樣例1:

4

題意 :

  • 初始時e = h[0],依次遍歷數列,e += e - h[i],求最小的h[0](向上取整)使得過程中e永遠大于等于0

思路 :

  • 易知,h[0]越大,整個過程中所有的e越大,因此,具有單調性
  • 剪枝 :因為h[i]的范圍是[1,1e5][1,1e5][1,1e5],因此根據公式,只要在某一狀態下e達到1e5,之后一定遞增或不變,直接返回true
#include <iostream> using namespace std;const int N = 1e5 + 10;int n, a[N];bool check(int e) {for (int i = 1; i <= n; i ++ ){e = 2 * e - a[i];if (e < 0) return false;if (e >= 1e5) return true;}return true; }int main() {cin >> n;for (int i = 1; i <= n && cin >> a[i]; i ++ );int l = 0, r = 100010;while (l + 1 != r){int m = l + r >> 1;if (check(m)) r = m;else l = m;}cout << r; }

AcWing 1221. 四平方和

四平方和定理,又稱為拉格朗日定理:

每個正整數都可以表示為至多 4 個正整數的平方和。

如果把 0 包括進去,就正好可以表示為 4 個數的平方和。

比如:

5=02+02+12+22
7=12+12+12+22
對于一個給定的正整數,可能存在多種平方和的表示法。

要求你對 4 個數排序:

0≤a≤b≤c≤d
并對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最后輸出第一個表示法。

輸入格式
輸入一個正整數 N。

輸出格式
輸出4個非負整數,按從小到大排序,中間用空格分開。

數據范圍

0<N<5?106

輸入樣例:

5

輸出樣例:

0 0 1 2

思路 :

  • 暴力O(n4)O(n^4)O(n4) 優化為 暴力O(n3)O(n^3)O(n3),仍然超時
  • 哈希表法 雖然復雜度為O(n2)O(n^2)O(n2),但常數太大,仍然超時
  • 采用二分法,雖然復雜度為O(n2logn)O(n^2logn)O(n2logn),可以通過
  • 二分枚舉的時候仍然需要優化;有兩個枚舉優化之處:1.雙重循環時,易知第二重循環c * c + d * d <= n;2.第二個優化不容易發現,而且是題目的先決條件,0≤a≤b≤c≤d0≤a≤b≤c≤d0abcd,因此第二重循環以第一重循環為起始
#include <iostream> #include <algorithm> using namespace std;const int N = 9e6;struct Sum {int s, c, d;bool operator< (const Sum &w) const{if (s != w.s) return s < w.s;if (c != w.c) return c < w.c;return d < w.d;} }sum[N]; int n, m;int main() {cin >> n;for (int c = 0; c * c <= n; c ++ )for (int d = c; c * c + d * d <= n; d ++ )sum[ ++ m] = {c * c + d * d, c, d};sort(sum + 1, sum + 1 + m);for (int a = 0; a * a <= n; a ++ )for (int b = a; a * a + b * b <= n; b ++ ){int need = n - a * a - b * b;int l = 0, r = m + 1;while (l + 1 != r){int mid = l + r >> 1;if (sum[mid].s >= need) r = mid;else l = mid;}if (sum[r].s == need){cout << a << ' ' << b << ' ' << sum[r].c << ' ' << sum[r].d;return 0;}} }

AcWing 1227. 分巧克力

兒童節那天有 K 位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友們。

小明一共有 N 塊巧克力,其中第 i 塊是 Hi×Wi 的方格組成的長方形。

為了公平起見,小明需要從這 N 塊巧克力中切出 K 塊巧克力分給小朋友們。

切出的巧克力需要滿足:

形狀是正方形,邊長是整數
大小相同
例如一塊 6×5 的巧克力可以切出 6 塊 2×2 的巧克力或者 2 塊 3×3 的巧克力。

當然小朋友們都希望得到的巧克力盡可能大,你能幫小明計算出最大的邊長是多少么?

輸入格式
第一行包含兩個整數 N 和 K。

以下 N 行每行包含兩個整數 Hi 和 Wi。

輸入保證每位小朋友至少能獲得一塊 1×1 的巧克力。

輸出格式
輸出切出的正方形巧克力最大可能的邊長。

數據范圍

1≤N,K≤105, 1≤Hi,Wi≤105

輸入樣例:

2 10 6 5 5 6

輸出樣例:

2 #include <iostream> using namespace std;const int N = 1e5 + 10;int n, k; int h[N], w[N];bool check(int len) {int res = 0;for (int i = 1; i <= n; i ++ ){res += (h[i] / len) * (w[i] / len);if (res >= k) return true;}return false; }int main() {cin >> n >> k;for (int i = 1; i <= n && cin >> h[i] >> w[i]; i ++ );int l = 0, r = 1e5 + 1;while (l + 1 != r){int mid = l + r >> 1;if (check(mid)) l = mid;else r = mid;}cout << l; }

AcWing 99. 激光炸彈

地圖上有 N 個目標,用整數 Xi,Yi 表示目標在地圖上的位置,每個目標都有一個價值 Wi。

注意:不同目標可能在同一位置。

現在有一種新型的激光炸彈,可以摧毀一個包含 R×R 個位置的正方形內的所有目標。

激光炸彈的投放是通過衛星定位的,但其有一個缺點,就是其爆炸范圍,即那個正方形的邊必須和 x,y 軸平行。

求一顆炸彈最多能炸掉地圖上總價值為多少的目標。

輸入格式
第一行輸入正整數 N 和 R,分別代表地圖上的目標數目和正方形的邊長,數據用空格隔開。

接下來 N 行,每行輸入一組數據,每組數據包括三個整數 Xi,Yi,Wi,分別代表目標的 x 坐標,y 坐標和價值,數據用空格隔開。

輸出格式
輸出一個正整數,代表一顆炸彈最多能炸掉地圖上目標的總價值數目。

數據范圍

0≤R≤109 0<N≤10000, 0≤Xi,Yi≤5000 0≤Wi≤1000

輸入樣例:

2 1 0 0 1 1 1 1

輸出樣例:

1

思路 :

  • 由輸入的數據我們可以得到這個地圖的寬高;注意這個地圖的寬高至少是R,否則就無法進入循環了
  • R最多是5001,多出來的部分沒有意義
  • 枚舉框起來的范圍時,注意我們枚舉右下角
#include <iostream> using namespace std;const int N = 5010;int cnt, R; int w[N][N];int main() {cin >> cnt >> R;R = min(R, 5001);int n = R, m = R;while (cnt -- ){int x, y, ww;cin >> x >> y >> ww;x ++ , y ++ ;n = max(n, x), m = max(m, y);w[x][y] += ww;}for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )w[i][j] = w[i - 1][j] + w[i][j - 1] - w[i - 1][j - 1] + w[i][j];int res = 0;for (int x2 = R; x2 <= n; x2 ++ )for (int y2 = R; y2 <= m; y2 ++ ){int x1 = x2 - R + 1, y1 = y2 - R + 1;res = max(res, w[x2][y2] - w[x1 - 1][y2] - w[x2][y1 - 1] + w[x1 - 1][y1 - 1]);}cout << res << endl; }

AcWing 1230. K倍區間

給定一個長度為 N 的數列,A1,A2,…AN,如果其中一段連續的子序列 Ai,Ai+1,…Aj 之和是 K 的倍數,我們就稱這個區間 [i,j] 是 K 倍區間。

你能求出數列中總共有多少個 K 倍區間嗎?

輸入格式
第一行包含兩個整數 N 和 K。

以下 N 行每行包含一個整數 Ai。

輸出格式
輸出一個整數,代表 K 倍區間的數目。

數據范圍

1≤N,K≤100000, 1≤Ai≤100000

輸入樣例:

5 2 1 2 3 4 5

輸出樣例:

6

題意 :

  • 這里i可以等于j

思路 :

  • (sum[r]?sum[l?1])(sum[r] - sum[l - 1])(sum[r]?sum[l?1]) % k == 0,推出sum[r] % k == sum[l - 1] % k
  • 因此,一維循環即可。遍歷到第i個元素時,只要答案累加 前面 與它 模的結果相同 的個數即可,同時 維護 模的結果 的序列
  • 注意這道題開long long,因為區間數溢出int了
#include <iostream> using namespace std;typedef long long ll;const int N = 1e5 + 10;ll n, k; ll a[N], cnt[N];int main() {cin >> n >> k;for (int i = 1; i <= n && cin >> a[i]; i ++ ) a[i] += a[i - 1];ll res = 0;for (int i = 1; i <= n; i ++ ){res += cnt[a[i] % k];if (a[i] % k == 0) res ++ ;cnt[a[i] % k] ++ ;}cout << res; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的蓝桥杯C++ AB组辅导课 第二讲 二分与前缀和 Acwing的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美456 | 国产精九九网站漫画 | 亚洲AV无码成人精品区明星换面 | av片国产| 日韩人妻无码一区二区三区 | 亚洲熟女少妇一区二区 | 精品无码人妻一区二区三 | 国产成人精品一区二区三区四区 | 国产av无码专区亚洲av麻豆 | 国产精品二区三区 | 日韩精品一区二区三区四区五区 | 日日夜夜免费精品 | 欧美黑人一区二区三区 | 天堂国产| www四虎com| 色综合久久久久综合体桃花网 | 婷婷深爱 | 在线精品亚洲欧美日韩国产 | 三级黄色生活片 | 国产一区二区小说 | 亚洲av永久无码精品一区二区国产 | 中出在线 | 无码精品久久久久久久 | 免费h片网站 | 91在线视频网址 | 久草视频免费 | 欧美亚洲激情视频 | 国产婷婷在线观看 | 国产美女视频免费观看下载软件 | 老司机一区二区 | 天堂av影院| www.av日韩 | 日韩区欧美区 | 欧美色射 | 日本黄色大片免费看 | 国产美女在线免费观看 | 国产做爰xxxⅹ久久久精华液 | 麻豆av导航| 欧美不卡高清 | 国产视频一区二区三区在线 | 无码精品一区二区三区在线播放 | 日本道中文字幕 | 欧美三级午夜理伦三级老人 | 日韩精品极品视频免费观看 | av超碰在线观看 | 亚洲国产精品久久久久久久 | 黄色免费网站 | 免费黄色一级视频 | 国产精品天天av精麻传媒 | 久久99久久久久久 | 中文字幕亚洲激情 | 91亚洲精品一区二区乱码 | 午夜不卡在线观看 | www.av天天 | 国产一级一片免费播放 | 久草在在线视频 | 亚洲性生活大片 | 亚洲AV成人精品 | 99热国产在线观看 | 黑人玩弄人妻一区二区三区影院 | 精品国产一二区 | 中文字幕日韩高清 | 污视频导航 | 亚州av影院 | 国产福利精品在线观看 | 国产精品天天av精麻传媒 | 久久婷香 | 日本免费在线视频 | 午夜免费在线观看 | 日本不卡一区二区三区在线观看 | 在线观看你懂的视频 | 韩国一区二区三区视频 | 内射后入在线观看一区 | 日p视频在线观看 | 亚洲 激情 小说 另类 欧美 | 99国产精 | 青青草免费av| www奇米影视com | 亚洲自拍在线观看 | 51免费看成人啪啪片 | 国产亚洲黄色片 | 国产第一页在线 | 日韩黄色一级大片 | 五十路妻 | 久久av红桃一区二区小说 | 怡红院一区二区三区 | 国产精品刘玥久久一区 | 亚洲观看黄色网 | 好吊视频一区 | av影视在线观看 | 国产一区二区免费在线 | av私库| 欧美日韩免费观看一区=区三区 | 玖玖玖国产精品 | 综合色导航 | 超碰美女 | 亚洲第一二区 | 成人在线视频一区 | 91精品国产欧美一区二区成人 |