洛谷 P1954 NOI2010 航空管制

2022-05-21 19:24:08 字數 1740 閱讀 1524

拓撲排序,

注意到如果正著建圖("a出現早於b"=>"a向b連邊"),貪心選擇,可能前面某一次的選擇造成後面找不出合法方案;

但是如果反過來建圖,而且每一次選擇當前入度為0的點中k值最大的,那麼一定不會產生前面那種情況;因此用堆維護

對於第一問,直接跑一遍即可。。(而且題面還說了一定有可行解)

對於第二問,

設當前要使得now的起飛序號最小,那麼就是使得在反著的圖的拓撲序遍歷中,now被遍歷的次序盡量往後排

那麼,在遍歷到now時,不減小其出邊指向的點的入度;不改變拓撲排序的其他流程

這樣,如果什麼時候堆為空了,或者堆中彈出來的那個節點已經不滿足時間限制了,說明這時必須遍歷now了

洛谷卡常。。。

手工定義乙個pii比pair要快200ms+。。不知道為什麼(看stl原始碼,pair的邏輯也是很簡單的)

1

#pragma gcc optimize(3)

2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define fi first

9#define se second

10#define pb push_back

11 typedef long

long

ll;12 typedef unsigned long

long

ull;

13struct

pii14

17 pii(int a,int

b):fi(a),se(b){}

18};

19bool

operator

<(const pii &a,const pii &b)

2023

structe24

e[10010

];27

int f1[2010

],ne;

28int n,m,k[2010

];29

int inn[2010],in[2010

],num;

30 vectorans;

31struct

3236

void push(const pii &x)

3741

void pop()

42 pii top()

43bool empty()

44}q;

45 template

46 inline void read(t &x)

49while(ch>='

0'&&ch<='9')

50 x*=f;51}

52 template

53 inline void

write(t x)

58int

main()

596985}

86for(i=ans.size()-1;i>=0;i--)

87 write(ans[i]),putchar('');

88 puts(""

);89}90

for(int now=1;now<=n;now++)

91111

}112 write(n-num);putchar('');

113}

114return0;

115 }

洛谷 P2048 NOI2010 超級鋼琴

給出乙個序列,求和最大的k個連續子串行的和,且連續子串行長度在l與r之間.首先預處理出字首和,我們可以從左端點開始考慮,若左端點為i,則右端點在i l 1與i r 1之間,那麼可以計算出這些區間的最大值,然後放到堆裡去,每次從堆中取出最大值加到ans中後再將該區間左右兩區間的最大值放入堆中.也就是說...

洛谷P2048 NOI2010 超級鋼琴 題解

近期發現這篇題解有點爛,更新一下,刪繁就簡,詳細重點。多加了注釋。就醬紫啦!我們需要先算美妙度的字首和,並初始化rmq。迴圈 i 從 1 到 n 因為以i為起點的和弦終點必定是 i l 1 到 i r 1 之間,所以只要在區間內用rmq取超級和弦,並加入以美妙度從小排到大的優先佇列中。取出堆頂元素,...

洛谷2046 NOI2010海拔

qwq題目太長 這裡就不複製了題目 這個題 算是個比較經典的平面圖最小割變成對偶圖的最短路了qwq 首先考慮最小割應該怎麼做。有乙個性質,就是每個點的海拔要麼是1,要麼是0 qwq不過這個我不會證明啊 那麼既然知道了這個性質,我們對於地圖上的每個點,實際上就是劃分成兩個集合,乙個是 1 1 乙個是 ...