hdu 4941 Magical Forest 离散化 +模拟 /(map应用)

来源:互联网 发布:25颗摇头矩阵灯厂家 编辑:程序博客网 时间:2024/06/14 05:13



非常不开心。。这么简单的题都实现错了。。。。唉。。

题意: 给你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");                elseif (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]);}elseif (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;}


0 0
原创粉丝点击