QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#557033 | #4688. Window Manager | AllSolvedin1557 | WA | 0ms | 3804kb | C++17 | 7.8kb | 2024-09-11 00:24:54 | 2024-09-11 00:24:54 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'