QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#557033#4688. Window ManagerAllSolvedin1557WA 0ms3804kbC++177.8kb2024-09-11 00:24:542024-09-11 00:24:54

Judging History

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

  • [2024-09-11 00:24:54]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3804kb
  • [2024-09-11 00:24:54]
  • 提交

answer

#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef long double ld;

struct dat{
    ll x,y,w,h,time;
    bool inc(ll a,ll b) { return (x<=a&&a<=x+w&&y<=b&&b<=y+h); }
    bool myinc(ll a,ll b) { return (x<=a&&a<x+w&&y<=b&&b<y+h); }
    bool in(ll a,ll b) { return (x<a&&a<x+w&&y<b&&b<y+h); }
    bool inter(dat d) { return d.in(x,y)||d.in(x,y+h)||d.in(x+w,y)||d.in(x+w,y+h); }
    bool inc(dat d) { return inc(d.x,d.y)&&inc(d.x,d.y+d.h)&&inc(d.x+d.w,d.y)&&inc(d.x+d.w,d.y+d.h); }
    bool interx(dat d) { return (y<d.y+d.h&&d.y<y+h); }
    bool intery(dat d) { return (x<d.x+d.w&&d.x<x+w); }
    bool operator==(const dat &d)
    {
        return x==d.x&&y==d.y&&h==d.h&&w==d.w;
    }
};

vector<dat>W;

void notfit(ll cnt, string &comm)
{ cout<<"Command "<<cnt<<": "<<comm<<" - window does not fit\n"; }

void notpos(ll cnt, string &comm)
{ cout<<"Command "<<cnt<<": "<<comm<<" - no window at given position\n"; }

void notmov(ll cnt, string &comm, ll real, ll fact)
{ cout<<"Command "<<cnt<<": "<<comm<<" - moved "<<real<<" instead of "<<fact<<"\n"; }

int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    ll X,Y,cnt=0; cin>>X>>Y;
    bool debug = 0;
    dat S={0,0,X,Y};
    while(1)
    {
        string s;
        cin>>s;
        cnt++;
        if(debug)
        {
            cout<<cnt<<'\n';
            cout<<"-------\n";
            for(auto [x,y,w,h,t]:W) cout<<x<<' '<<y<<' '<<w<<' '<<h<<' '<<t<<'\n';
            cout<<"-------\n";
        }
        if(cin.eof()) break;
        if(s=="OPEN")
        {
            ll x,y,w,h; cin>>x>>y>>w>>h;
            dat now={x,y,w,h,cnt};
            if(!S.inc(now))
            {
                notfit(cnt,s);
                continue;
            }
            bool flag=1;
            for(auto d:W)
                if(d.inter(now)) flag=0;
            if(flag)
                W.push_back(now);
            else notfit(cnt,s);
        }
        if(s=="RESIZE")
        {
            ll x,y,w,h; cin>>x>>y>>w>>h;

            ll ex=-1;
            for(int i=0;i<W.size();i++) if(W[i].myinc(x,y)) ex=i;
            if(ex==-1)
            {
                notpos(cnt,s);
                continue;
            }
            dat prv=W[ex];
            W.erase(W.begin()+ex);
            dat now=prv; now.w=w; now.h=h;

            if(!S.inc(now))
            {
                W.push_back(prv);
                notfit(cnt,s);
                continue;
            }
            bool flag=1;
            for(auto d:W)
                if(d.inter(now)) flag=0;
            if(flag)
                W.push_back(now);
            else W.push_back(prv), notfit(cnt,s);
        }
        if(s=="CLOSE")
        {
            ll x,y; cin>>x>>y;
            ll ex=-1;
            for(int i=0;i<W.size();i++) if(W[i].myinc(x,y)) ex=i;
            if(ex==-1)
            {
                notpos(cnt,s);
                continue;
            }
            W.erase(W.begin()+ex);
        }
        if(s=="MOVE")
        {
            ll x,y,dx,dy; cin>>x>>y>>dx>>dy;
            ll ex=-1;
            for(int i=0;i<W.size();i++) if(W[i].myinc(x,y)) ex=i;
            if(ex==-1)
            {
                notpos(cnt,s);
                continue;
            }
            dat now=W[ex];
            if(dx>0)
            {
                sort(W.begin(),W.end(),[](dat a,dat b){ return a.x<b.x; });
                int pos;
                for(int i=0;i<W.size();i++) if(W[i]==now) pos=i;
                vector<ll>dist(W.size(),0);
                ll over=0;
                for(ll i=pos;i<W.size();i++)
                {
                    if(i==pos) dist[i]=dx;
                    else
                    {
                        for(ll j=pos;j<i;j++)
                        {
                            if(W[i].interx(W[j]))
                                dist[i]=max(dist[i],dist[j]-abs(W[i].x-W[j].x-W[j].w));
                        }
                    }
                    over=max(over,dist[i]-(X-W[i].x-W[i].w));
                }
                if(over>0) notmov(cnt,s,dx-over,dx);
                for(ll i=pos;i<W.size();i++)
                {
                    W[i].x+=max(0LL,dist[i]-over);
                }
            }
            if(dx<0)
            {
                sort(W.begin(),W.end(),[](dat a,dat b){ return a.x>b.x; });
                dx*=-1;
                int pos;
                for(int i=0;i<W.size();i++) if(W[i]==now) pos=i;
                vector<ll>dist(W.size(),0);
                ll over=0;
                for(ll i=pos;i<W.size();i++)
                {
                    if(i==pos) dist[i]=dx;
                    else
                    {
                        for(ll j=pos;j<i;j++)
                        {
                            if(W[i].interx(W[j]))
                                dist[i]=max(dist[i],dist[j]-abs(W[i].x-W[j].x+W[i].w));
                        }
                    }
                    over=max(over,dist[i]-(W[i].x));
                }
                if(over>0) notmov(cnt,s,dx-over,dx);
                for(ll i=pos;i<W.size();i++)
                {
                    W[i].x-=max(0LL,dist[i]-over);
                }
            }
            if(dy>0)
            {
                sort(W.begin(),W.end(),[](dat a,dat b){ return a.y<b.y; });
                int pos;
                for(int i=0;i<W.size();i++) if(W[i]==now) pos=i;
                vector<ll>dist(W.size(),0);
                ll over=0;
                for(ll i=pos;i<W.size();i++)
                {
                    if(i==pos) dist[i]=dy;
                    else
                    {
                        for(ll j=pos;j<i;j++)
                        {
                            if(W[i].intery(W[j]))
                                dist[i]=max(dist[i],dist[j]-abs(W[i].y-W[j].y-W[j].h));
                        }
                    }
                    over=max(over,dist[i]-(y-W[i].y-W[i].h));
                }
                if(over>0) notmov(cnt,s,dy-over,dy);
                for(ll i=pos;i<W.size();i++)
                {
                    W[i].y+=max(0LL,dist[i]-over);
                }
            }
            if(dy<0)
            {
                sort(W.begin(),W.end(),[](dat a,dat b){ return a.y>b.y; });
                dy*=-1;
                int pos;
                for(int i=0;i<W.size();i++) if(W[i]==now) pos=i;
                if(debug)
                {
                    cout<<cnt<<'\n';
                    cout<<"-------\n";
                    for(auto [x,y,w,h,t]:W) cout<<x<<' '<<y<<' '<<w<<' '<<h<<' '<<t<<'\n';
                    cout<<"-------\n";
                }
                vector<ll>dist(W.size(),0);
                ll over=0;
                for(ll i=pos;i<W.size();i++)
                {
                    if(i==pos) dist[i]=dy;
                    else
                    {
                        for(ll j=pos;j<i;j++)
                        {
                            if(W[i].intery(W[j]))
                                dist[i]=max(dist[i],dist[j]-abs(W[i].y-W[j].y+W[i].h));
                        }
                    }
                    over=max(over,dist[i]-(W[i].y));
                }
                if(over>0) notmov(cnt,s,dy-over,dy);
                for(ll i=pos;i<W.size();i++)
                {
                    W[i].y-=max(0LL,dist[i]-over);
                }
            }
        }

    }
    sort(W.begin(),W.end(),[](dat a,dat b){ return a.time<b.time; });
    cout<<W.size()<<" window(s):\n";
    for(auto [x,y,w,h,t]:W) cout<<x<<' '<<y<<' '<<w<<' '<<h<<'\n';

    return 0;
}



详细

Test #1:

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

input:

320 200
OPEN 50 50 10 10
OPEN 70 55 10 10
OPEN 90 50 10 10
RESIZE 55 55 40 40
RESIZE 55 55 15 15
MOVE 55 55 40 0
CLOSE 55 55
CLOSE 110 60
MOVE 95 55 0 -100

output:

Command 4: RESIZE - window does not fit
Command 7: CLOSE - no window at given position
Command 9: MOVE - moved 50 instead of 100
2 window(s):
90 0 15 15
115 50 10 10

result:

ok 6 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3644kb

input:

10 10
OPEN 0 0 8 8
MOVE 0 0 5 0

output:

Command 2: MOVE - moved 2 instead of 5
1 window(s):
2 0 8 8

result:

ok 3 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 3640kb

input:

10 10
OPEN 2 2 8 8
MOVE 3 3 -5 0

output:

Command 2: MOVE - moved 2 instead of 5
1 window(s):
0 2 8 8

result:

ok 3 lines

Test #4:

score: 0
Accepted
time: 0ms
memory: 3804kb

input:

10 10
OPEN 2 2 8 8
MOVE 3 3 0 -5

output:

Command 2: MOVE - moved 2 instead of 5
1 window(s):
2 0 8 8

result:

ok 3 lines

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 3644kb

input:

10 10
OPEN 0 0 8 8
MOVE 0 0 0 5

output:

Command 2: MOVE - moved -8 instead of 5
1 window(s):
0 0 8 8

result:

wrong answer 1st lines differ - expected: 'Command 2: MOVE - moved 2 instead of 5', found: 'Command 2: MOVE - moved -8 instead of 5'