QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#602329#7029. Xu Xiake in Henan Provinceucup-team5071#WA 1ms3572kbC++207.1kb2024-09-30 22:58:442024-09-30 23:00:21

Judging History

你现在查看的是最新测评结果

  • [2024-09-30 23:00:21]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3572kb
  • [2024-09-30 22:58:44]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const bool test=true;
void solve()
{
    int n,q;
    cin>>n>>q;
    ll ans=0;
    if(n==1){
        int z;cin>>z>>z;
        while(q--){
            char c;cin>>c;
            if(c=='!')cout<<"0\n";
            else if(c=='?'){
                int x;cin>>x;
                cout<<"1 1\n";
            }
            else {
                int x;cin>>x;
            }
        }
        return;
    }
    vector<int> x(n+1),y(n+1);
    vector<int> up(n+1),down(n+1),left(n+1),right(n+1);
    vector<int> px(n+1);//the x of point on y
    vector<int> py(n+1);//the y of point on x
    int lu=0,ld=0,ru=0,rd=0;
    int l1=1,l2=n,t1=1,t2=n;//actually bound
    int x1=1,x2=n,y1=1,y2=n;//virtual bound
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i];
        py[x[i]]=y[i];
        px[y[i]]=x[i];
        if(x[i]==1&&y[i]==1)lu++;
        else if(x[i]==1&&y[i]==n)ru++;
        else if(x[i]==n&&y[i]==1)ld++;
        else if(x[i]==n&&y[i]==n)rd++;
        else if(x[i]==1)up[y[i]]++;
        else if(x[i]==n)down[y[i]]++;
        else if(y[i]==1)left[x[i]]++;
        else if(y[i]==n)right[x[i]]++;
    }
    auto actual_point = [&](int x,int y){
        return make_pair(x-x1+l1,y-y1+t1);
    };
    auto merge = [&](int &x,int y){//calcu ans when merge
        ans+=(ll)x*y; 
        if(test){if(x>0&&y>0)cout<<"merge x="<<x<<" y="<<y<<endl;}
        x+=y;
    };
    int tt=0;
    while(q--){
        if(test){
            cout<<"-----------------------------------------------------------"<<endl;
            cout<<"times = "<<++tt<<endl;
            cout<<"lu="<<lu<<" ld="<<ld<<" ru="<<ru<<" rd="<<rd<<endl;
            cout<<"x1="<<x1<<" x2="<<x2<<" y1="<<y1<<" y2="<<y2<<endl;
            cout<<"l1="<<l1<<" l2="<<l2<<" t1="<<t1<<" t2="<<t2<<endl;
            cout<<"left :";for(int i=1;i<=n;i++)cout<<left[i]<<" \n"[i==n];
            cout<<"right :";for(int i=1;i<=n;i++)cout<<right[i]<<" \n"[i==n];
            cout<<"up :";for(int i=1;i<=n;i++)cout<<up[i]<<" \n"[i==n];
            cout<<"down :";for(int i=1;i<=n;i++)cout<<down[i]<<" \n"[i==n];
        }
        char c;cin>>c;
        if(c=='!'){cout<<ans<<"\n";continue;}
        if(c=='?'){
            int i;cin>>i;
            int ax,ay;
            if(x[i]<=x1&&y[i]<=y1)tie(ax,ay)=actual_point(x1,y1);
            else if(x[i]<=x1&&y[i]>=y2)tie(ax,ay)=actual_point(x1,y2);
            else if(x[i]>=x2&&y[i]<=y1)tie(ax,ay)=actual_point(x2,y1);
            else if(x[i]>=x2&&y[i]>=y2)tie(ax,ay)=actual_point(x2,y2);
            else if(x[i]<=x1)tie(ax,ay)=actual_point(x1,y[i]);
            else if(x[i]>=x2)tie(ax,ay)=actual_point(x2,y[i]);
            else if(y[i]<=y1)tie(ax,ay)=actual_point(x[i],y1);
            else if(y[i]>=y2)tie(ax,ay)=actual_point(x[i],y2);
            else tie(ax,ay)=actual_point(x[i],y[i]);
            cout<<ax<<" "<<ay<<"\n";
            continue;
        }
        int k;cin>>k;
        {//move the actual bound to the map bound
            int d=0;
            if(c=='L'){d=min(k,t1-1);k-=d;t1-=d;t2-=d;}
            if(c=='R'){d=min(k,n-t2);k-=d;t1+=d;t2+=d;}
            if(c=='U'){d=min(k,l1-1);k-=d;l1-=d;l1-=d;}
            if(c=='D'){d=min(k,n-l2);k-=d;l2+=d;l2+=d;}
            if(k==0)continue;
        }
        if((c=='L'||c=='R')&&y1==y2){//just line move
            continue;
        }
        if((c=='U'||c=='D')&&x1==x2){//just line move
            continue;
        }
        while(k--){
            if(c=='L'){
                if(y1+1<y2){//not merge
                    if(x1==x2){
                        merge(lu,up[y1+1]);
                    }
                    else{
                        if(x1<px[y1+1]&&px[y1+1]<x2){
                            merge(left[px[y1]+1],1);
                        }
                        merge(lu,up[y1+1]);
                        merge(ld,down[y1+1]);
                    }
                }
                else{//merge
                    if(x1==x2){
                        merge(lu,ru);
                    }
                    else{
                        merge(lu,ru);
                        merge(ld,rd);
                        for(int i=x1+1;i<x2;i++)merge(left[i],right[i]);
                    }
                }
                y1++;t2--;
                if(y1==y2)break;
            }
            if(c=='R'){
                if(y1+1<y2){//not merge
                    if(x1==x2){
                        merge(ru,up[y2-1]);
                    }
                    else{
                        if(x1<px[y2-1]&&px[y2-1]<x2){
                            merge(right[px[y2-1]],1);
                        }
                        merge(ru,up[y2-1]);
                        merge(rd,down[y2-1]);
                    }
                }
                else{//merge
                    if(x1==x2){
                        merge(lu,ru);
                    }
                    else{
                        merge(lu,ru);
                        merge(ld,rd);
                        for(int i=x1+1;i<x2;i++)merge(left[i],right[i]);
                    }
                }
                y2--;t1++;
                if(y1==y2)break;
            }
            if(c=='U'){
                if(x1+1<x2){//not merge
                    if(y1==y2){
                        merge(lu,left[x1+1]);
                    }
                    else{
                        if(y1<py[x1+1]&&py[x1+1]<y2){
                            merge(up[py[x1+1]],1);
                        }
                        merge(lu,left[x1+1]);
                        merge(ru,right[x1+1]);
                    }
                }
                else{//merge
                    if(y1==y2){
                        merge(lu,ld);
                    }
                    else{
                        merge(lu,ld);
                        merge(ru,rd);
                        for(int i=y1+1;i<y2;i++)merge(up[i],down[i]);
                    }
                }
                x1++;l2--;
                if(x1==x2)break;
            }
            if(c=='D'){
                if(x1+1<x2){//not merge
                    if(y1==y2){
                        merge(ld,left[x2-1]);
                    }
                    else{
                        if(y1<py[x2-1]&&py[x2-1]<y2){
                            merge(down[py[x2-1]],1);
                        }
                        merge(ld,left[x2-1]);
                        merge(rd,right[x2-1]);
                    }
                }
                else{//merge
                    if(y1==y2){
                        merge(lu,ld);
                    }
                    else{
                        merge(lu,ld);
                        merge(ru,rd);
                        for(int i=y1+1;i<y2;i++)merge(up[i],down[i]);
                    }
                }
                x2--;l1++;
                if(x1==x2)break;
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;cin>>T;while(T--)solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3572kb

input:

5
0 0 0 0
0 0 0 1
1 1 0 0
2 1 1 0
1 2 3 4

output:

-----------------------------------------------------------
times = 1
lu=0 ld=0 ru=0 rd=0
x1=1 x2=0 y1=1 y2=0
l1=1 l2=0 t1=1 t2=0
left :right :up :down :

result:

wrong answer 1st lines differ - expected: 'Typically Otaku', found: '-----------------------------------------------------------'