日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 默认站点!

默认站点

當(dāng)前位置: 首頁(yè) >

线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)

發(fā)布時(shí)間:2023/12/3 43 豆豆
默认站点 收集整理的這篇文章主要介紹了 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Codeforces 339D Xenia and Bit Operations vj地址
題意:給出2的n次方個(gè)數(shù),每次將現(xiàn)在這個(gè)序列中相鄰的兩個(gè)數(shù)運(yùn)算后合并為一個(gè)數(shù),得到一個(gè)新的序列,這個(gè)新序列的長(zhǎng)度是上一個(gè)序列長(zhǎng)度-1,當(dāng)新序列長(zhǎng)度為1時(shí)停止運(yùn)算,奇數(shù)次操作進(jìn)行OR運(yùn)算,偶數(shù)次操作進(jìn)行XOR運(yùn)算,
現(xiàn)在有m個(gè)詢問(wèn),每次詢問(wèn)會(huì)改變上一個(gè)序列中的一個(gè)值,問(wèn)新序列運(yùn)算后的值為多少

思路:他合并的路線,剛好是和線段樹的合并線路是一樣的,所有 可以巧妙利用線段樹來(lái) 算出 答案,就是sum【1】;
代碼

#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define INF 0x3f3f3f3f3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se secondusing namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int > pii; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=1e9+7; const ll N =1<<18; const double eps = 1e-4; const double pi=acos(-1); ll gcd(int a,int b){return !b?a:gcd(b,a%b);} int num[N]; int ans[N]; void build(int l,int r,int rt,int op) {if(l==r){ans[rt]=num[l];return;}int mid=(l+r)>>1;build(l,mid,rt<<1,1-op);build(mid+1,r,rt<<1|1,1-op);if(op==1) ans[rt]=ans[rt<<1]|ans[rt<<1|1];else ans[rt]=ans[rt<<1]^ans[rt<<1|1]; } void update(int l,int r,int rt,int index,int value,int op) {if(l==r&&l==index){ans[rt]=value;return;}int mid=(l+r)>>1;if(mid<index){update(mid+1,r,(rt<<1|1),index,value,1-op);}else{update(l,mid,rt<<1,index,value,1-op);}if(op==1) ans[rt]=ans[rt<<1]|ans[rt<<1|1];else ans[rt]=ans[rt<<1]^ans[rt<<1|1]; } int main() {//cout<<maxx+1<<endl;int n,m;scanf("%d%d",&n,&m);int sum=1<<n;for(int i=1;i<=sum;i++)scanf("%d",&num[i]);build(1,sum,1,n%2);for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);update(1,sum,1,a,b,n%2);printf("%d\n",ans[1]);}return 0; }

Billboard HDU - 2795 vj地址

題目 大意: 有一塊長(zhǎng)為h,寬為w的廣告牌,可以在上面放廣告,廣告的面積是寬為 a[i],長(zhǎng)默認(rèn)為1,有n個(gè)廣告,按順序放,如果上面有位置,優(yōu)先放在最上面,沒(méi)有位置放了 輸出-1。

思路:用于是從上到下的放,可以利用線段樹,二分的從左到右的搜索,左邊能夠滿足 ,優(yōu)先左邊。利用線段樹來(lái)維護(hù) 寬度。

代碼

#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define INF 0x3f3f3f3f3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); using namespace std; typedef long long ll; typedef unsigned long long ull; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=10001; const ll N =1e6+10; struct p {int l,r;int Max; }s[N]; int n,h,w; void build(int l,int r,int u) {s[u].l=l;s[u].r=r;s[u].Max=w;if(l==r) return;int mid=(l+r)>>1;build(l,mid,u<<1);build(mid+1,r,u<<1|1); } void q(int l,int r,int u,int w1) {if(l==r){s[u].Max-=w1;printf("%d\n",l);return;}int mid=(l+r)>>1;if(s[u<<1].Max>=w1){q(l,mid,u<<1,w1);}else{q(mid+1,r,u<<1|1,w1);}s[u].Max=max(s[u<<1].Max,s[u<<1|1].Max); } int main() {while(~scanf("%d%d%d",&h,&w,&n)){if(h>n) h=n;build(1,h,1);for(int i=0;i<n;i++){int w1;scanf("%d",&w1);if(w1>s[1].Max) printf("-1\n");else{q(1,h,1,w1);}}}return 0; }

總結(jié)

以上是默认站点為你收集整理的线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得默认站点網(wǎng)站內(nèi)容還不錯(cuò),歡迎將默认站点推薦給好友。