傳送門->
發現兩次取牌取走的區間不會是相交且不包含的;先取走一段,再以這段前的牌為左端點、以這段後的牌為右端點取一次的情況,相當於只取後一次。
所以這題相當於從一列牌中取走互不相交的幾段,且每段首尾的牌花色相同。
就可以設dp[i]表示第一張牌到第i張牌的取出的和最大是多少。轉移時需要列舉第1到第i-1張牌中所有與第i張牌花色相同的。
設s[i]為點數的字首和,注意到轉移是dp[i]=max(dp[j]+s[i]-s[j])=s[i]+max(dp[j]-s[j])(1<=j
#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,x,y) for(register ll i=(x);i<=(y);i++)#define dwn(i,x,y) for(register ll i=(x);i>=(y);i--)
#define maxn 1000010
#define ll long long
using namespace std;
ll read()
void write(ll x)
if(x<0)x=-x,putchar('-');
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
}ll dp[maxn],c[maxn],v[maxn],to[maxn],s[maxn],n,k,ans;
int main()
ans=max(ans,dp[i]);
} write(ans);
return 0;
}
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的費用流
最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...
並不對勁的字尾陣列
字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...