lightoj 1085 離散化 樹狀陣列

2021-07-22 18:13:58 字數 720 閱讀 8959

題意:

計算乙個序列裡有多少個上公升子串行

思路:

先離散化一下,按照值排序,如果相同的就按照座標從大到小排序,這樣就可以避免重複計算。

樹狀陣列存的是以a[i]結尾的子串行之和;

dp[a[i]]=sigma(a[i]-1)+1;

ok,還是很簡單的;

#include 

using namespace std;

typedef long long ll;

const int n=1e5+10;

const ll mod=1000000007;

ll dp[n];

struct asd;

asd q[n];

int n;

bool cmp(asd x,asd y)

int lowbit(int

x)void add(int

x,ll val)

}ll sum(int

x) return ans;

}int main()

sort(q+1,q+n+1,cmp);

memset(dp,0,sizeof(dp));

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

printf("case %d: %lld\n",cas++,sum(n));

}return

0;}

LightOJ 1085 樹狀陣列 動態規劃

題目鏈結 記 dp i 為以第i個結尾的上公升子串行的個數,可以得到轉移方程 dp i sum 所以求出每乙個 dp i 直接求複雜度 o n 2 自然是不行的。因為只和大小的比較有關係,跟數值本身是無關的,所以先將其離散化。變成1到pos的點。這樣就可以開下乙個樹狀陣列。樹狀陣列可以很方便的求出前...

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...

資料離散化 線段樹

前言 遇到了乙個矩形面積堆疊的問題,想了很久。終於找到了方法。先做個小記,待到具體問題時再分析。資料離散化 高大上的名字,其實就是對資料的一種處理,也可以採取陣列 或者 容器 map vector。之類的來儲存。之前的ibm技術俱樂部主席競選 那道題其實就是很好的應用。有些資料本身很大,自身無法作為...