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



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

题意: 给你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;
	
}


你可能感兴趣的:(hdu 4941 Magical Forest 离散化 +模拟 /(map应用))