标签:二分
1 3 3 2 1 1 1 2 2 2 5 3 1 1 1 1 2 2 1 2 3 1 1 3 2 2
Case #1: 1 2 1HintNo two fruits at the same location.
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; typedef struct nnn { int id,valu; struct nnn *next; }node; typedef struct nnnnn { int x,y,v; }Friut; Friut friut[100005]; node *map[100005];//最初水果的位置 int R[100005],rn,L[100005],ln,fn,row[100005],colum[100005];//row[i]表示交换后的第i行在最初行的位置是row[i],列则同理 int cmp(int a,int b){ return a<b;} int RtwoFind(int ans) { int l,r,m; l=1; r=rn; while(l<=r) { m=(l+r)/2; if(ans==R[m])return m; if(ans<R[m])r=m-1; else l=m+1; } return 0; } int LtwoFind(int ans) { int l,r,m; l=1; r=ln; while(l<=r) { m=(l+r)/2; if(ans==L[m])return m; if(ans<L[m])r=m-1; else l=m+1; } return 0; } void buildeMap() { for(int i=1;i<=rn;i++) { map[i]=new node; map[i]->next=NULL; } node *p; for(int i=1;i<=fn;i++) { int l,r; r=RtwoFind(friut[i].x); l=LtwoFind(friut[i].y); row[r]=r; colum[l]=l;//当前行列下标指向当前的行列 p=new node; p->id=l; p->valu=friut[i].v; p->next=map[r]->next; map[r]->next=p; } } void reSortR() { sort(R+1,R+rn+1,cmp); int j=1; for(int i=2;i<=rn;i++) if(R[j]!=R[i]) R[++j]=R[i]; rn=j; } void reSortL() { sort(L+1,L+ln+1,cmp); int j=1; for(int i=2;i<=ln;i++) if(L[j]!=L[i]) L[++j]=L[i]; ln=j; } void exchgR(int r1,int r2) { r1=RtwoFind(r1); r2=RtwoFind(r2); if(!r1||!r2) return ; int tem=row[r1]; row[r1]=row[r2]; row[r2]=tem; } void exchgL(int l1,int l2) { l1=LtwoFind(l1); l2=LtwoFind(l2); if(!l1||!l2) return ; int tem=colum[l1]; colum[l1]=colum[l2]; colum[l2]=tem; } int query(int x,int y) { int tx,ty; node *p; tx=RtwoFind(x); ty=LtwoFind(y); if(tx==0||ty==0)return 0; tx=row[tx]; ty=colum[ty]; p=map[tx]->next; while(p&&p->id!=ty)p=p->next; if(p)return p->valu; return 0; } int main() { int N,M,t,cas=0,Q,b,a; scanf("%d",&t); while(t--) { printf("Case #%d:\n",++cas); scanf("%d%d%d",&N,&M,&fn); rn=ln=0; for(int i=1;i<=fn;i++) { scanf("%d%d%d",&friut[i].x,&friut[i].y,&friut[i].v); R[++rn]=friut[i].x; L[++ln]=friut[i].y; } reSortR(); reSortL(); buildeMap(); scanf("%d",&M); while(M--) { scanf("%d%d%d",&Q,&a,&b); if(Q==1)exchgR(a,b); else if(Q==2)exchgL(a,b); else printf("%d\n",query(a,b)); } } }
HDU4941Magical Forest (二分+链表优化),布布扣,bubuko.com
HDU4941Magical Forest (二分+链表优化)
标签:二分
原文地址:http://blog.csdn.net/u010372095/article/details/38534333