考場上寫了二分 + 樹狀數組。
沒想到可以再二分一次于是加了個 set,水了 60。
當時還不知道線段樹上二分這種傻逼玩意= =
今日學到虛脫。
簡不動,簡不動。
讀完題發現全是廢話??煽偨Y出下面幾個結論:
由結論 2,考慮先離散化溫度。
考慮答案的單調性,前綴隨溫度遞增,后綴隨溫度遞減。
答案為前后綴最小的一方,顯然為一關于溫度的單峰函數。
首先想到二分溫度,再用樹狀數組求得前綴后綴進行檢查。
復雜度 \(O(Q\log^2 Q)\),期望得分 \(60pts\)。
發現過不去,考慮科技。
//知識點:樹狀數組上二分 /*By:Luckyblock*/#include <algorithm>#include <cstdio>#include <ctype.h>#include <cstring>#define ll long long#define lowbit(x) (x&-x)const int kMaxn = 2e6 + 10;//=============================================================struct Que { int opt, t, x, y, k;} q[kMaxn];int data_num, data[kMaxn];int allfire, pos, ans;//=============================================================inline int read() { int f = 1, w = 0; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1; for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0'); return f * w;}void GetMax(int &fir, int sec) { if (sec > fir) fir = sec;}void GetMin(int &fir, int sec) { if (sec < fir) fir = sec;}struct BitTree { int t[kMaxn]; void Modify(int pos_, int val_) { for (; pos_ < kMaxn; pos_ += lowbit(pos_)) t[pos_] += val_; } int Query(int pos_) { int ret = 0; for (; pos_; pos_ -= lowbit(pos_)) ret += t[pos_]; return ret; }} ice, fire;void Prepare(int Q) { for (int i = 1; i <= Q; ++ i) { q[i].opt = read(); if (q[i].opt == 1) { q[i] = (Que) {q[i].opt, read(), read(), read()}; data[++ data_num] = q[i].x; } else { q[i].k = read(); } } std :: sort(data + 1, data + data_num + 1); data_num = std :: unique(data + 1, data + data_num + 1) - data - 1; for (int i = 1; i <= Q; ++ i) { if (q[i].opt) q[i].x = std :: lower_bound(data + 1, data + data_num + 1, q[i].x) - data; }}void Query() { int len = 0, lsum = 0, rsum = 0; for (int i = 20; i >= 0; -- i) { int l = (1 << i); int newlsum = lsum + ice.t[len + l]; int newrsum = allfire - rsum - fire.t[len + l]; if (len + l <= data_num && newlsum < newrsum) { len += l; lsum += ice.t[len], rsum += fire.t[len]; } } int ans1 = std :: min(lsum, allfire - rsum); int ans2 = std :: min(ice.Query(len + 1), allfire - fire.Query(len)); if (ans1 > ans2) { pos = len, ans = ans1; return ; } ans = ans2; len = 0, lsum = 0, rsum = 0; for (int i = 20; i >= 0; -- i) { int l = (1 << i); int newlsum = lsum + ice.t[len + l]; int newrsum = allfire - rsum - fire.t[len + l]; if (len + l <= data_num && (newlsum < newrsum || std :: min (newlsum, newrsum) == ans)) { len += l; lsum += ice.t[len], rsum += fire.t[len]; } pos = len; }}//=============================================================int main() { int Q = read(); Prepare(Q); for (int i = 1; i <= Q; ++ i) { int opt = q[i].opt, t, x, y, k; if (opt == 1) { t = q[i].t, x = q[i].x, y = q[i].y; if (! t) ice.Modify(x, y); else fire.Modify(x, y), allfire += y; } else { int k = q[i].k; t = q[k].t, x = q[k].x, y = q[k].y; if (! t) ice.Modify(x, - y); else fire.Modify(x, - y), allfire -= y; } Query(); if (ans) printf("%d %d\n", data[pos + 1], 2 * ans); else printf("Peace\n"); } return 0;}
這里是沒寫完常數過大過不去就棄了的的線段樹二分。
還差一步 找到最大的相等的一段。
#include <algorithm>#include <cstdio>#include <ctype.h>#include <cstring>#include <map>#define ll long long#define ls (lson[now_])#define rs (rson[now_])#define allfire (sum[1][1])const int kMaxn = 2e6 + 10;const int kInf = 2e9;//=============================================================int Q, sumfire, sumice, ans1, ans2, q[kMaxn][3];//0 冰 1 火 int root, node_num, sum[kMaxn << 2][2], lson[kMaxn << 2], rson[kMaxn << 2];std :: map <int, int> fire;//=============================================================inline int read() { int f = 1, w = 0; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1; for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0'); return f * w;}void GetMax(int &fir, int sec) { if (sec > fir) fir = sec;}void GetMin(int &fir, int sec) { if (sec < fir) fir = sec;}void Pushup(int now_) { sum[now_][0] = sum[ls][0] + sum[rs][0]; sum[now_][1] = sum[ls][1] + sum[rs][1];}void Modify(int &now_, int L_, int R_, int type, int pos_, int val_) { if (! now_) now_ = ++ node_num; sum[now_][type] += val_; if (L_ == R_) return ; int mid = (L_ + R_) >> 1; if (pos_ <= mid) Modify(ls, L_, mid, type, pos_, val_); else Modify(rs, mid + 1, R_, type, pos_, val_);// Pushup(now_); }int QueryPos(int now_, int L_, int R_, int sum1_, int sum2_) { if (L_ == R_) return sum1_ + sum[now_][0] <= sum2_ ? L_ : 0; int mid = (L_ + R_) >> 1, ret = 0; if (sum1_ + sum[ls][0] < sum2_ - sum[ls][1] + fire[mid]) { //判斷 mid 合法性 ret = mid; GetMax(ret, QueryPos(rs, mid + 1, R_, sum1_ + sum[ls][0], sum2_- sum[ls][1])); } else { GetMax(ret, QueryPos(ls, L_, mid, sum1_, sum2_)); } return ret;}void QuerySum(int now_, int L_, int R_, int pos_) { int mid = (L_ + R_) >> 1; if (pos_ < mid) { QuerySum(ls, L_, mid, pos_); return ; } sumice += sum[ls][0], sumfire -= sum[ls][1]; if (pos_ > mid) QuerySum(rs, mid + 1, R_, pos_);}//=============================================================int main() { Q = read(); for (int i = 1; i <= Q; ++ i) { int opt = read(), t, x, y; if (opt == 1) { t = q[i][0] = read(), x = q[i][1] = read(), y = q[i][2] = read(); Modify(root, 1, kInf, t, x, y); if (t) fire[x] += y; } else { int k = read(); t = q[k][0], x = q[k][1], y = q[k][2]; Modify(root, 1, kInf, t, x, - y); if (t) fire[x] -= y; } int pos = ans1 = QueryPos(root, 1, kInf, 0, allfire); sumice = 0, sumfire = allfire + fire[pos]; QuerySum(1, 1, kInf, pos); ans2 = sumice, sumice = 0, sumfire = allfire + fire[pos + 1]; QuerySum(1, 1, kInf, pos + 1); if (sumfire >= ans2) { ans1 = pos + 1, ans2 = sumfire; } if (! ans2) printf("Peace\n"); else printf("%d %d\n", ans1, 2 * ans2); } return 0;}
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
不銹鐵鍋和生鐵鍋區別?:首先,有生鐵和熟鐵,根據碳含量來區分。生鐵的含碳量為2%-7%,相對較高,并含有少量的錳、硫等元素。熟鐵一般是生鐵經過精煉后制成的,碳含量有所下降。生鐵鍋又稱鑄鐵鍋,由灰鐵直接熔化澆注而成。一般這種壺底厚,重量大。熟鐵鍋又稱精鐵鍋,由熟鐵鍛造而成。這種壺比較薄,但是柔韌性和延展性都很好。生熟鐵鍋各有利弊,要根據需要選擇。不銹鐵鍋和生鐵鍋區別?不銹鐵鍋和生鐵鍋都是鐵鍋,但不銹...
沈陽有哪個地方有好的羽毛球館?鐵西有很多羽毛球館,比如四維,凱盛,都是老牌的羽毛球館。但是現在設施老舊,人多,訂場地不是很方便。最近,帝豪旗下的星摩爾新開了一家羽毛球館。里面的設施都很好,但是是會員制的,需要辦卡。沈陽大東都有哪些羽毛球館?大東區滂江街86號嘉潮州城4樓。瑞誠健健身俱樂部有羽毛球,游泳,健身,籃球。羽毛球好像一小時60,還有20多場。沈陽鐵西室內羽毛球館都在那里?鐵西四維羽毛球地址...
怎么進入京東商城?手機登錄JD.COM商城的步驟:1.以手機JD.COM商城APP為例,打開應用主頁面,點擊頁面下方的“我的”菜單項;2.接下來,在打開的頁面中,點擊頁面頂部的“登錄”按鈕,進入賬號登錄頁面;3.最后在賬號登錄頁面輸入賬號和密碼,完成登錄操作。成功登錄后,頁面上會顯示JD.COM的賬戶信息?!毒〇|商城》是干什么的?它是JD.COM的綜合在線零售商,也是最受歡迎和最具影響力的電子商務...