非常不开心。。这么简单的题都实现错了。。。。唉。。
题意: 给你n行,m列,的矩形,k个水果
每个水果属性,x,y,v,表示在x行y列
t次查询
每次 q=1把 a,b行互换
q=2把a,b列互换
q=3查询 mp[a][b]是否存在果子,存在则输出对应的v,否则输出0
显然对于行列互换操作,只需要用一个数组记录 row[i]最终指向的行,每次交换只需要把row[i],row[j]互换即可。
然后我是开k个vector,每个vector表示一行,元素是node(y,v)表示第y列的水果
当然每个vector排好序
每次查询就在 vector[x]里面二分查找y的存在 然后判断输出即可 【这里判断不存在我居然直接看迭代器是否==end(),真不知道当时吃了什么毒奶粉】
这里的n,m很大,需要离散化。。。。离散化我是用数组离散化的。。。。每次二分查找对应下标便是离散化后的下标。。。在每次查询时。。我直接 a 在离散化的行数组查询。。b在列数组查询。。又是一斤毒奶粉。。。。明明查询操作不同 查询的a,b代表的是行还是列不同啊
最后面是纯map的写法,也很简单
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 row[100055];
__int64 col[100055];
__int64 row_vis[100055];
__int64 col_vis[100055];
struct node
{
__int64 y,val;
node(){}
node(__int64 a,__int64 b){y=a,val=b;}
bool operator<(const node&b)
{
return y<b.y;
}
};
vector<node> ::iterator it;
vector<node> mp[100055];
__int64 x[100055],y[100055],v[100055];
vector<__int64> tmpx,tmpy;
int main()
{
int test=0;
cin>>test;
__int64 cnt=1;
while(test--)
{
printf("Case #%I64d:\n",cnt++);
__int64 i;
tmpx.clear();
tmpy.clear();
__int64 n,m,k;
scanf("%I64d%I64d%I64d",&n,&m,&k);
for (i=0;i<=k;i++) row[i]=i ;
for (i=0;i<=k;i++) mp[i].clear() ;
for (i=0;i<=k;i++) col[i]=i;
memset(row_vis,0,sizeof(row_vis));
memset(col_vis,0,sizeof(col_vis));
for (i=0;i<k;i++)
{
scanf("%I64d%I64d%I64d",&x[i],&y[i],&v[i]);
tmpx.push_back(x[i]);
tmpy.push_back(y[i]);
}
sort(tmpx.begin(),tmpx.end());
tmpx.erase(unique(tmpx.begin(),tmpx.end()),tmpx.end());
sort(tmpy.begin(),tmpy.end());
tmpy.erase(unique(tmpy.begin(),tmpy.end()),tmpy.end());
for (i=0;i<k;i++)
{
__int64 xx=lower_bound(tmpx.begin(),tmpx.end(),x[i])-tmpx.begin();
__int64 yy=lower_bound(tmpy.begin(),tmpy.end(),y[i])-tmpy.begin();
__int64 vv=v[i];
mp[xx].push_back(node(yy,vv));
row_vis[xx]=1;
col_vis[yy]=1;
}
for (i=0;i<k;i++) sort(mp[i].begin(),mp[i].end());
int t;
__int64 q,a,b;;
cin>>t;
while(t--)
{
scanf("%I64d%I64d%I64d",&q,&a,&b);
if (q==1)
{
a=lower_bound(tmpx.begin(),tmpx.end(),a)-tmpx.begin();
b=lower_bound(tmpx.begin(),tmpx.end(),b)-tmpx.begin();
if (row_vis[row[a]]==row_vis[row[b]])
swap(row[a],row[b]);
}
if (q==2)
{
a=lower_bound(tmpy.begin(),tmpy.end(),a)-tmpy.begin();
b=lower_bound(tmpy.begin(),tmpy.end(),b)-tmpy.begin();
if (col_vis[col[a]]==col_vis[col[b]])
swap(col[a],col[b]);
}
if (q==3)
{
a=lower_bound(tmpx.begin(),tmpx.end(),a)-tmpx.begin();
b=lower_bound(tmpy.begin(),tmpy.end(),b)-tmpy.begin();
__int64 rr=row[a];
__int64 cc=col[b];
node xx=node(cc,0);
it= lower_bound(mp[rr].begin(),mp[rr].end(),xx);
if (it==mp[rr].end() ) printf("0\n");
else
if (it->y!=cc) printf("0\n");
else
{
__int64 vvv=it->val;
printf("%I64d\n",vvv);
}
}
}
}
return 0;
}
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int row_vis[100055];
int col_vis[100055];
map<int ,int> row,col;
int x[100055];
int y[100055];
int tmpx[100055];
int tmpy[100055];
int v[100055];
map<int ,map<int ,int> > mp;
int main()
{
int test;cin>>test;
int i,j;
int cnt=1;
while(test--)
{
mp.clear();
row.clear();
col.clear();
memset(col_vis,0,sizeof(col_vis));
memset(row_vis,0,sizeof(row_vis));
printf("Case #%d:\n",cnt++);
int n,m,k;
cin>>n>>m>>k;
for (i=0;i<k;i++)
{
scanf("%d%d%d",&x[i],&y[i],&v[i]);
tmpx[i]=x[i];
tmpy[i]=y[i];
}
sort(tmpx,tmpx+k);
sort(tmpy,tmpy+k);
for (i=0;i<k;i++)
{
if (row[x[i]]==0) row[x[i]]=i;
row_vis[row[x[i]]]=1;
if (col[y[i]]==0) col[y[i]]=i;
col_vis[col[y[i]]]=1;
mp[row[x[i]]][col[y[i]]]=v[i];
}
int t;cin>>t;
while(t--)
{
int q,a,b;
cin>>q>>a>>b;
if (q==1)
{
if ( row_vis[row[a]]== row_vis[row[b]])
swap(row[a],row[b]);
}else
if (q==2)
{
if ( col_vis[col[a]]== col_vis[col[b]])
swap(col[a],col[b]);
}
else
{
int rr=row[a];
int cc=col[b];
printf("%d\n",mp[rr][cc]);
}
}
}
return 0;
}