1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          「聯合省選 2020 A | B」冰火戰士

          來源:互聯網轉載 時間:2024-01-29 08:17:51

          知識點:

          原題面 Loj Luogu


          考場上寫了二分 + 樹狀數組。
          沒想到可以再二分一次于是加了個 set,水了 60。

          當時還不知道線段樹上二分這種傻逼玩意= =
          今日學到虛脫。


          題意簡述

          簡不動,簡不動。


          分析題意

          讀完題發現全是廢話??煽偨Y出下面幾個結論:

          1. 將冰火人按溫度升序排序,冰人選擇的是一段前綴,火人選擇的是一段后綴。
            答案即 選擇的冰人能量總和 和 火人能量總和 較小的的一方的兩倍。
          2. 選擇的溫度一定是某個人的溫度。

          由結論 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的綜合在線零售商,也是最受歡迎和最具影響力的電子商務...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>