//codeforces 314c
//分析:相當於求給定序列的不降子串行的個數,從乙個空序列開始將得到的不降子串行不斷的延長是典型的做法,則dp[i]表示以第 i 個元素結尾的序列
//思路:o(n^2) 的做法,dp[i] = sum(dp[j]]) (a[j] <= a[i] && j <= i),求和過程用掉了 o(n) 的複雜度,用樹狀陣列可以優化成 o(logn),需要先處理出每個元素在原來的序列中的大小順序,最終複雜度 o(nlogn)。
1 #include "iostream
"2 #include "
cstdio
"3 #include "
cstring
"4 #include "
algorithm"5
using
namespace
std;
6intn;7
structst8
a[100010
];11
inttot;
12bool
cmp_1(st a, st b)
1316
bool
cmp_2(st a, st b)
1720
21 inline int lowbit(int
p)22
25const
int mod = 1000000007;26
27const
int maxn = 100010;28
intt[maxn], element[maxn];
29void add(int p, int
x)3036}
3738 __int64 sum(int
p)39
45return
res;46}
4748
intmain()
4956 sort(a+1, a+1+n, cmp_1);
57 tot = 1
;58 a[1].rank = 1;59
for(i = 2; i<=n; ++i)
65 sort(a+1, a+1+n, cmp_2);
66int
tmp;
67for(i = 1; i<=n; ++i)
72 printf("
%d\n
", sum(tot));
73 }
codeforces 739C 線段樹的高階應用
題意,給你乙個序列,有q次操作,每次對乙個區間進行加值,同時要輸出 最長的上公升序列 下降序列 先上公升再下降序列 很明顯能想到的是利用線段樹維護,有很明顯的能想到要維護線段樹的每個區間的左邊界和右邊界的值,並且每個點都有維護四種變化的值,然後就懵逼了。這時候應該想到的是維護每個區間的左右邊界的四種...
CodeForces 896C 珂朵莉樹
傳送門 用set搞的比較神奇的樹吧,玄學時間複雜度,簡潔好寫,無聊學了用來水題再好不過了 include include include include include include include include include include include include define x ...
CodeForces1328E dfs,樹的深度
給出乙個有n個頂點的有根樹,頂點的編號從1到n。樹的根節點編號恒為1。一棵數是具有n 1條邊的聯通圖。給出 m 個詢問。第i個詢問由 k i 個不同的節點 v i 1 v i 2 v i k i 組成.你的任務是判斷是否存在一條從根節點到u的路徑,使得給出的k i個節點要麼在這條路徑上,要麼與該路徑...