HDU 4747 Mex

4747

思路:

線段樹

先求出mex(1,1), mex(1, 2) , mex(1,3),...,mex(1,n)(單調上升),先將這些mex放進線段樹里求和

然后再求出next[i]表示下一次出現a[i] 的位置

然后從前往后不停的刪數,對于一個數a[i],我們刪掉他的影響是:l為mex大于a[i]的位置,r 為next[i],l 到 r-1 之間的 mex都變為 a[i]

然后這個線段樹只需要維護區間最大值(方便查找第一個大于a[i]的位置)和區間和就可以了

代碼:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//headconst int N = 2e5 + 5;
int a[N], nxt[N], mx[N<<2], lazy[N<<2], mex[N];
LL sum[N<<2];
map<int, int>mp;
void push_up(int rt) {sum[rt] = sum[rt<<1] + sum[rt<<1|1];mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
}
void push_down(int rt, int len) {sum[rt<<1] = 1LL * lazy[rt] * (len - (len >> 1));mx[rt<<1] = lazy[rt];lazy[rt<<1] = lazy[rt];sum[rt<<1|1] = 1LL * lazy[rt] * (len >> 1);mx[rt<<1|1] = lazy[rt];lazy[rt<<1|1] = lazy[rt];lazy[rt] = 0;
}
void build(int rt, int l, int r) {if(l == r) {mx[rt] = sum[rt] = mex[l];return ;}int m = (l+r) >> 1;build(ls);build(rs);push_up(rt);
}
void update(int x, int L, int R, int rt, int l, int r) {if(L <= l && r <= R) {mx[rt] = x;sum[rt] = 1LL * (r-l+1) * x;lazy[rt] = x;return ;}if(lazy[rt]) push_down(rt, r-l+1);int m = (l+r) >> 1;if(L <= m) update(x, L, R, ls);if(R > m) update(x, L, R, rs);push_up(rt);
}
LL query(int L, int R, int rt, int l, int r) {if(L <= l && r <= R) return sum[rt];if(lazy[rt]) push_down(rt, r-l+1);int m = (l+r) >> 1;LL ans = 0;if(L <= m) ans += query(L, R, ls);if(R > m) ans += query(L, R, rs);push_up(rt);return ans;
}
int Find(int x, int rt, int l, int r) {if(l == r) return l;int m = (l+r) >> 1;if(lazy[rt]) push_down(rt, r-l+1);if(mx[rt<<1] > x) return Find(x, ls);else return Find(x, rs);
}
int main() {int n;while(~scanf("%d", &n) && n) {mem(lazy, 0);build(1, 1, n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);mp.clear();int tmp = 0;for (int i = 1; i <= n; i++) {mp[a[i]]++;while(mp.find(tmp) != mp.end()) tmp++;mex[i] = tmp;}build(1, 1, n);mp.clear();for (int i = n; i >= 1; i--) {if(mp.find(a[i]) == mp.end()) nxt[i] = n+1;else nxt[i] = mp[a[i]];mp[a[i]] = i;}LL ans = 0;for (int i = 1; i <= n; i++) {ans += query(1, n, 1, 1, n);if(mx[1] <= a[i]) continue;int l = Find(a[i], 1, 1, n);int r = nxt[i];if(l < r) update(a[i], l, r-1, 1, 1, n);}printf("%lld\n", ans);}return 0;
}

?

轉載于:https://www.cnblogs.com/widsom/p/9118494.html

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

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

相關文章

Teams數據統計 - 通話記錄

上篇文章介紹了如何獲取用戶的在線狀態&#xff0c;這篇文章我們記錄介紹如何統計用戶通話記錄。 首先&#xff0c;Teams為了安全&#xff0c;它要求 app 要有 CallRecords.Read.All 權限。然后就可以通過這個api來獲取 call record。 GET /communications/callRecords/{id}這…

linux下mysql的數據庫簡單備份腳本

應用于整個庫的備份。 #!/bin/bash PATH$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin # 數據庫名稱 databases(myname) # 備份目錄 basepath/home/databak/ cd $basepath if [ ! -d "$basepath" ]; thenmkdir -p "$basepath" fi#遍歷數據庫名稱 for …

解決JS浮點數(小數)計算加減乘除的BUG

2019獨角獸企業重金招聘Python工程師標準>>> //浮點數減法運算function FloatSub(arg1,arg2){var r1,r2,m,n;try{r1arg1.toString().split(".")[1].length}catch(e){r10}try{r2arg2.toString().split(".")[1].length}catch(e){r20}mMath.pow(10…

Teams數據統計 - 聊天消息

前兩篇文章介紹了如何對用戶的在線狀態和通話記錄進行數據統計。這篇文章我們來看看如何統計用戶的聊天消息。 在介紹具體 api 如何調用前&#xff0c;我們可以先看一下 Teams 里對于 Message 的層級結構&#xff0c;在 Teams 里&#xff0c;message有兩種&#xff0c;一種是 …

vis.js

1、官網&#xff1a;http://visjs.org/docs/network/ 2、示例&#xff1a; <!doctype html>  <html>     <head>     <title>vis.js</title>     <script type"text/javascript" src"vis.js"></scri…

暑期實習面試——艾锝科技,Python實習生

遠程筆試過&#xff0c;拒絕現場面轉載于:https://www.cnblogs.com/qinziang/p/9123339.html

Teams App 如何使用設備的能力

我們以前講到過&#xff0c;Teams有很多中可以擴展的方面&#xff0c;其中有一種是Tab&#xff0c;開發者可以開發一個web page/app&#xff0c;然后以tab的方式嵌入到teams里面。 除了基本的功能&#xff0c;這種tab也可以使用teams客戶端設備所帶的一些能力&#xff0c;比如…

實驗室3

實驗3.1 1 #include<stdio.h>2 int main()3 { long int sum,i;4 sum0;5 for(i22;i<1003;i20){6 sumsumi;7 }8 printf("sum%ld",sum);9 return 0; 10 } 11 1 #include<stdio.h>2 int main()3 { 4 long int…

寫出整潔的高效的js代碼

Variables:變量 使用有意義的可發音的變量名 Bad: var yyyymmdstr moment().format(YYYY/MM/DD);Good: var yearMonthDay moment().format(YYYY/MM/DD);使用可搜索的命名 在開發過程中&#xff0c;我們閱讀代碼的時間會遠遠超過編寫代碼的時間&#xff0c;因此保證代碼的可讀…

Teams App自定義

當我們開發的 app 被企業安裝后&#xff0c;有些企業挺希望能做一些自定義&#xff0c;如果把app的圖標改的更加符合企業風格一點&#xff0c;或者把app的名字改成讓本企業員工更容易理解一些&#xff0c;或者把app界面的主題色改成個企業風格更加搭配一些&#xff0c;或者對于…

實驗四:xl命令的常見子命令以及操作

實驗名稱&#xff1a; xl命令的常見子命令以及操作 實驗環境&#xff1a; 這里我們需要正常安裝一臺虛擬機&#xff0c;如下圖&#xff1a; 我們這里以一臺busybox為例&#xff0c;來進行這些簡單的常見的操作&#xff1b; 實驗要求&#xff1a; 這里我們準備了5個常見操作&…

Teams App 掃描二維碼

上篇文章我們講了如何在app的manifest里設置設備的權限&#xff0c;這篇文章我們來實際操作開發一個可以掃描二維碼的teams app。 首先&#xff0c;我們先到app studio里&#xff0c;創建一個teams app&#xff0c;然后創建tab&#xff0c;重要的一點是&#xff0c;我們確保ma…

關于我的知識星球服務

2019獨角獸企業重金招聘Python工程師標準>>> 今天剛開通了我的知識星球-攻城師在路上&#xff0c;歡迎大家加入&#xff0c;目前前50名按最低費用收費50元一年&#xff0c;后面會根據人數情況調整。 希望通過這么一個圈子&#xff0c;讓大家信息資源共享&#xff0c…

mysql8用戶管理

查看當前登錄用戶&#xff1a; 創建用戶&#xff1a; create user 用戶名主機地址 identified with mysql_native_password by 密碼; 修改密碼&#xff1a; alter user 用戶名主機地址 identified with mysql_native_password by 新密碼; 原因是&#xff1a;在mysql 5.7.9版本以…

Teams App設備的地理位置能力

我們上一篇文章講了如何在Teams app里掃描二維碼&#xff0c;這篇文章我們來看一下如何獲取當前設備的地理位置&#xff0c;并且在地圖上顯示地理位置。 首先&#xff0c;我們先到app studio里&#xff0c;創建一個teams app&#xff0c;然后創建tab&#xff0c;并且確保我們勾…

第4章 變量、作用域和內存問題

JavaScript高級程序設計第四章知識點梳理 1、基本類型值和引用類型值 基本類型值包括&#xff1a;Boolean、String、undefined、Number、Null 引用類型值&#xff1a;Object 注意&#xff1a;ECMAScript中所有函數的參數都是按值傳遞的。 2、延長作用域鏈 當執行流進入下列任何…

Teams App如何選擇用戶

當我們在開發app的時候&#xff0c;很多時候需要選擇一個用戶&#xff0c;比如我們開發一個審批的app&#xff0c;就要選擇審批人&#xff0c;所以這個app就需要實現選擇人的界面&#xff0c;而且需要獲取完整的用戶列表&#xff0c;但是要獲取完整的用戶列表又需要app擁有較高…

Python終端如何輸出彩色字體

Python終端如何輸出彩色字體 Python終端如何輸出彩色字體 實現過程&#xff1a;終端的字符顏色是用轉義序列控制的&#xff0c;是文本模式下的系統顯示功能&#xff0c;和具體的語言無關。轉義序列是以ESC開頭,即用\033來完成&#xff08;ESC的ASCII碼用十進制表示是27&#xf…

ID4收藏

IdentityServer4.Admin https://github.com/skoruba/IdentityServer4.Admin轉載于:https://www.cnblogs.com/superstar/p/10757886.html