1>數星星
(複製自他人部落格)
由於題目中給的資料是按y軸排序,我們只需構建x軸的樹狀陣列,也就是說我們只需統計星星i之前一共有多少個x座標小於或等於xi的星星,這個數值也就是星星i的等級
又因為樹狀陣列無法處理下標為0的元素(會死迴圈),所以要把每個x座標+1
#include#include#include
using
namespace
std;
int max(int a,int
b)int
n,mx;
const
int n=15003,m=33000
;struct
node
}d[n];
intans[n],cnt[n];
inttr[m];
int lowbit(int
x)void add(int
pos)
int query(int
pos)
intmain()
for(int i=0;i"
%d\n
",cnt[i]);
return0;
}
2>花神遊歷各國
小清新線段樹
有點像 普通線段樹 + 剪枝
一般題面會有乙個神奇的(暫且這麼說)更改方式,而且一般沒辦法區間更新出值
這裡是乙個數的多次開方,可以發現,開方此時應該是有限的,<=1時不再變化
當區間最大值<=1時,整個區間都不再變化
#include#include#include
#define ll long long
using
namespace
std;
ll max(ll a,ll b)
const
int n=100003
;int n;ll d[n];int
m;int
root,cnt;
struct
node
tr[n
<<1
];void updata(int
rt)void build(int &rt,int l,int
r)
int mid=(l+r)>>1
; build(tr[rt].lson ,l,mid);
build(tr[rt].rson ,mid+1
,r);
updata(rt);
}int
ql,qr;
void change(int rt,int l,int
r)
int mid=(l+r)>>1
;
if(ql<=mid ) change(tr[rt].lson ,l,mid);
if(qr> mid ) change(tr[rt].rson ,mid+1
,r);
updata(rt);
}ll query(
int rt,int l,int
r)int
main()
if(op==1
) printf(
"%lld\n
",query(1,1
,n));
else
change(
1,1,n);
}return0;
}
資料結構習題 線段樹 樹狀陣列
說明 這是去年寫了一半的東西,一直存在草稿箱裡,今天整理東西的時候才發現,還是把它發表出來吧。以下所有題目來自lrj的 訓練指南 la 2191 單點修改,區間和 fenwick直接搞 uva 12299 給出n個數,支援迴圈移動某些數 30個 然後問區間最小值 因為移動小於30個數,所以直接單點修...
高階資料結構(1) 線段樹與樹狀陣列
鑑於去年西安賽區被吐槽為線段樹專題賽區,就先更一發線段樹2333333 線段樹 segment tree 本質上來講是一棵二叉搜尋樹。它與區間樹類似,它的每乙個結點都是一段區間。線段樹的功能是快速查詢某個結點在若干線段中出現的次數,時間複雜度為o logn 單純空間複雜度為o 2n 實際應用中,為了...
資料結構刷題 陣列
給定乙個矩陣 a,返回 a 的轉置矩陣。先建立乙個與原始矩陣行列數互換的新矩陣 做兩個迴圈巢狀,內迴圈遍歷原始矩陣的行轉列,外矩陣遍歷原始矩陣的列 class solution return v 逐行的細緻解釋 vector 建立了二維陣列,兩個空格可以在c 11標準中可以剔除 a 0 size 獲...