QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#557080 | #4688. Window Manager | AllSolvedin1557 | RE | 0ms | 0kb | C++17 | 7.3kb | 2024-09-11 02:30:45 | 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