天津網路預選賽 1007-Giant_For(線段樹+set)

來源:互聯網
上載者:User

已行[xi,xj](0<xi<=xj<cnt-1,cnt表示離散化後的行座標個數)區間內最大的列為索引值構建線段樹,再以set維護每個點中的y值。find的話尋找【x+1,n】中最小的點,該點的最大列值是大於y的;然後返回的是x的位置,再從x的set裡取出最小的一個比y大的值!

 

 

#include<iostream>

#include<algorithm>

#include<string.h>

#include<set>

using namespace std;

 

struct Seg

{

int l,r,max_col;

};

struct Q

{

char ch[8];

int row,col;

};

Q q[200010];

Seg seg[200010*3];

int dia[200010];

set<int> S[200010];

int n;

 

void maketree(int l,int r,int c)

{

seg[c].l=l;

seg[c].r=r;

seg[c].max_col=0;

if(l==r) return ;

int mid=(l+r)>>1;

maketree(l,mid,c*2);

maketree(mid+1,r,c*2+1);

}

 

 

void updata(int pos,int c,int col)

{

if(seg[c].l==seg[c].r) 

{

seg[c].max_col=col;

return ;

}

int mid=(seg[c].l+seg[c].r)>>1;

if(pos<=mid)

updata(pos,c*2,col);

else

updata(pos,c*2+1,col);

seg[c].max_col=max(seg[c*2].max_col,seg[c*2+1].max_col);

}

 

// int find(int l,int r,int num)

// {

// int mid;

// while(l<=r)

// {

// mid=(l+r)>>1;

// if(dia[mid]==num) return mid;

// else if(dia[mid]>num) 

// r=mid-1;

// else

// l=mid+1;

// }

// }

 

int qurey(int l,int r,int c,int col)

{

if(seg[c].max_col<=col||seg[c].r<l||seg[c].l>r)

return -1;

if(seg[c].l==seg[c].r)

return seg[c].l;

int mid=(seg[c].l+seg[c].r)>>1;

if(r<=mid)

return qurey(l,r,c*2,col);

else if(l>mid)

return qurey(l,r,c*2+1,col);

else

{

int temp=qurey(l,mid,c*2,col);

if(temp==-1)

return qurey(mid+1,r,c*2+1,col);

else 

return temp;

}

}

 

void init()

{

for(int i=1;i<=n;i++)

if(q[i].ch[0]=='f')

printf("-1/n");

printf("/n");

}

int main()

{

int i,j,cas=1;

while(scanf("%d",&n)!=EOF)

{

if(n==0) return 0;

if(cas!=1)

printf("/n");

int cnt=0;

for(i=1;i<=n;i++)

{

scanf("%s %d %d",&q[i].ch,&q[i].row,&q[i].col);

{

if(q[i].ch[0]=='a')

{

dia[cnt++]=q[i].row;

}

}

}

printf("Case %d:/n",cas++);

if(cnt==0) {

init();

continue;

}

sort(dia,dia+cnt);

int c=0;

for(i=0;i<cnt;i++)

{

S[c].clear();

S[c].insert(0);

dia[c++]=dia[i];

while(i+1<cnt&&dia[i+1]==dia[i])

i ++;

}

cnt=c;

set<int>::iterator it;

maketree(0,cnt-1,1);

for(i=1;i<=n;i++)

{

if(q[i].ch[0]=='a')

{

int pos=lower_bound(dia,dia+cnt,q[i].row)-dia;

it = S[pos].lower_bound(q[i].col);

if(it==S[pos].end())

updata(pos,1,q[i].col);

S[pos].insert(q[i].col);

}

else if(q[i].ch[0]=='r')

{

int pos=lower_bound(dia,dia+cnt,q[i].row)-dia;

it = S[pos].find(q[i].col);

it++;

if(it==S[pos].end())

{

it--;

it--;

updata(pos,1,*it);

}

S[pos].erase(q[i].col);

}

else

{

int pos=lower_bound(dia,dia+cnt,q[i].row+1)-dia;

int respos=qurey(pos,cnt-1,1,q[i].col);

if(respos==-1)

printf("-1/n");

else

{

 

it=S[respos].lower_bound(q[i].col+1);

printf("%d %d/n",dia[respos],(*it));

}

}

}

}

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.