QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#557080#4688. Window ManagerAllSolvedin1557RE 0ms0kbC++177.3kb2024-09-11 02:30:452024-09-11 02:30:45

Judging History

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

  • [2024-09-11 02:30:45]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-09-11 02:30:45]
  • 提交

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 in(ll a,ll b) { return (x<=a&&a<x+w&&y<=b&&b<y+h); }
    bool inc(dat d) { return in(d.x,d.y)&&in(d.x,d.y+d.h-1)&&in(d.x+d.w-1,d.y)&&in(d.x+d.w-1,d.y+d.h-1); }
    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 inter(dat d) { return interx(d)&&intery(d); }
    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 = 1;
    dat S={0,0,X,Y};
    ofstream fo("leo.txt");
    while(1)
    {
        string s;
        cin>>s;
        cnt++;
        if(debug)
        {
            fo<<cnt<<'\n';
            for(auto [x,y,w,h,t]:W) fo<<x<<' '<<y<<' '<<w<<' '<<h<<' '<<t<<'\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].in(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].in(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].in(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;

                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;
}



Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

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:


result: