算是一道中檔題 考試的時候腦殘了 不僅沒寫優化 連暴力都打掛了。
容易發現乙個性質 那就是同一格仔不會被兩種以上的顏色染。(顏色就三種.
通過這個性質就可以進行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 一...