2018-ACetic_ACid/AugTrain-04/G

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <bits/stdc++.h>
using namespace std;
#define N 120
struct point{
    int x,y;
    point(int x=0,int y=0):x(x),y(y){}
    point operator + (const point &c) const { return point(x+c.x,y+c.y); }
};
struct chip{
    vector<point> a;
    chip()
    {
        a.clear();
    }
    void init()
    {
        a.clear();
        a.push_back(point(1,1));
    }
    chip operator + (chip const &c) const{
        static chip ans;
        static point t;
        ans=*this;
        t=a[a.size()-1]; t.y--;
        cerr<<t.x<<" "<<t.y<<endl;
        for(int i=0;i<c.a.size();i++)
            ans.a.push_back(c.a[i]+t);
        return ans;
    }
    chip operator | (chip const &c) const{
        static chip ans;
        static point t1,t2;
        ans.a.clear();
        t1=point(0,a[a.size()-1].y);
        t2=point(c.a[c.a.size()-1].x,0);
        ans.a.push_back(point(1,1));
        for(int i=0;i<a.size();i++)
            ans.a.push_back(a[i]+t2);
        for(int i=0;i<c.a.size();i++)
            ans.a.push_back(c.a[i]+t1);
        ans.a.push_back(a[a.size()-1]+c.a[c.a.size()-1]);
        return ans;
    }
    void print()
    {
        printf("%d\n",a.size()+2);
        printf("0 1\n");
        for(int i=0;i<a.size();i++)
        {
            printf("%d %d\n",a[i].x,a[i].y);
        }
        printf("%d %d\n",a[a.size()-1].x,a[a.size()-1].y+1);
    }
}a[N];
int n,x,y;
char s[5];
int main()
{
    freopen("grid.in","r",stdin);
    freopen("grid.out","w",stdout);
    a[0].init();
    while(scanf("%d",&n),~n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%s%d%d",s,&x,&y);
            if(s[0]=='+')
                a[i]=a[x]+a[y];
            else
                a[i]=a[x]|a[y];
        }
        a[n].print();
    }
    return 0;
}

}}}
#include <bits/stdc++.h>
using namespace std;
#define N 120
struct point{
    int x,y;
    point(int x=0,int y=0):x(x),y(y){}
    point operator + (const point &c) const { return point(x+c.x,y+c.y); }
};
struct chip{
    vector<point> a;
    chip()
    {
        a.clear();
    }
    void init()
    {
        a.clear();
        a.push_back(point(1,1));
    }
    chip operator + (chip const &c) const{
        static chip ans;
        static point t;
        ans=*this;
        t=a[a.size()-1]; t.y--;
        cerr<<t.x<<" "<<t.y<<endl;
        for(int i=0;i<c.a.size();i++)
            ans.a.push_back(c.a[i]+t);
        return ans;
    }
    chip operator | (chip const &c) const{
        static chip ans;
        static point t1,t2;
        ans.a.clear();
        t1=point(0,a[a.size()-1].y);
        t2=point(c.a[c.a.size()-1].x,0);
        ans.a.push_back(point(1,1));
        for(int i=0;i<a.size();i++)
            ans.a.push_back(a[i]+t2);
        for(int i=0;i<c.a.size();i++)
            ans.a.push_back(c.a[i]+t1);
        ans.a.push_back(a[a.size()-1]+c.a[c.a.size()-1]);
        return ans;
    }
    void print()
    {
        printf("%d\n",a.size()+2);
        printf("0 1\n");
        for(int i=0;i<a.size();i++)
        {
            printf("%d %d\n",a[i].x,a[i].y);
        }
        printf("%d %d\n",a[a.size()-1].x,a[a.size()-1].y+1);
    }
}a[N];
int n,x,y;
char s[5];
int main()
{
    freopen("grid.in","r",stdin);
    freopen("grid.out","w",stdout);
    a[0].init();
    while(scanf("%d",&n),~n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%s%d%d",s,&x,&y);
            if(s[0]=='+')
                a[i]=a[x]+a[y];
            else
                a[i]=a[x]|a[y];
        }
        a[n].print();
    }
    return 0;
}