QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#602333#7031. Supreme Commanducup-team5071#WA 146ms3872kbC++207.1kb2024-09-30 23:03:492024-09-30 23:03:49

Judging History

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

  • [2024-09-30 23:03:49]
  • 评测
  • 测评结果:WA
  • 用时:146ms
  • 内存:3872kb
  • [2024-09-30 23:03:49]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const bool test=false;
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;l2-=d;}
            if(c=='D'){d=min(k,n-l2);k-=d;l1+=d;l2+=d;}
            if(k==0)continue;
            // cout<<"k="<<k<<endl;
        }
        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;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3872kb

input:

1
4 9
3 4
2 1
4 2
1 3
L 2
? 1
? 2
R 1
? 1
? 3
!
U 3
!

output:

3 2
2 1
3 3
4 2
0
3

result:

ok 6 lines

Test #2:

score: -100
Wrong Answer
time: 146ms
memory: 3724kb

input:

500
2000 2000
492 502
1394 1025
980 1484
1135 599
760 242
575 1393
833 341
1364 453
1692 1515
1303 7
1429 1519
887 86
205 1874
1483 1797
649 1677
1717 298
416 1673
1696 896
1998 1154
638 1725
667 96
1467 1788
1438 759
285 1987
1985 736
95 140
596 1076
1089 238
1212 247
1287 1705
891 1237
941 622
930...

output:

170 1229
0
1610 1081
0
616 1509
0
1419 1109
0
1584 1103
0
459 1193
0
1891 1713
0
806 187
0
115 81
0
1035 378
0
1673 276
0
529 1976
0
1380 639
0
397 1375
0
144 806
0
579 495
0
1817 1065
0
369 828
0
1226 790
0
740 1967
0
37 311
0
1466 391
0
160 898
0
97 1023
0
1086 754
0
670 1932
0
831 909
0
1964 255
...

result:

wrong answer 75704th lines differ - expected: '3', found: '6'