我發現我學資料結構學傻啦。。看題和資料範圍就會想到些資料結構。。。
春春幼兒園舉辦了一年一度的「積木大賽」。今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。
在搭建開始之前,沒有任何積木(可以看成n塊高度為 0 的積木)。接下來每次操作,小朋友們可以選擇一段連續區間[l, r],然後將第第 l 塊到第 r 塊之間(含第 l 塊和第 r 塊)所有積木的高度分別增加1。
小 m 是個聰明的小朋友,她很快想出了建造大廈的最佳策略,使得建造所需的操作次數最少。但她不是乙個勤於動手的孩子,所以想請你幫忙實現這個策略,並求出最少的操作次數。
看題和範圍就開始想貪心寫線段樹。。。然後就a了。。然後這題stdo(n)。
對於目標大廈有波峰有波谷,我們發現如果這一次比上次高。那麼肯定需要額外次數來壘起來,這層比上層低,那麼肯定就在上次搭的時候一起搭了。。所以o(n)統計差值就好了。
//我的暴力線段樹
#include
using
namespace
std;
const
int maxn=1e5+5;
const
int inf=1e9+7;
typedef pairpar;
#define mp make_pair
int minv[maxn<<2],who[maxn<<2],a[maxn],lzt[maxn<<2];
struct xds
}inline
void pushup(int o)
}inline
void build(int o,int l,int r)
int mid=l+r>>1;
build(lson,l,mid);build(rson,mid+1,r);
pushup(o);
}inline par query(int o,int l,int r,int ql,int qr)
int mid=l+r>>1;
pushdown(o);
par ans,t1=mp(0,inf),t2=mp(0,inf);
//coutif(qr>mid)t2=query(rson,mid+1,r,ql,qr);
if(t2.secondelse ans=t1;
return ans;
}inline
void change(int o,int l,int r,int ql,int qr,int val)
int mid=l+r>>1;
pushdown(o);
if(ql<=mid)change(lson,l,mid,ql,qr,val);
if(qr>mid)change(rson,mid+1,r,ql,qr,val);
pushup(o);
}}t;int n;
int getans(int l,int r)
int main()
t.build(1,1,n);
printf("%d\n",getans(1,n));
return
0;}
//然而真相是這樣的
#include
using
namespace
std;
int a[100005];
int main ()
printf ("%d\n", ans);
}
題目譯自 joi 2016/2017 本選「フェーン現象(foehn phenomena)」
傳送門焚風現象
這題。。看到資料和區間,觀察了下題。
發現區間內差值不變,會導致答案變化的只有修改端點處。考慮線段樹區間修改單點查詢暴力維護差值。
然後對於最後乙個點特判。然後就a了。。然而。。
我們發現如果區間+val。
端點處差值會如何變化?
左端修改前:
前乙個點高度為a,修改區間左端點為b。令差值f=b-a;
修改後
修改高度為val,前乙個點高度為a,修改區間左端點為b+val。差值為f=b+val-a;
右端修改前:
修改區間右高度為a,後乙個點為b。令差值f=b-a;
修改後:
修改高度為val,修改區間右高度為a+val,後乙個點為b。令差值f=b-a-val;
差值變化分別是左端+val,右端-val。。直接維護就好了。。
ps:注意以後不要再define了。。容易出事。。
//某資料結構學傻的ipig的**
#include
using
namespace
std;
const
int maxn=2e5+5;
#define ll long long
//#define calc(x) x>0?x*t:x*s
ll n,m,s,t;
inline ll calc(ll x)
ll a[maxn],f[maxn];
ll sumv[maxn<<3],lzt[maxn<<3];
struct xds
inline
void pushdown(ll o,ll l,ll r)
}inline
void build(ll o,ll l,ll r)
ll mid=l+r>>1;
build(lson,l,mid);build(rson,mid+1,r);
pushup(o);
}inline
void change(ll o,ll l,ll r,ll ql,ll qr,ll val)
ll mid=l+r>>1;
pushdown(o,l,r);
if(ql<=mid)change(lson,l,mid,ql,qr,val);
if(qr>mid)change(rson,mid+1,r,ql,qr,val);
pushup(o);
}inline ll query(ll o,ll l,ll r,ll pos)
ll mid=l+r>>1;
ll ans;
pushdown(o,l,r);
if(pos<=mid)ans=query(lson,l,mid,pos);
else ans=query(rson,mid+1,r,pos);
return ans;
}}t;int main()
t.build(1,1,n);
for(ll i=1;i1]));
// cout}
for(ll i=1;i<=m;i++)
return
0;}
//%%%mthq
#include
using
namespace
std;
const
int n = 2200000;
typedef
long
long ll;
int n, q, s, t; ll a[n], b[n];
inline ll calc(ll x)
int main()
for(int i=1; i<=q; i++)
if(r != n)
printf("%lld\n", ans);
}return
0;}
一些資料結構
dir heapq about all builtins cached doc file loader name package spec heapify max heapreplace max siftdown siftdown max siftup siftup max heapify heap...
資料結構考試的一些選擇題
棧和佇列 樹和二叉樹 圖順序表 隨即訪問結構 在乙個有127個元素的順序表中插入乙個新元素並保持原來順序不變,平均要移動的元素個數為63.5 平均要移動的個數 n 2 補充1 n個元素的順序表中,查詢 平均移動的元素個數為 n 1 2 補充2 n個元素的順序表中,插入 平均移動的元素個數為n 2 補...
資料結構的一些筆記
資料結構 1.邏輯結構 書中都是對邏輯結構的討論 幫助理解 人為抽象出來的結構 線性 表 非線性 圖,樹 2.儲存結構 物理結構 幫助理解 資料到底以什麼樣的形式儲存在計算機中 順序 鏈式 線性表1.線性表是最常用且最簡單的一種資料結構 2.在稍微複雜的線性表中,乙個資料元素可以由若干個資料項組成 ...