NOIP模擬(11 03)T2 排列

2021-08-10 07:09:18 字數 1466 閱讀 2854

排列

題目背景:

11.03 noip

模擬t2

分析:線段樹

唯一一道可做題······

我們從n ~ 1

來確定每個數的位置,顯然,我們放入

n的時候,他一定在乙個逆序對數為

0的位置,因為它的前面不可能有比它大的,其次,如果

0位有多個,它一定在最後乙個

0位上,因為如果在前面的

0位上,後面的

0位上的數字一定會比它小,所以逆序對數不可能為

0,那麼我們現在確定了最大的

n的位置,然後我們將

n後面所有位置的逆序對數減一之後,那麼去掉當前

n的位置,我們就得到了乙個新的逆序對數的排列,(因為

n的影響相當於被完全消滅了,所以我們相當於重新討論乙個規模減小

1的問題

1 ~ n - 1

)那麼很顯然的

n - 1

也應該放在當前序列的最後乙個

0位上,那麼我們就可以一次遞推下去,從大到小,每一次選擇最後乙個

0位,然後將後面的數減一去掉貢獻,那麼我們就需要查詢00

位然後進行區間減即可。

注意:因為選擇了

0位之後,你不能讓當前位置影響答案,所以應該將當前位置賦值為

inf,這樣就不會在之後被選到了。

source:

/*

created by scarlyw

*/#include #include #include #include #include #include #include #include #include #include #include const int maxn = 100000 + 10;

const int inf = 1000000000;

int n;

int a[maxn], p[maxn];

struct node tree[maxn << 2];

inline void modify(int k, int x)

inline void push_down(int k)

}inline void update(int k)

inline void build(int k, int l, int r)

inline int query(int k, int l, int r)

inline void modify(int k, int l, int r, int ql, int qr)

inline void modify(int k, int l, int r, int pos)

inline void read_in()

inline void solve()

for (int i = 1; i <= n; ++i) std::cout << p[i] << " ";

}int main()

NOIP模擬 11 3 T2 排列

題目描述 有1 n的數,已知每乙個位置的逆序對,求原序列。輸入格式 第一行輸入乙個正整數n。第二行輸入n個正整數,表示pi 逆序對數字首和 輸出格式 輸出一行,共有n個數,表示原排列ai 資料範圍 對於前10 的資料 n 10。對於前30 的資料 n 1000。對於100 的資料 n 100000。...

11 03T2 樹鏈剖分

給你一棵樹,每次詢問樹上兩條鏈是否有交點。第一行n,表示n個結點 第二行開始n 1行倆個 數x y,表示x,y有一條邊 接下來q,表示q個詢問 接下來q行四個數a b c d,詢問a到b的鏈是否與c到d的鏈有交點 輸出q行 yes或no sample input 輸入1 1 21 3 2 42 5 ...

2020 9 3 NOIP模擬賽 T1 排列

題目鏈結 這是noip良心模擬賽的第一題 求對於任意的 i 滿足 p i i not k 的排列數。n,k le 10 5 首先 k 0 直接錯排數。k 1 考慮容斥。假設我們能算出來 g i 表示欽定 i 個位置不合法的方案數,那麼答案應該是 sum n 1 ig i n i 注意不是二項式反演,...