拓撲排序,
注意到如果正著建圖("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 乙個是 ...