線段樹單點更新解插空問題

來源:互聯網
上載者:User

標籤:algorithm   int   等價   插入   string   pre   size   fine   sizeof   

poj2828

線段樹維護區間空餘的位置,每次插入一個點

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define maxn 200020#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct node{    int pos,w,id;}nodes[maxn];int sum[maxn<<2];int ans[maxn];//用來儲存void pushUP(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){    if(l==r){        sum[rt]=1;        return;    }    int m=l+r>>1;    build(lson);    build(rson);    pushUP(rt);}void update(int i,int pos,int l,int r,int rt){    if(l==r){        ans[l]=nodes[i].w;        sum[rt]--;        return;    }    sum[rt]--;    int m=l+r>>1;    if(pos<=sum[rt<<1])        update(i,pos,lson);    else         update(i,pos-sum[rt<<1],rson);}int main(){    int n;    while(scanf("%d",&n)==1){        memset(ans,0,sizeof ans);        for(int i=1;i<=n;i++)            scanf("%d%d",&nodes[i].pos,&nodes[i].w),nodes[i].pos++;        build(1,n,1);        for(int i=n;i>=1;i--)            update(i,nodes[i].pos,1,n,1);//倒著把i個插隊更新到線段樹裡        for(int i=1;i<=n;i++)            printf("%d ",ans[i]);        puts("");    }}

hdu3564 線段樹解決插值,求出最終序列,再求lis

/*給出n個數字,依次分別是[1,n]每次給定第i個數位插入點【0,n-1],求lis離線+線段樹+lis*/#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;#define maxn 1000005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define inf 0x3f3f3f3fint sum[maxn<<2];//儲存當前位置有多少空位int ans[maxn];//ans[i]表示i在位置ans[i]int op[maxn];int dp[maxn];void build(int l,int r,int rt){    if(l==r){        sum[rt]=1;        return;    }    int m=l+r>>1;    build(lson);    build(rson);    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void update(int pos,int val,int l,int r,int rt){    if(l==r){        sum[pos]=0;        ans[val]=l;//val被放在了位置l        return;    }    sum[pos]--;    int m=l+r>>1;    if(pos<=sum[rt<<1]) update(pos,val,lson);    else update(pos-sum[rt<<1],val,rson);}int main(){    int n,T;    cin >> T;    for(int tt=1;tt<=T;tt++){        memset(sum,0,sizeof sum);        memset(ans,0,sizeof ans);        memset(op,0,sizeof op);                printf("Case #%d:\n",tt);        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&op[i]),op[i]++;        build(1,n,1);//從0開始建立線段樹        for(int i=n;i>=1;i--)            update(op[i],i,1,n,1);//把i插到op[i]及其以後位置,ans[i]維護i的位置                //第一次插入1,第二次插入2,第三次插入3...其位置被儲存在ans[1],ans[2],ans[3]...        //要求每次插入後的lis,因為可以保證每次插入的數字比之前的大,所以只要插入的位置比之前數位位置大就能保證lis,等價於求ans[i]的lis        //求lis,每次找到第一個比ans[i]大的,將其替換成ans[i]        memset(dp,0,sizeof dp);        int len=0;        for(int i=1;i<=n;i++){            int k=lower_bound(dp+1,dp+1+len,ans[i])-dp;            len=max(len,k);            dp[k]=ans[i];            printf("%d\n",len);        }        puts("");    }    return 0;}

 

線段樹單點更新解插空問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.