QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#817018#9880. Origami WarpAfterlife#WA 581ms3892kbC++205.1kb2024-12-16 19:47:212024-12-16 19:47:22

Judging History

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

  • [2024-12-16 19:47:22]
  • 评测
  • 测评结果:WA
  • 用时:581ms
  • 内存:3892kb
  • [2024-12-16 19:47:21]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

#define int long long

struct P {
    int x,y;

    int len2()
    {
        return x*x+y*y;
    }

    void norm(int X,int Y)
    {
        if(X!=1e9)
            x=(x%X+X)%X;
        else
            x=abs(x);
        if(Y!=1e9)
            y=(y%Y+Y)%Y;
        else
            y=abs(y);
    }
};

P operator -(const P &a,const P &b)
{
    return {a.x-b.x,a.y-b.y};
}

int det(P a,P b)
{
    return a.x*b.y-a.y*b.x;
}

struct L {
    P u,v;
    int cut()
    {
        P d=u-v;
        if(d.x==0)
            return u.x;
        else if(d.y==0)
            return u.y;
        else if(d.x==d.y)
            return u.y-u.x;
        else if(d.x==-d.y)
            return u.y+u.x;
        else
            assert(0);
    }
    P sym(P a)
    {
        P d=u-v;
        if(d.x==0)
            return {u.x*2-a.x,a.y};
        else if(d.y==0)
            return {a.x,u.y*2-a.y};
        else if(d.x==d.y)
        {
            int e=u.y-u.x;
            return {a.y-e,a.x+e};
        }
        else if(d.x==-d.y)
        {
            int e=u.y+u.x;
            return {e-a.y,e-a.x};
        }
        else
            assert(0);
    }

};

bool on(P u,L a)
{
    return det(a.u-u,a.v-a.u)==0;
}

int T,n,Q;

void out(int ver)
{
    cout<<(ver?"Yes":"No")<<"\n";
}

bool operator <(const P &a,const P &b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}

set<P> br(P u,vector<L> &uL,int MX,int MY)
{
    queue<P> q;
    u.norm(MX,MY);
    q.push(u);
    set<P> ret({u});
    while(!q.empty())
    {
        auto p=q.front();
        q.pop();
        for(auto l:uL)
        {
            P v=l.sym(u);
            v.norm(MX,MY);
            if(!ret.count(v))
                ret.insert(v),q.push(v);                
        }
    }
    return ret;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>T;
    while(T--)
    {
        cin>>n;
        vector<L> lines(n);
        for(auto &[u,v]:lines)
            cin>>u.x>>u.y>>v.x>>v.y;
        P O={0,0};
        int allpassO=1;
        int strange=0;
        vector<L> x0,y0,xx,nx;
        for(auto l:lines)
        {
            if(!on(O,l))
                allpassO=0;
            P dir=l.u-l.v;
            if(dir.x!=0&&dir.y!=0&&abs(dir.x)!=abs(dir.y))
                strange=1;
            if(dir.x==0)
                x0.push_back(l);
            if(dir.y==0)
                y0.push_back(l);
            if(dir.x==dir.y)
                xx.push_back(l);
            if(dir.x==-dir.y)
                nx.push_back(l);
        }
        int gx0=0,gy0=0,gxx=0,gnx=0;
        for(int i=0;i<x0.size();i++)
            gx0=__gcd(gx0,abs(x0[i].cut()));
        for(int i=0;i<y0.size();i++)
            gy0=__gcd(gy0,abs(y0[i].cut()));
        for(int i=0;i<xx.size();i++)
            gxx=__gcd(gxx,abs(xx[i].cut()));
        for(int i=0;i<nx.size();i++)
            gnx=__gcd(gnx,abs(nx[i].cut()));
        int GX=0,GY=0;
        GX=gx0,GY=gy0;
        if(xx.size()||nx.size())
            GX=__gcd(GX,GY),GX=__gcd(GX,gx0),GX=__gcd(GX,gnx),GY=GX;
        int MX,MY;
        vector<L> uL;
        MX=GX*4,MY=GY*4;
        if(!MX)
            MX=1e9;
        if(!MY)
            MY=1e9;
        map<int,int> vis;
        for(int i=0;i<x0.size();i++)
            if(!vis[abs(x0[i].cut())%MX])
                uL.push_back(x0[i]),vis[abs(x0[i].cut())%MX]=1;
        vis.clear();
        for(int i=0;i<y0.size();i++)
            if(!vis[abs(y0[i].cut())%MY])
                uL.push_back(y0[i]),vis[abs(y0[i].cut())%MY]=1;
        vis.clear();
        for(int i=0;i<xx.size();i++)
            if(!vis[abs(xx[i].cut())%MX])
                uL.push_back(xx[i]),vis[abs(xx[i].cut())%MY]=1;
        vis.clear();
        for(int i=0;i<nx.size();i++)
            if(!vis[abs(nx[i].cut())%MX])
                uL.push_back(nx[i]),vis[abs(nx[i].cut())%MY]=1;
        
        cin>>Q;
        while(Q--)
        {
            P u,v;
            cin>>u.x>>u.y>>v.x>>v.y;
            if(allpassO)
            {
                if(strange)
                    out(u.len2()==v.len2());
                else
                {
                    //brute force
                    auto f=br(u,uL,MX,MY);
                    auto g=br(v,uL,MX,MY);
                    int ans=0;
                    for(auto p:f)
                        for(auto q:g)
                            if(p.x==q.x&&p.y==q.y)
                                ans=1;
                    out(ans);
                }
            }
            else
            {
                if(strange)
                    out(1);
                else
                {
                    //brute force
                    auto f=br(u,uL,MX,MY);
                    auto g=br(v,uL,MX,MY);
                    int ans=0;
                    for(auto p:f)
                        for(auto q:g)
                            if(p.x==q.x&&p.y==q.y)
                                ans=1;
                    out(ans);
                }
            }
        }
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3820kb

input:

2
3
0 0 1 0
0 0 0 1
0 2 2 0
4
1 0 2 3
1 -2 -1 2
1 1 -1 0
3 3 3 3
3
0 0 1 0
0 0 0 1
-2 1 2 3
2
2 1 -1 5
-1 -1 3 3

output:

Yes
Yes
No
Yes
Yes
Yes

result:

ok 6 token(s): yes count is 5, no count is 1

Test #2:

score: 0
Accepted
time: 6ms
memory: 3616kb

input:

10
550
0 0 1 0
0 0 0 1
1070451 -76747419 -475756 34109964
39212129 -40187389 32082651 -32880591
-42770825 49053520 -51324990 58864224
301020 -10533714 602040 -21067428
-55137616 74952624 -24122707 32791773
1629975 -29851650 -478126 8756484
80523100 20960200 -77302176 -20121792
-64028006 61179727 -18...

output:

Yes
No
No
Yes
Yes
No
Yes
No
Yes
No
No
Yes
Yes
Yes
Yes
Yes
No
Yes
No
No
Yes
Yes
Yes
No
Yes
No
No
Yes
Yes
Yes
Yes
No
Yes
No
No
No
No
No
Yes
Yes
No
No
No
Yes
Yes
Yes
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
No
Yes
Yes
Yes
Yes
No
Yes
No
Yes
Yes
Yes
No
No
Yes
Yes
Yes
No
No
No
Yes
No
Yes
Ye...

result:

ok 12244 token(s): yes count is 6128, no count is 6116

Test #3:

score: 0
Accepted
time: 110ms
memory: 3892kb

input:

100
2000
0 0 1 0
0 0 0 1
-84998108 27087723 -78459792 25004052
-63732795 -93286980 29741971 43533924
88160702 10753904 -94457895 -11522040
-57759240 -99131840 25991658 44609328
-35408095 31386545 -92061047 81605017
21178080 37382229 32943680 58150134
-57187533 84956404 -17596164 26140432
38432164 17...

output:

No
No
No
Yes
Yes
Yes
No
Yes
No
No
Yes
No
No
No
Yes
No
No
Yes
No
Yes
No
No
No
No
No
No
Yes
No
Yes
No
Yes
Yes
Yes
Yes
No
No
No
Yes
Yes
No
Yes
Yes
Yes
Yes
Yes
No
Yes
No
Yes
No
Yes
Yes
No
Yes
No
Yes
Yes
No
No
Yes
Yes
Yes
Yes
No
No
No
Yes
No
No
No
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
Yes
Yes
Yes
N...

result:

ok 200000 token(s): yes count is 100141, no count is 99859

Test #4:

score: -100
Wrong Answer
time: 581ms
memory: 3816kb

input:

90
1025
0 0 1 0
0 0 0 1
-8716657 -748858 12990792 -22456307
-13593063 -23283552 -46628353 -23283552
93002789 28574481 93002789 78693002
-16042487 47828662 -30013237 61799412
43359811 68260568 43359811 -75987953
-94388305 52022201 -94388305 8537759
-6363687 -1383673 -6363687 -20211179
-29739675 -2602...

output:

Yes
No
No
No
Yes
No
Yes
Yes
No
Yes
No
No
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
No
No
No
No
Yes
Yes
Yes
No
No
No
Yes
Yes
Yes
No
No
No
No
Yes
Yes
Yes
No
No
Yes
Yes
No
No
Yes
Yes
Yes
No
Yes
No
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
No
No
Yes
No
Yes
No
N...

result:

wrong answer expected YES, found NO [5999th token]