第一題
乙個裸裸的樹形dp。
1 #include2using
namespace
std;
3const
int n=1e5+5;4
intn,t,tot,s,a[n],h[n];
5int
cnt,fro[n],to[n],nxt[n];
6 inline int
read()
12void add(int x,int
y) 15
16void dp(int
u) 18
for(int i=fro[u];i;i=nxt[i]) dp(to[i]);
19 tot=0; memset(h,0,sizeof
(h));
20for(int i=fro[u];i;i=nxt[i]) h[++tot]=a[to[i]];
21 sort(h+1,h+tot+1
);22
for(int j=1;j<=ceil((double)tot*t/100);j++) a[u]+=h[j];23}
2425
intmain()
30 dp(0
); 31 printf("
%d",a[0
]);32 }
第二題
理一理思路
1)將人按身高從矮到高排序,按這個順序處理時無論當前怎麼放,都不會對後面更高的產生影響。
2)線段樹:統計當前答案序列$1$~$x$的位置有幾個未確定的 (即有幾個更高的)。
3)字典序最小:在處理時,盡量把當前數往左放。
1 #include2using
namespace
std;
3const
int n=1e5+5;4
intn,ans[n];
5struct node a[n];
6struct tree f[n*3
];7 inline int
read()
13bool cmp(node x1,node x2)
1415
void build(int p,int l,int
r) 18
int mid=(l+r)>>1
;19 build(p*2
,l,mid);
20 build(p*2+1,mid+1
,r);
21 f[p].s=f[p*2].s+f[p*2+1
].s;22}
2324
void find(int p,int num,int
h) 27
if(num2].s) find(p*2
,num,h);
28else find(p*2+1,num-f[p*2
].s,h);29}
3031
intmain()
校內模擬 鎖
沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...
校內模擬 assignment(DP)
題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...
2019 10 03 校內模擬
內網傳送門 很明顯的乙個網路流。轉換一下題意,相當於求保留航線的最大值。所以我們把邊權取負跑最小費用流。有乙個坑點,就是我們只需要費用最小,不要求流量最大,所以不應該用最小費用最大流。有兩個解決辦法 用最小費用可行流。連 i,t,1,0 i,t,1,0 i,t,1 0 的邊,表示不選 i ii 連出...