題解 JSOI2010 排名

2022-05-07 22:21:19 字數 1096 閱讀 7833

題目很簡單, 用優先佇列維護拓撲序即可

但是他要我們求的東西比較詭異, 導致貪心的策略會不同

對於第一問, 我們一般的思路是直接維護正的拓撲序, 每次選最小的更新

但這樣不一定是最優的, 因為選擇了當前最小的可能使得更小的拓撲序排在後面, 這樣字典序就不一定是最小的了

所以我們維護反的拓撲序, 每次選最大的更新

第二問可以直接用大根堆維護正的拓撲序就行了

#include #include #include #include #include const int n = 200005; 

using namespace std;

int n, a[n], deg[n], in[n], ans[n], head[n], cnt;

struct edge e[n];

priority_queueq;

template < typename t >

inline t read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * w;

}inline void adde(int u, int v) , head[u] = cnt; }

int main()

cnt = n;

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

if(!deg[i]) q.push(i);

while(!q.empty())

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

printf("%d%c", ans[i], i == n ? '\n' : ' ');

cnt = 0;

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

if(!in[i]) q.push(i);

while(!q.empty())

}for(int i = 1; i <= n; i++)

printf("%d%c", ans[i], i == n ? '\n' : ' ');

return 0;

}

題解 JSOI2010 挖寶藏

我們發現挖掘乙個點所需要的方塊是乙個向上的倒三角,我們設這個倒三角在 y 1 上的左右端點分別為 l,r 不難發現,乙個 l,r 區間僅對應乙個點,也就是說,每個點所需要的倒三角都是不同的 如果乙個區間被另外乙個區間完全覆蓋,那麼選了大的那個區間,小區間的貢獻就可以直接加上了,而不需要算選小區間的代...

JSOI2010 快取交換

考慮乙個貪心 就是每次我們都選擇佇列裡面之後最晚加入的元素彈出。維護乙個nxt陣列就行了。特判一下之後不會再加入的元素。如下 include include include include include include define maxn 200010 using namespace std ...

JSOI2010 快取交換

當遇到需要將主存單元加進cache的時候,就看cache裡是否滿了,滿了的話,就刪除離最靠後的那乙個,這樣一定最優。但是網上部落格的 太長了。其實只需要判斷一下當前的優先佇列的top是否仍在cache中即可。重題 poi2005 sam toy cars,ac數 2 include include ...