區間 \(\rm dp\)
設 \(f_\) 表示將 \([l,r]\) 全部刪空的能得到的最大價值,\(dp_\) 表示可以 \([1,j]\) 不刪完所能得到的最大價值
轉移 \(f\) 首先考慮 \(l,r\) 不在同一次操作中被刪除的情況,那麼可以列舉分界線
而對於在同一次操作中被刪除的情況考慮該次操作刪除的數字的值域形態:單峰
那麼嘗試計算 \(inc_,dec_\) 分別表示保留 \(l\) 和保留 \(r\) 的情況下將序列刪成加一遞增的最大獲利和刪成減一遞減的最大獲利即可
這兩個狀態的轉移根據定義,列舉那些和 \(a_l/a_r\) 差一的位置,該刪空的刪掉就行了
code display
const int n=410,inf=0x3f3f3f3f3f3f3f3f;
int a[n],v[n],ans[n],n,f[n][n],incr[n][n],decr[n][n];
signed main()
f[1][0]=0;
for(int len=2;len<=n;++len)
rep(i,l,r-1) if(a[i]==a[r]-1)
rep(i,l,r)
print(ans[n]);
return 0;
}
不難發現這個最短距離是一條邊的長度,這條邊一定在全圖的 \(\rm mst\) 上
關注到答案的**一定是父親和兒子的邊,那麼對於每個父親,維護每種顏色的兒子在 \(\rm mst\) 上返祖邊的權值,並將與自己異色的每個顏色裡面最小值放到全域性維護的std::multiset
上
在修改顏色的時候更改當前點 \(x\) 的父親處維護的資訊,然後再考慮與其兒子的連邊中產生對std::multiset
的變化即可
時間複雜度 \(\theta(q\log n)\)
code display
const int n=3e5+10;
multisetans;
int n,m,col[n],val[n],q,fa[n];
struct edgee[n];
struct dsu
inline void merge(int x,int y)
inline void init()
}dsu;
vectorg[n];
map>mp[n];
inline void get_fa(int x,int fat)
inline void del(int x,int mycol)
if(!now.size())else
}return ;
}inline void ins(int x,int mycol)
assert(mp[fa[x]][mycol].size());
if(mycol!=col[fa[x]])
mp[fa[x]][mycol].insert(val[x]);
if(mycol!=col[fa[x]]) ans.insert(*mp[fa[x]][mycol].begin());
return ;
}signed main();
}sort(e+1,e+m+1,[&](const edge a,const edge b)\),那麼設 \(dp_i\) 表示已考慮 \([1,i]\) 的字首,其最小 \(\rm border\) 是 \(i\) 的方案數
轉移考慮刪掉最小 \(\rm border\) 是 \([1,i)\) 的方案數即可,形式化地講:
\[f_=\prod_^n v_i-\sum_ f_i\prod_^
\]注意這個額外的分治只會在 \(l=1,r=\frac\) 時呼叫,那麼複雜度仍然是 \(\theta(n\log ^2n)\),配合 \(v_i\) 全相同時 \(\theta(n)\) 求解即可通過了!
code displayint cl,cr;
int f[n],g[n],tmpf[n],tmpg[n];
inline void solve2(int l1,int r1,int l2,int r2)
int mid=(l1+r1)>>1;
if(r2<=mid) return solve2(l1,mid,l2,r2);
int lim=1; while(lim<=(r2-l1+1)<<1) lim<<=1;
rep(i,0,lim-1) tmpf[i]=tmpg[i]=0;
for(int i=mid+1;i<=r2;++i) tmpg[i-mid-1]=prd[i];
for(int i=l1;i<=mid;++i) tmpf[i-l1]=mul(iprd[i],f[i]);
ntt(tmpf,lim,1); ntt(tmpg,lim,1);
for(int i=0;i>1; solve(l,mid);
if(r-l>=mid+1)
return solve(mid+1,r);
}bool sam;
int dp[n];
signed main()
if(sam)
}print(dp[n]);
exit(0);
}solve(1,(n+1)/2);
for(int i=1;2*i<=n;++i) ckadd(f[n],mul(prd[n-i],mul(iprd[i],f[i])));
print(del(prd[n],f[n]));
return 0;
}
考試總結 CQOI2017 考試總結
再奮鬥一年,爭取ak noip2016 cqoi2017 這是去年我立的flag。看考場,電腦挺快,而且配置和評測機一樣,可以放心的在自己的電腦上卡常測試啦,好評。碼了一道fft的題,沒網只好拷著回家交,鍵盤蜜汁小,enter佔據了兩行,旁邊還有關機按鈕。座位安排奧妙重重,和巴蜀dyf大神坐在一起。...
MBA考試總結
終於考完了 mba入學統考,兩年來參加了兩次,感覺還是挺辛苦和有壓力的。第一年沒有通過是因為之前了解太遲,大概準備了 20天左右,最後還是功成垂敗。09年其實也一直沒有心情複習的,逼到最後的 20天,狠了一把勁,還是狠狠的複習了幾天,貌似今年應該可以通過了。總結經驗如下 1 如果你決定去做一件事,請...
2016 7 14考試總結。
今天的考試,總的來說不難,但是考得很差,簡直 從中暴露出對知識的掌握不牢固,練習不夠等問題。1.求 方程x1 2x2 nxn m的所有非負整數解 x1,x2,xn 的個數。這個題目在加上取餘運算後就是乙個貨幣系統的問題。也就是揹包。難以接受自己連這是個揹包問題都沒看出來。3 2.其實邪狼王的貪婪也很...