Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. #include <complex>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef double db;
  15. typedef pair<int,int> pii;
  16. typedef vector<int> vi;
  17. #define de(x) cout << #x << "=" << x << endl
  18. #define rep(i,a,b) for(int i=a;i<(b);++i)
  19. #define all(x) (x).begin(),(x).end()
  20. #define sz(x) (int)(x).size()
  21. #define mp make_pair
  22. #define pb push_back
  23. #define fi first
  24. #define se second
  25. #define setIO(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
  26. int toint(string s){int r=0;rep(i,0,sz(s))r=r*10+s[i]-'0';return r;}
  27. struct Widget{
  28.     ll t,x,y,border,space;
  29.     vector<string> V;
  30.     Widget(int t=0,int x=0,int y=0):t(t),x(x),y(y),border(0),space(0){}
  31. };
  32. map<string,Widget> Mp;
  33. char s[1000];
  34. void go(Widget&c){
  35.     if(c.t == 0) return;
  36.     for(auto e : c.V){
  37.         Widget& to = Mp[e];
  38.         go(to);
  39.         if(c.t == 1){
  40.             c.x = max(c.x,to.x+c.border*2);
  41.             c.y += to.y;
  42.         }
  43.         if(c.t == 2){
  44.             c.y = max(c.y,to.y+c.border*2);
  45.             c.x += to.x;
  46.         }
  47.     }
  48.     if(sz(c.V)){
  49.         if(c.t == 1) c.y += c.border*2+(sz(c.V)-1)*c.space;
  50.         if(c.t == 2) c.x += c.border*2+(sz(c.V)-1)*c.space;
  51.     }
  52.     c.t = 0;
  53. }
  54. int main(){
  55.     int n;scanf("%d",&n);
  56.     gets(s);
  57.     rep(i,0,n){
  58.         gets(s);
  59.         vector<string> a;
  60.         for(char* p=strtok(s," .,()");p;p=strtok(NULL," .,()")) a.pb(p);
  61.         if(a[0] == "Widget") Mp[a[1]] = Widget(0,toint(a[2]),toint(a[3]));
  62.         else if(a[0] == "VBox") Mp[a[1]] = Widget(1);
  63.         else if(a[0] == "HBox") Mp[a[1]] = Widget(2);
  64.         else if(a[1] == "pack") Mp[a[0]].V.pb(a[2]);
  65.         else if(a[1] == "set_border") Mp[a[0]].border = toint(a[2]);
  66.         else if(a[1] == "set_spacing") Mp[a[0]].space = toint(a[2]);
  67.     }
  68.     for(auto e:Mp){
  69.         go(e.se);
  70.         cout << e.fi << " " << e.se.x << " " << e.se.y << endl;
  71.     }
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement