活用各種資料結構

2021-09-12 20:24:01 字數 2651 閱讀 8604

吊車由n條不同長度的線段組成,每條線段首尾相接。初始狀態:每條線段垂直與x軸。每次操作改變第s條和(s+1)條的逆時針角度為a,詢問每次操作後第n段末尾的座標。 

將每條線段都當成向量,實際上每次詢問的結果是向量和;

每次改變第s段和第(s+1)段的相對角度,實際上是改變了從第(s+1)段至第n段的各節點角度,則可以通過線段樹進行區間更新,(s+i+1,s+i+2)之間的角度還是不改變

#include#include#include#include#include#include #include#include#include#includeusing namespace std;

const int st_size=(1<<15)-1;

const double pi=acos(-1.0);

const int max_n=10010;

///輸入

int n,c;

int l[max_n];

int s[max_n],a[max_n];

double vx[st_size],vy[st_size];///記錄各節點的向量

double ang[st_size];///記錄各節點的角度

double prv[max_n];///為了查詢角度變化而儲存的當前角度的陣列

void init(int k,int l,int r)///初始化,建樹,k結點編號,l,r表示當前節點對應的是[l,r)區間

else

}///v是節點編號,l,r表示當前節點對應的是[l,r)區間

void change(int s,double a,int v,int l,int r)

else if(b>l&&a樹狀陣列

#include#include#include#include#include#includeusing namespace std;

const int maxn=100010;

typedef long long ll;

int n,q;

int a;

char t[2];

int l,r,x;

///a,l,r都是以1為下標的

///bit樹狀陣列

ll bit0[maxn],bit1[maxn];

ll sum(ll *b,int i)///求區間[1,i]的值

return s;

}void add(ll *b,int i,int x)///將i位上加上x

}void solve()

for(int i=0;i要加的值為-x*(l-1)+x*i=(i-l+1)*x是區間要加值的總和**/

}else

}}int main()

給定乙個數列a1,a2,...,an和m個三元組表示的查詢.對於每個查詢(i,j,k),輸出ai,ai+1,...,aj的公升序排列中的第k個數

分桶法和平方分割

如果桶完全包含在區間內,則查詢桶的最小值

如果元素所在的桶不完全被區間包含,則逐個檢查最小值 

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=100010;

typedef long long ll;

const int b=1000;///桶的大小

int n,m;

int a[maxn];

int l,r,k;

///l,r是以0為下標起點的

vectorbucket[maxn/b];///每個桶排序後的結果

int num[maxn];///對a排序之後的結果;

void solve()

printf("%d\n",num[ub]);

}}int main()

線段樹

把數列用線段樹維護起來,線段樹的每個節點都儲存了對應區間排好序的結果

如果所給區間和當前節點的區間完全沒有交集,那麼返回0

如果所給的區間完全包含了當前節點對應的區間,那麼使用二分搜尋法對該節點上儲存的陣列進行查詢

否則對兩個兒子遞迴進行計算求和

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=100010;

const int st_size=(1<<18)-1;

int n,m;

int a[maxn];

int l,r,k;

///l,r都是以0為下標起點的

int num[maxn];

vectordat[st_size];

void init(int k,int l,int r)

}///計算區間[i,j)中不超過x的個數

///k是節點編號與區間[l,r)對應

int query(int i,int j,int x,int k,int l,int r)

else

}void solve()

printf("%d\n",num[ub]);

}}int main()

Redis入門 各種資料結構

string 型別 儲存形式 以 key value 形式存在 常用命令 set get del incr incr setnx list 型別 儲存形式 以 key 集合 形式存在 常用命令 rpush lpush llen lrange lpop rpop set 型別 儲存形式 以 key 集...

redis 各種資料結構的encoding實現

redis 各種資料結構的encoding實現 redis type命令實際返回的就是當前鍵的資料結構型別,它們分別是 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 但這些只是redis對外的資料結構。我們可以通過object encoding命令查詢內部編碼...

redis 各種資料結構的encoding實現

redis 各種資料結構的encoding實現 redis type命令實際返回的就是當前鍵的資料結構型別,它們分別是 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 但這些只是redis對外的資料結構。我們可以通過object encoding命令查詢內部編碼...