題目鏈結
記\(dp(i)\)為以第i個結尾的上公升子串行的個數,可以得到轉移方程
\[dp(i)=\sum_\),所以求出每乙個\(dp(i)\).
直接求複雜度\(o(n^2)\),自然是不行的。因為只和大小的比較有關係,跟數值本身是無關的,所以先將其離散化。變成1到pos的點。這樣就可以開下乙個樹狀陣列。
樹狀陣列可以很方便的求出前n項和,利用這個性質,可以做到\(o(nlogn)\).
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef pairp;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-9;
const int n = 1e5 + 5;
const int mod = 1e9 + 7;
int n;
ll c[n];
inline ll lowbit(int i)
void add(int x, ll val)
}ll sum(int x)
return sum;
}int t,kase = 0;
struct node
node(int a, int b)
}node[n];
bool cmp1(node a, node b)
bool cmp2(node a, node b)
mapmp;
int main()
sort(node+1, node+1+n, cmp1);
mp.clear();
int pos = 1;
for(int i = 1; i <= n; i++)
sort(node+1, node+1+n, cmp2);
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++)
printf("case %d: %d\n", ++kase, sum(pos-1));
}return 0;
}
lightoj 1085 離散化 樹狀陣列
題意 計算乙個序列裡有多少個上公升子串行 思路 先離散化一下,按照值排序,如果相同的就按照座標從大到小排序,這樣就可以避免重複計算。樹狀陣列存的是以a i 結尾的子串行之和 dp a i sigma a i 1 1 ok,還是很簡單的 include using namespace std type...
LightOj 1188 樹狀陣列
題意 給乙個數列 len 1e5 數列裡的數 num 1e5 現有q次詢問 1e5 詢問某個區間的不同的數有多少個。思路 明顯的樹狀陣列統計,自己寫的時候不太清楚那個樹狀陣列到底應該怎麼維護。有點想用掃瞄線類似的思想,然後離線所有詢問這樣去維護,甚至想到了按照右區間排序。但是到底樹狀陣列應該怎樣維護...
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...