洛谷P3960 列隊(動態開節點線段樹)

来源:https://www.cnblogs.com/zwfymqz/archive/2018/11/02/9894424.html
-Advertisement-
Play Games

題意 "題目鏈接" Sol 看不懂splay。。,看不懂樹狀數組。。。 只會暴力動態開節點線段樹 觀察之後不難發現,我們對於行和列需要支持的操作都是相同的:找到第$k$大的元素並刪除,在末尾插入一個元素 這樣我們可以維護$n+1$棵線段樹(對列單獨建一棵) 每次操作的時候,如果$y_i = m$,那 ...


題意

題目鏈接

Sol

看不懂splay。。,看不懂樹狀數組。。。

只會暴力動態開節點線段樹

觀察之後不難發現,我們對於行和列需要支持的操作都是相同的:找到第\(k\)大的元素並刪除,在末尾插入一個元素

這樣我們可以維護\(n+1\)棵線段樹(對列單獨建一棵)

每次操作的時候,如果\(y_i = m\),那麼只對列所在的線段樹進行操作

否則,首先在第\(x_i\)棵線段樹中找到第\(y_i\)大的元素並刪除,在列所在的線段樹中找到需要插入的元素並記錄下來。

然後再刪除列中對應的元素

當然,還有許多很巧妙的操作。

  1. 對於沒有被更改過的點,我們可以\(O(1)\)計算出它的編號。顯然,被更改過的點不會太多,直接拿vector維護即可

  2. 開始時每個線段樹上的對應節點的siz都是滿的,所以對於沒有更新過的區間,直接拿區間長度來獲取siz即可

  3. 我們在查找到某個節點的時候同時也會刪除它,因此查找和刪除操作可以寫到同一個函數中

#include<bits/stdc++.h>
#define LL long long int
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf,  obuf[1 << 24], *O = obuf;
void print(LL x) {
    if(x > 9) print(x / 10);
    *O++= x % 10 + '0';
}
using namespace std;
const int MAXN = 3e5 + 10, SS = MAXN * 20;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0'|| c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, M, Q, cnt, siz[SS], ls[SS], rs[SS], rt[MAXN], tot;
LL las[MAXN << 1];
vector<LL> pos[MAXN];
int Modify(int &k, int l, int r, int kth) {
    if(!k) k = ++tot, siz[k] = r - l + 1;  siz[k]--;
    if(l == r) return l;
    int mid = l + r >> 1, now = (!ls[k] ? mid - l + 1 : siz[ls[k]]);
    if(now < kth) return Modify(rs[k], mid + 1, r, kth - now);
    else return Modify(ls[k], l, mid, kth);
}
LL Query(int y, int x) {
    LL ans = 0;
    if(y == M) ans = las[Modify(rt[0], 1, N + Q, x)];
    else {
        int tmp = Modify(rt[x], 1, M + Q, y);
        if(tmp < M) ans = 1ll * (x - 1) * M + tmp;
        else ans = pos[x][tmp - M];
        pos[x].push_back(las[Modify(rt[0], 1, N + Q, x)]);
    }
    return las[++cnt] = ans;
}
int main() {
    N = read(); M = read(); Q = read();
    for(int i = 1; i <= N; i++) las[++cnt] = 1ll * i * M;
    for(int i = 1; i <= Q; i++) print(Query(read(), read())), *O++ = '\n';
    fwrite(obuf, O-obuf, 1 , stdout);
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在最近的項目中,引用了vux,在可拓展性以及復用性,都算是比較優秀的框架了。但是美中不足的是對於vux在對於vue-cli3.0的跟進還沒有同步 需要自己做下修改,同比 有贊的vant 以及 iview 都有了對於vue-cli3.0的相容了 現記錄如下: 一、安裝vue-cli 3 首先官方文檔: ...
  • ** js裡面不區分整數和小數 var j = 123; alert(j/1000*1000); //在Java裡面結果是0 //在js裡面不區分整數和小數 123/1000 = 0.123 *1000= 123; ** 字元串的相加和相減的操作 var str = "456"; alert(str ...
  • JavaScript的簡介 * 是基於對象和事件驅動的語言,應用於客戶端 - 基於對象: ** 提供好了很多對象,可以直接拿過來使用 - 事件驅動: ** HTML做網站靜態效果,JavaScript動態效果 - 客戶端:專門指的是瀏覽器 * JavaScript的特點 (1)交互性 - 信息的動態 ...
  • 記得中學的課本上,有一篇名為《狂人日記》課文;那時候根本理解不了魯迅寫這篇文章要表達的中心思想,只覺得滿篇的“吃人”令人心情壓抑;老師在講臺上慷慨激昂的講,大多數的同學同我一樣,在課本面前“痴痴”的發呆。 作為一個有著8年Java編程經驗的IT老兵,說起來很慚愧,我被Java當中的四五個名詞一直困擾 ...
  • 我練習的demo是基於SSM+MySQL+Eclipse+Tomcat8+Maven3實現的; 創建項目 ## 創建Maven Project: Artifact Id: cn.com.demo Group Id: demo ## 完成項目的基本配置 ## 生成web.xml ## 添加Tomcat ...
  • 博主按: "《每天一個設計模式》" 旨在初步領會設計模式的精髓,目前採用 (_靠這吃飯_)和 (_純粹喜歡_)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 1. 網速過慢的朋友請移步 "《每天一個設計模式之單例模式》原文地址" 2. 歡迎來我的小站看更多 ...
  • 歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "落影" 發表於 "雲+社區專欄" 正文 本文介紹Metal和Metal Shader Language,以及Metal和OpenGL ES的差異性,也是實現入門教程的心得總結。 一、Metal Metal 是一個和 Ope ...
  • 一個項目,規定10天投產,預估5天開發5天測試(這裡估計的是手工測試),那麼接下來因為各種環境或者開發技術原因導致開發時間延長至8天,測試時間只剩2天,作為本項目的測試你只有2天的時間進行測試。此項目為緊急項目,必須保證到期投產。請問如何處理? ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...