非常不开心。。这么简单的题都实现错了。。。。唉。。
题意: 给你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; }