省選模擬賽 4 26 T1 dp 線段樹優化dp

2022-02-04 22:51:08 字數 1832 閱讀 7931

算是一道中檔題 考試的時候腦殘了 不僅沒寫優化 連暴力都打掛了。

容易發現乙個性質 那就是同一格仔不會被兩種以上的顏色染。(顏色就三種.

通過這個性質就可以進行dp了.先按照左端點排序。

設f[i]表示前i個畫筆必選的最大價值。

列舉決策j 分類討論相交還是包含 還是相離。

其中包含的情況沒必要討論 相交需要比對一下顏色再進行轉移 不過我寫的時候多打乙個東西導致爆零.

值得一提的是 對於相交的情況 相交的部分不會被之前轉移的線段給交上去 可以證明這樣不是最優的。

所以這樣dp是正確的。

code:

const int maxn=100010;

int n,m,s1,s2,flag;

ll ans,f[maxn];

struct wyt[maxn];

inline int cmp(wy a,wy b)

int ww=(t[i].c!=t[j].c);

f[i]=max(f[i],f[j]+((ll)t[i].y-t[j].y)*s1-((ll)t[j].y-t[i].x+1)*ww*(s1+s2));

}ans=max(ans,f[i]);

} putl(ans);return 0;

} return 0;

}

考慮正解。其實正解很好想 不過我沒膽子寫。

容易 發現可以分類討論。對於相離的情況 寫乙個線段樹 在右端點放值 查詢查左端點-1即可。

對於相交的情況 還是分類討論 考慮如果是同顏色的話查 還是右端點放值 區間內查 放值的具體形式展開上述的dp式即可。

第一種情況需要一顆線段樹 第二種情況需要三顆線段樹 第三種情況同樣需要三種 簡單的做法是 三種不同顏色各自維護相交的情況。

由於所有的線段樹維護的東西相同 所以可以使用指標做這件事情 也可以使用結構體。

const int maxn=100010;

int n,m,top;ll s1,s2;

int b[maxn<<1];

struct wyt[maxn];

inline int cmp(wy a,wy b)

ll ask(int p,int l,int r,int l,int r)

}f[3],g[3],s;

int main()

; b[++top]=x;b[++top]=y;

} sort(b+1,b+1+top);

int num=0;

rep(1,top,i)if(i==1||b[i]!=b[i-1])b[++num]=b[i];

rep(1,m,i)

sort(t+1,t+1+m,cmp);

s.cle();

rep(0,2,i)f[i].cle(),g[i].cle();

s.change(1,0,num,0,0);

rep(1,m,i)

s.change(1,0,num,t[i].y,ww);

f[t[i].c].change(1,0,num,t[i].y,ww-b[t[i].y]*s1);

g[t[i].c].change(1,0,num,t[i].y,ww-b[t[i].y]*(s1+s1+s2));

} putl(s.s[1]);

return 0;

}

4 26 省選模擬賽 T3 狀壓dp 差分求答案

比較好的題目 考試的時候被毒瘤的t2給搞的心態 這道題連正解的思路都沒有想到。一看到題求刪除點的最少個 可以使得不連通。瞬間想到最小割 發現對於10分直接跑最小割即可。不過想要通過n 2需要一些奇技 如從si跑到tj 想要得到i到j 1的答案 只需要再從tj跑到tj 1即可。可以發現這樣做是有正確性...

3 28 省選模擬賽 染色 LCT 線段樹

發現和sdoi2017樹點塗色差不多 但是當時這道題模擬賽的時候不會寫 賽後也沒及時訂正 所以這場模擬賽的這道題雖然秒想到了lct和線段樹但是最終還是只是打了暴力。痛定思痛 還是要把這道題給補了。但是對於這道題來說 暴力還是有價值的。考慮20分 每次暴力dfs.考慮對於樹是隨機生成的 那麼期望高度為...

省選模擬賽03 16 T3 超級樹

目錄一棵 k 超級樹 k supertree 可按如下方法得到 取一棵深度為 k 的滿二叉樹,對每個節點向它的所有祖先連邊 如果這條邊不存在的話 例如,下面是乙個 4 超級樹 請統計一棵 k 超級樹 中有多少條不同的簡單有向路徑,對 mod 取模。input 一行兩整數 k,mod。output 一...