QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#376560#868. Friendship CirclesschrodingerstomWA 1ms9948kbC++144.3kb2024-04-04 11:51:392024-04-04 11:51:40

Judging History

This is the latest submission verdict.

  • [2024-04-04 11:51:40]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 9948kb
  • [2024-04-04 11:51:39]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
bool memBeg;
template<typename T,typename TT> void chkmin(T &x,TT y) {if(x>y) x=y;}
template<typename T,typename TT> void chkmax(T &x,TT y) {if(x<y) x=y;}
constexpr int mod=998244353;
void inc(int &x,int y) {x+=y; x-=(x>=mod)*mod;}
void dec(int &x,int y) {x-=y; x+=(x<0)*mod;}
constexpr int add(int x,int y) {return (x+y>=mod)?x+y-mod:x+y;}
constexpr int sub(int x,int y) {return (x<y)?x-y+mod:x-y;}
constexpr int quick_pow(int x,ll times,int ret=1) {
    for(;times;times>>=1,x=1ll*x*x%mod) if(times&1) ret=1ll*ret*x%mod;
    return ret;
}
constexpr int maxn=1e5+10;
constexpr int inf=0x3f3f3f3f;
constexpr ld eps=1e-10;
struct vector2 {
    ld x,y;
    vector2() {}
    vector2(ld _x,ld _y): x(_x),y(_y) {}
    vector2 operator+(const vector2 &o) const {return vector2(x+o.x,y+o.y);}
    vector2 operator-(const vector2 &o) const {return vector2(x-o.x,y-o.y);}
    vector2 operator~() const {return vector2(-y,x);}
    vector2 operator*(ld o) const {return vector2(x*o,y*o);}
    friend vector2 operator*(const ld &u,const vector2 &v) {return v*u;}
    vector2 operator/(ld o) const {return vector2(x/o,y/o);}
    friend ld dot(const vector2 &u,const vector2 &v) {return u.x*v.x+u.y*v.y;}
    friend ld cross(const vector2 &u,const vector2 &v) {return u.x*v.y-u.y*v.x;}
}pt[maxn];
struct ray {
    vector2 o,d;
    ray() {}
    ray(const vector2 &_o,const vector2 &_d): o(_o),d(_d) {}
    friend vector2 inter(const ray &u,const ray &v) {
        ld x=cross(v.o-u.o,v.d)/cross(u.d,v.d);
        return u.o+x*u.d;
    }
    void print() const {
        if(fabs(d.x)<eps) {
            printf("x = %Lf",o.x);
        } else {
            vector2 u=o,v=o+d;
            printf("y = %Lf * (x - %Lf) / (%Lf - %Lf) + %Lf * (x - %Lf) / (%Lf - %Lf)",
                    v.y,u.x,v.x,u.x,u.y,v.x,u.x,v.x);
        }
    }
    void println(char c='\n') const {
        print(); putchar(c);
    }
}ln[maxn];
int n,ord[maxn],que[maxn];
ld Arg[maxn];
vector2 it[maxn];
void mian() {
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%Lf%Lf",&pt[i].x,&pt[i].y);
    for(int i=1;i<n;i++) ln[i]=ray((pt[0]+pt[i])/2.0L,~(pt[i]-pt[0]));
    int top=n+3;
    ln[n]=ray(vector2(-inf,-inf),vector2(1,0));
    ln[n+1]=ray(vector2(inf,-inf),vector2(0,1));
    ln[n+2]=ray(vector2(inf,inf),vector2(-1,0));
    ln[n+3]=ray(vector2(-inf,inf),vector2(0,-1));
    iota(ord+1,ord+top+1,1);
    for(int i=1;i<=top;i++) Arg[i]=atan2l(ln[i].d.y,ln[i].d.x);
    sort(ord+1,ord+top+1,[&](int u,int v) {
        if(fabs(Arg[u]-Arg[v])<eps) {
            return cross(ln[u].o-ln[v].o,ln[v].d)<0.0L;
        } else return Arg[u]<Arg[v];
    });
    // for(int i=1;i<=top;i++) ln[ord[i]].println();
    int tead=0,rail=0;
    for(int i=1;i<=top;i++) {
        // if(i>1&&fabs(Arg[ord[i]]-Arg[ord[i-1]])<eps) continue;
        if(rail-tead<=1) {
            que[rail++]=ord[i];
            if(rail-tead>=2) it[rail-2]=inter(ln[que[rail-2]],ln[que[rail-1]]);
        } else {
            while(rail-tead>1&&cross(it[rail-2]-ln[ord[i]].o,ln[ord[i]].d)>0.0L) rail--;
            while(rail-tead>1&&cross(it[tead]-ln[ord[i]].o,ln[ord[i]].d)>0.0L) tead++;
            que[rail++]=ord[i];
            it[rail-2]=inter(ln[que[rail-2]],ln[que[rail-1]]);
            if(rail-tead>=3&&cross(it[rail-2]-ln[que[rail-3]].o,ln[que[rail-3]].d)>0.0L) rail--;
        }
        // printf("----------i = %d, ord = %d------------:\n",i,ord[i]);
        // printf("ln[2] = ((%Lf, %Lf), (%Lf, %Lf))\n",ln[2].o.x,ln[2].o.y,ln[2].d.x,ln[2].d.y);
        // for(int j=tead;j<rail;j++) ln[que[j]].println();
    }
    // puts("");
    while(rail-tead>1&&cross(it[rail-2]-ln[que[tead]].o,ln[que[tead]].d)>0.0L) rail--;
    // for(int j=tead;j<rail;j++) ln[que[j]].println();
    assert(rail-tead>2);
    vector<int> ret;
    for(int i=tead;i<rail;i++) if(que[i]<n) ret.emplace_back(que[i]);
    printf("%d ",(int)ret.size());
    sort(ret.begin(),ret.end());
    for(int v:ret) printf("%d ",v); puts("");
}
bool memEn;
void fl() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}
int main() {
    fprintf(stderr,"%.24lf\n",fabs(&memEn-&memBeg)/1024.0/1024.0);
    // fl();
    int _; scanf("%d",&_);
    while(_--) mian();
    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 9948kb

input:

2
4
1 0
3 1
3 -2
7 0
5
0 0
-2 -1
2 2
-2 10
-1 11

output:

2 2 3 
3 1 2 3 

result:

wrong answer 2nd numbers differ - expected: '1', found: '2'