20201017B組 T2 飛彈攔截

2021-10-24 23:16:12 字數 1676 閱讀 1072

jzoj5354

題目大意

給出n nn(

n≤

1000

)(n\le 1000)

(n≤100

0)個三維座標xi,

yi,z

ix_i,y_i,z_i

xi​,yi

​,zi

​,求任意排列下的最長上公升子串行和最小鏈覆蓋

前一問顯然用o(n

2)

o(n^2)

o(n2

)dp暴力求,你想用o(n

logn

)o(nlogn)

o(nlog

n)也是可以的

對於後一問,乍一看可以用

最小鏈覆蓋等於最長反鏈

於是信誓旦旦的打了個最長不上公升子串行,結果沒過樣例,才發現反鏈不是我想象中的那種東西。。。

然後考慮拆點,每有點x

−>

yx->y

x−>

y就連線a

xa_x

ax​和b

yb_y

by​,跑匈牙利演算法,最小鏈覆蓋就等於n

nn減去匹配數。

原因是每有乙個匹配就相當於把兩個原圖上的點連了起來,沒有連的時候每個點都是一條鏈,連一次就可以少去一條鏈,二分圖匹配保證了每個點的初度和入度都小於2,所以一定是鏈。

其實也可以寫最大流跑的,具體搜尋:有向圖的最小鏈覆蓋

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

const

int inf=

1e9+7;

using

namespace std;

const

int n=

1e3;

struct nodea[n+10]

;struct edgee[n*n]

;int n,m,f[n+10]

,ans1,ans2,tot,last[n+10]

,g[n*2+

10];bool vis[n*2+

10];void

add(

int x,

int y)

; last[x]

=tot;

}bool

cmp(node a,node b)

bool

cmp2

(node a,node b)

bool

dfs(

int x)

}return0;

}int

solve

(int n)

return n-ret;

}int

main()

sort

(a+1

,a+n+

1,cmp);fo

(i,1

,n)}

ans1=

max(ans1,f[i]);

} ans2=

solve

(n);

printf

("%d\n%d\n"

,ans1,ans2)

;return0;

}

20201017B組T3 計數題

jzoj 5352 題目大意 乙個有n nn個點的完全圖,每條邊的邊權是ai aj a i oplus a j ai aj 求最小生成樹的邊權和方案數 tj考慮按照最高位的 0 1 0 10 1 分成兩堆,容易得出兩堆點之間有且僅有一條邊相連 最優情況下 於是用trie求出這條邊的最小邊權和方案數,...

NOIPTG A組總結 T2題解

這是個慘烈的日子,讓我貼一貼成績。嗯。這就tm很尷尬了。話說我二十分還能拿個rank4。醉了 t1 world tour cf666b 667d 題意 給你一些單向邊,讓你求出四個點,使得經過這四個點的路徑盡可能的長 兩點之間走最短路徑,四個點不能重複,但是經過路徑可以 直接暴力spfa求出最遠的兩...

2019 05 25 模擬 A 組 T2 數格仔

暴搜搜出前面幾個的答案 然後列舉每一項的係數再列舉乙個常數項推出規律 規律 fn fn 1 5 f n 2 fn 3 fn 4 f n f 5 times f f f fn fn 1 5 fn 2 fn 3 fn 4 然後將搜尋出來的前四項帶入 矩陣乘法優化 include include incl...