線段樹優化DP之Monotonicity

2022-01-30 11:01:23 字數 1735 閱讀 7071

定義f[i]為處理到第i位,所得匹配的最長長度,根據f[i]我們可以求出它後面要跟的符號(可以用符號填滿,避免一些取模運算),對於i,我們列舉每乙個i前面的j,判斷是否合法,那麼\(n^2\)的做法就可以寫出來了

#includeusing namespace std;

const int maxn=20000+10;

int f[maxn],a[maxn];

char op[100+10];

int sta[maxn],top,ans,id;

int path[maxn];

void print(int id)

int main()

f[1]=ans=id=1;

for(int i=2;i<=n;i++)

while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();

return s * w;

}void print(int id)

void up(int rt) else

}void insert(int &rt, int l, int r, int val, int p)

return;

}int mid = (l + r) >> 1;

if (a[p] <= mid)

insert(ls[rt], l, mid, val, p);

else

insert(rs[rt], mid + 1, r, val, p);

up(rt);

return;

}int query(int rt, int l, int r, int s, int t)

}if (t > mid)

}return poss;

}int main()

poss = query(root2, 1, 1e6, 1, a[i] - 1);

if (f[i] < f[poss] + 1)

poss = query(root3, 1, 1e6, a[i] + 1, 1e6);

if (f[i] < f[poss] + 1)

if (ans < f[i])

if (op[f[i]] == '=')

insert(root1, 1, 1e6, f[i], i);

else if (op[f[i]] == '

insert(root2, 1, 1e6, f[i], i);

else if (op[f[i]] == '>')

insert(root3, 1, 1e6, f[i], i);

}printf("%d\n", ans);

print(id);

return 0;

}

線段樹優化dp

等離子炮有n個操作訊號,第i個操作訊號的強度為b i 總體強度為各操作訊號的強度之和。由於有些訊號太弱了了 強度 0 水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。有 m位隊友,第ii 位隊友只會刪除編號在 l i 和 r i 之間的訊號,且每刪除乙個訊號,花費 c i...

降臨(線段樹優化dp)

選定點i會有代價 c i 如果乙個區間j內的點全被選擇,就可以獲得回報 p j 點數和區間個數 1e5 還以為是線段樹優化網路流 50萬個點200萬條邊看上去很可做的樣子畢竟lbn說過網路流20萬萬條邊完全沒問題 沒想到是個線段樹dp。雖然這兩個線段樹完全扯不上關係 用 f i j 表示考慮到第i個...

zoj 2900 DP(線段樹優化)

同樣是暴力,別人能過,我不能過,生活有的時候就是這麼無奈。dp i j k 表示前i個數取j個,最後一和是k的個數 然後改變dp順序可以將三維變為2維 注意下一下細節的地方。不然這樣暴力dp會超時 還有一種就是用線段樹來優化。優化到3770ms。不優化是6000 ms。有一點要注意的就是不能乙個都沒...