ZJNU 2206

开纵横两个结构体数组,记录连续涂了一整行或者一整列的情况

再开一个map,记录涂点

#include<iostream>
#include<algorithm>
#include<map>
#include<utility>
using namespace std;
typedef pair<int,int> P;
struct node{
    int color,time;
}x[2010],y[2010];
map<P,node> mp;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T,n,m,q,i,tm,kd,a,b,cl,d1,d2,d3;
    node dd;
    cin>>T;
    while(T--){
        cin>>n>>m>>q;
        mp.erase(mp.begin(),mp.end());
        for(i=1;i<=n;i++){
            x[i].color=-1;
            x[i].time=0;
        }
        for(i=1;i<=m;i++){
            y[i].color=-1;
            y[i].time=0;
        }
        tm=1;
        for(i=0;i<q;i++){
            cin>>kd;
            if(kd==1){
                cin>>a>>cl;
                x[a].color=cl;
                x[a].time=tm++;
            }
            else if(kd==2){
                cin>>b>>cl;
                y[b].color=cl;
                y[b].time=tm++;
            }
            else if(kd==3){
                cin>>a>>b>>cl;
                dd.color=cl;
                dd.time=tm++;
                mp[P(a,b)]=dd;
            }
            else{
                cin>>a>>b;
                d1=x[a].time;
                d2=y[b].time;
                d3=-1;
                if(mp.find(P(a,b))!=mp.end())
                    d3=mp[P(a,b)].time;
                if(d1>d2&&d1>d3)
                    cout<<x[a].color<<endl;
                else if(d2>d1&&d2>d3)
                    cout<<y[b].color<<endl;
                else
                    cout<<mp[P(a,b)].color<<endl;
            }
        }
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12236621.html