HDU-4941-Magical Forest

这个题呢,我偷懒用的STL做的,对于交换操作可以直接交换2行/2列的编号值即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct Node
{
    int col;
    int row;
    int val;
    Node(){}
    Node(int _row,int _col,int _val):row(_row),col(_col),val(_val){}
    bool operator < (const Node &a)const
    {
        if(row==a.row)
            return col<a.col;
        return row<a.row;
    }
};
int n,m,k,q;
map<int,int> hasrow,hascol,col,row;
vector<Node> s;
void Init()
{
    hasrow.clear();
    hascol.clear();
    col.clear();
    row.clear();
    s.clear();
}
int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        printf("Case #%d:\n",cas++);
        Init();
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<k;i++)
        {
            int x,y,c;
            scanf("%d%d%d",&x,&y,&c);
            x++;
            y++;
            s.push_back(Node(x,y,c));
            hasrow[x]++;
            hascol[y]++;
            row[x]=x;
            col[y]=y;
        }
        sort(s.begin(),s.end());
        scanf("%d",&q);
        while(q--)
        {
            int op,x,y;
            scanf("%d%d%d",&op,&x,&y);
            x++;
            y++;
            if(op==1)
            {
                if(hasrow[x]&&hasrow[y])
                    swap(row[x],row[y]);
            }
            else if(op==2)
            {
                if(hascol[x]&&hascol[y])
                    swap(col[x],col[y]);
            }
            else
            {
                x=row[x];
                y=col[y];
                int index=lower_bound(s.begin(),s.end(),Node(x,y,0))-s.begin();
                if(s[index].row==x&&s[index].col==y)
                    printf("%d\n",s[index].val);
                else
                    printf("0\n");
            }
        }
    }
    return 0;
}


你可能感兴趣的:(STL)