标签:二分
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