1. 程式人生 > >[Codeforces264E][線段樹][DP]Roadside Trees

[Codeforces264E][線段樹][DP]Roadside Trees

翻譯

1n1∼n 的位置能種樹,剛開始能種樹。
ii 個時刻會有操作:
1.在一個沒種過樹的位置 pip_i種一顆高度為hih_i的樹。
2.砍掉第 xix_i棵樹,保證這個位置以後不會種樹。
每天樹會長高11
每執行一次操作,輸出最長上升子序列長度
任意時刻樹的高度不同

題解

看完題…不會做
看完資料範圍…有點想法
每次加入的高度不會超過10
每次刪除的樹不會超過前十個
保證任意時刻沒有樹的高度是相同的
每個點記錄一個dp[i]dp[i]表示以他為開頭的LIS
顯然加入一棵樹的時候只會影響最多10棵樹的答案
刪除一棵樹的時候也只會影響最多10棵樹的答案
對於加入,你開一棵線段樹,把高度>10的樹扔進去,以位置為下標
對於刪除,再開一棵線段樹,把位置>10的樹扔進去,以高度為下標
支援最大值
亂搞搞…

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define lc now<<1
#define rc now<<1|1
using namespace std; inline LL read() { LL f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void write(int x) { if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar(x%10
+'0'); } inline void pr1(int x){write(x);printf(" ");} inline void pr2(int x){write(x);puts("");} int tim; struct ph { int h,x; ph(){} ph(int _h,int _x){h=_h;x=_x;} }w[200100];int v[200100]; bool cmp1(ph n1,ph n2){return n1.h<n2.h;} bool cmp2(ph n1,ph n2){return n1.x<n2.x;} ph li[200100];int pos; int s[200100],f[200100],ln; int lowbit(int x){return x&-x;} void chpos(int x,int c){for(x;x<=200000;x+=lowbit(x))s[x]+=c;} int findKth(int K) { int now=0,sum=0; for(int i=18;i>=0;i--) if(now+(1<<i)<=200000&&sum+s[now+(1<<i)]<K)sum+=s[now+(1<<i)],now+=(1<<i); return now+1; } int mx[2][410000*4]; void modify(int now,int l,int r,int p,int c,int op) { if(l==r){mx[op][now]=c;return ;} int mid=(l+r)/2; if(p<=mid)modify(lc,l,mid,p,c,op); else modify(rc,mid+1,r,p,c,op); mx[op][now]=max(mx[op][lc],mx[op][rc]); } int query(int now,int l,int r,int ql,int qr,int op) { if(ql>qr)return 0; if(l==ql&&r==qr)return mx[op][now]; int mid=(l+r)/2; if(qr<=mid)return query(lc,l,mid,ql,qr,op); else if(mid+1<=ql)return query(rc,mid+1,r,ql,qr,op); else { int t1=query(lc,l,mid,ql,mid,op); int t2=query(rc,mid+1,r,mid+1,qr,op); return max(t1,t2); } } int n,m; int ans; //第一個以位置為下標 高度>10扔進去 //第二個以高度為下標 位置>10扔進去 int a[200100]; int main() { // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); n=read();m=read(); for(int tt=1;tt<=m;tt++) { int opt=read(),p=read(); int nw=0;sort(li+1,li+1+pos,cmp1); for(int i=1;i<=pos;i++)if(li[i].h+tt<=10)li[++nw]=li[i]; pos=nw; if(opt==1) { int h=read();a[p]=h-tt+m;chpos(p,1); for(int i=1;i<=pos;i++)if(li[i].h+tt<h)modify(1,1,n,li[i].x,0,0),modify(1,1,n+m,li[i].h+m,0,1); int hh=query(1,1,n,p,n,0)+1; modify(1,1,n,p,hh,0);modify(1,1,n+m,h-tt+m,hh,1); sort(li+1,li+1+pos,cmp1); for(int i=pos;i>=1;i--)if(li[i].h+tt<h) { hh=query(1,1,n,li[i].x+1,n,0)+1; modify(1,1,n,li[i].x,hh,0);modify(1,1,n+m,li[i].h+m,hh,1); }li[++pos]=ph(h-tt,p); } else { for(int i=1;i<=p;i++) { int u=findKth(i); modify(1,1,n,u,0,0);modify(1,1,n+m,a[u],0,1); } int nw=0,u=findKth(p);a[u]=0;chpos(u,-1); for(int i=1;i<=pos;i++)if(li[i].x!=u)li[++nw]=li[i]; pos=nw; for(int i=p-1;i>=1;i--) { u=findKth(i);int hh=query(1,1,n+m,a[u],n+m,1)+1; modify(1,1,n,u,hh,0);modify(1,1,n+m,a[u],hh,1); } } pr2(mx[0][1]); } return 0; }

相關推薦

[Codeforces264E][線段][DP]Roadside Trees

翻譯 在 1∼n1∼n1∼n 的位置能種樹,剛開始能種樹。 第 iii 個時刻會有操作: 1.在一個沒種過樹的位置 pip_ipi​種一顆高度為hih_ihi​的樹。 2.砍掉第 xix_ixi​棵樹,保證這個位置以後不會種樹。 每天樹會長高111 每執行一次

Codeforces.264E.Roadside Trees(線段 DP LIS)

log 0kb set solution efi () gis urn 更新 題目鏈接 \(Description\) \(Solution\) 還是看代碼好理解吧。 為了方便,我們將x坐標左右反轉,再將所有高度取反,這樣依然是維護從左到右的LIS,但是每次是在右邊刪除元

hdu 4521 小明系列問題——小明序列(線段+DP或擴展成經典的LIS)

upd 輸入數據 accep 單位 行為 至少 tracking math 並且 小明系列問題——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Ot

Fence Obstacle Course[線段+DP]

傳送門 線段樹維護從這個點可以掉到哪個柵欄 f[i][0] 表示從穀倉到該柵欄的最左端的距離 f[i][1] 表示到最右端 查詢最左端掉下去的柵欄編號為a , 右端為b #include<cstdio> #include<algorithm>

Cleaning Shifts[線段+DP]

傳送門 區間覆蓋問題 , f[x]表示覆蓋L--x的最少代價 線段樹維護區間最小 //未ac但對拍過的程式碼 #include<cstdio> #include<algorithm> #define N 10050 #define M 100050

629D Babaei and Birthday Cake (線段+DP裸題目)

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

Codeforces 834D The Bakery (線段+DP)

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

CF193D Two Segments (線段+dp)(外加兩個擴充套件題)

大概算是個系列整理 (最強版是模擬賽原題)) 首先,我們先來看這個題目。 QWQ一開始是毫無頭緒,除了列舉就是列舉 首先,我們可以列舉一個右端點,然後算一下當前右端點的答案 我們令\(f[l,r]\)表示\(a_l到a_r\)這些數,能夠最少劃分成幾段連續的數。 顯然,我們要求的是以每個端點為右端

Codeforces 700E Cool Slogans 字尾自動機+可持久化線段+dp

題意 給你一個長度為n的字串S,求最長的一個字串序列a[1..k]滿足序列中的每一個字串都是S的子串,且對於任意的1<i<=k都有a[i−1]在a[i]中至少出現兩次。兩次出現允許重疊。 問最大滿足條件的k是多少。 n<=200000

YJJ's Salesman(線段+dp)

YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1990&nbs

Atcoder Regular contest 085F NRE 線段+DP

題意:給你兩個序列,a全部為0,b給出,給出一些區間,可以把a上的這些區間變為全1,要求操作以後兩個序列對應位置不相同的個數最小,n<=2e5. 說實話這種區間操作很容易想到線段樹,但是我沒想到

Codeforces1099F. Cookies(線段+dp+貪心+博弈)

題目連結:傳送門 思路:   分析到處理節點時的吃cookie的順序了,然鵝不會用線段樹維護字首和。技術門檻QAQ。。。   很容易想到可以從root開始搜尋,每次深入消耗時間2*邊權w。   然後對於深入到點u開始返回的話,想要儘量多地吃cookie,就要貪心地選擇用時短的cookie,也就是:

【codeforces】480E Parking Lot 線段+DP

題目分析:很早以前在同學助攻下寫出來的,想想還是放出來好了,是個不錯的思想。 原題是在動態將可行區域變成不可行區域的同時求全域性最大子正方形,n,m,k至多2000。 既然只有加點,於是我們離線,倒著來,這樣便只有刪點。 我們給每個節點(i,j)儲存它向上能延伸的距

hdu 4719 Oh My Holy FFF(dp線段優化)

origin end should adding href ast left code padding Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535

51nod 1376 最長遞增子序列的數量(不是dp哦,線段 +  思維)

sort 是個 can stream const 方便 long 序列 printf 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 題解:顯然這題暴力的方法很容易想到

Codeforces Round #426 (Div. 2) D. The Bakery(線段維護dp)

src lap codeforce blank com date close scanf logs 題目鏈接: Codeforces Round #426 (Div. 2) D. The Bakery 題意: 給你n個數,劃分為k段,每段的價值為這一段不同的數的個數,問如何

Subsequence Count 2017ccpc網絡賽 1006 dp+線段維護矩陣

const 統計 轉換 inpu mic splay string pen one Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0‘s and 1‘s), and Q qu

【BZOJ4712】洪水 鏈剖分優化DP+線段

表示 他還 efi 父親 管理員 out 接下來 到你 head 【BZOJ4712】洪水 Description 小A走到一個山腳下,準備給自己造一個小屋。這時候,小A的朋友(op,又叫管理員)打開了創造模式,然後飛到山頂放了格水。於是小A面前出現了一個瀑布。作為

【BZOJ2164】采礦 鏈剖分+線段維護DP

sca uil des 描述 數據 == std 單位 邊表 【BZOJ2164】采礦 Description 浩浩蕩蕩的cg大軍發現了一座礦產資源極其豐富的城市,他們打算在這座城市實施新的采礦戰略。這個城市可以看成一棵有n個節點的有根樹,我們把每個節點用1到n的整

Codeforces 671D. Roads in Yusland(樹形DP+線段

pla too 不知道 ret 線上 tchar 起點 樹形 ads   調了半天居然還能是線段樹寫錯了,藥丸   這題大概是類似一個樹形DP的東西。設$dp[i]$為修完i這棵子樹的最小代價,假設當前點為$x$,但是轉移的時候我們不知道子節點到底有沒有一條越過$x$的路