QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#670660#9161. Naval battleRDFZchenyy6 2ms18004kbC++146.2kb2024-10-23 22:48:512024-10-23 22:49:02

Judging History

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

  • [2024-10-23 22:49:02]
  • 评测
  • 测评结果:6
  • 用时:2ms
  • 内存:18004kb
  • [2024-10-23 22:48:51]
  • 提交

answer

#include<bits/stdc++.h>

#define ls (id<<1)
#define rs ((id<<1)|1)

#define MAXN 200005
#define MAXSZ 600005

const int mv=2000000001;

struct Crash{
    int t;
    int xp,yp;

    friend bool operator<(Crash a,Crash b){
        return a.t>b.t;
    }
};
struct Node{
    int pl,pr;
    int px,py;
    int s;
};

int n;
int u[MAXN],v[MAXN]; char c[MAXN];
int rk[MAXSZ]; int ans[MAXN];
int typ[MAXSZ];
int p[MAXSZ],pos[MAXSZ],pl[MAXSZ],pr[MAXSZ];
Node t[MAXSZ<<2];
std::priority_queue<Crash> pq;
std::set<int> upd,us; int lst=0;

Node merge(Node a,Node b){
    Node res;
    if(a.pl+1) res.pl=a.pl;
    else res.pl=b.pl;
    if(b.pr+1) res.pr=b.pr;
    else res.pr=a.pr;
    int v=mv;
    if((a.pr+1)&&(b.pl+1)){
        v=p[b.pl]-p[a.pr];
        res.px=a.pr,res.py=b.pl;
    }
    if(a.s<b.s){
        if(a.s<v) v=a.s,res.px=a.px,res.py=a.py;
    }else if(b.s<v) v=b.s,res.px=b.px,res.py=b.py;
    res.s=v;
    return res;
}
void build(int id,int l,int r){
    if(l==r){
        if(typ[l]==1) t[id].px=t[id].py=t[id].pl=-1,t[id].pr=l,t[id].s=mv;
        else t[id].px=t[id].py=t[id].pr=-1,t[id].pl=l,t[id].s=mv;
        return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid),build(rs,mid+1,r);
    t[id]=merge(t[ls],t[rs]);
    return;
}
void del(int id,int l,int r,int pos){
    if(l==r) t[id].px=t[id].py=t[id].pl=t[id].pr=-1,t[id].s=mv;
    else{
        int mid=(l+r)>>1;
        if(pos<=mid) del(ls,l,mid,pos);
        else del(rs,mid+1,r,pos);
        t[id]=merge(t[ls],t[rs]);
    }
    return;
}
Node query(int id,int l,int r,int tl,int tr){
    if(tl<=l&&r<=tr) return t[id];
    int mid=(l+r)>>1;
    if(tr<=mid) return query(ls,l,mid,tl,tr);
    else if(tl>mid) return query(rs,mid+1,r,tl,tr);
    else return merge(query(ls,l,mid,tl,tr),query(rs,mid+1,r,tl,tr));
}

int read(){
    int res=0; char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') res=(res<<3)+(res<<1)+(c^48),c=getchar();
    return res;
}
char readL(){
    char c=getchar();
    while(c<'A'||c>'Z') c=getchar();
    return c;
}

bool chk(int x,char a,char b){
    return c[x]==a||c[x]==b;
}

bool cmp1(int x,int y){
    if(chk(x,'N','W')^chk(y,'N','W')) return chk(x,'N','W');
    else if(u[x]+v[x]!=u[y]+v[y]) return u[x]+v[x]<u[y]+v[y];
    else return u[x]<u[y];
}
bool cmp2(int x,int y){
    if(chk(x,'N','E')^chk(y,'N','E')) return chk(x,'N','E');
    else if(u[x]-v[x]!=u[y]-v[y]) return u[x]-v[x]<u[y]-v[y];
    else return u[x]<u[y];
}
bool cmp3(int x,int y){
    if(chk(x,'N','S')^chk(y,'N','S')) return chk(x,'N','S');
    else{
        if(chk(x,'N','S')){
            if(u[x]!=u[y]) return u[x]<u[y];
            else return v[x]<v[y];
        }else{
            if(v[x]!=v[y]) return v[x]<v[y];
            else return u[x]<u[y];
        }
    }
}

int main(){
    n=read();
    for(int i=1;i<=n;i++) u[i]=read(),v[i]=read(),c[i]=readL();
    for(int i=1;i<=n;i++) rk[n+n+i]=rk[n+i]=rk[i]=i;
    std::sort(rk+1,rk+n+1,cmp1); 
    std::sort(rk+n+1,rk+n+n+1,cmp2);
    std::sort(rk+n+n+1,rk+n+n+n+1,cmp3);
    for(int i=1;i<=n;i++){
        if(chk(rk[i],'N','W')){
            if(i==1) pl[1]=1;
            else if(u[rk[i]]+v[rk[i]]==u[rk[i-1]]+v[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='N'?1:-1); pos[rk[i]]=i; p[i]=u[rk[i]]-v[rk[i]];
        }else{
            if(i==1) pl[1]=1;
            else if(chk(rk[i-1],'N','W')) pl[i]=i;
            else if(u[rk[i]]+v[rk[i]]==u[rk[i-1]]+v[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='E'?1:-1); pos[rk[i]]=i; p[i]=u[rk[i]]-v[rk[i]];
        }
    }
    for(int i=n+1;i<=2*n;i++){
        if(chk(rk[i],'N','E')){
            if(i==n+1) pl[n+1]=n+1;
            else if(u[rk[i]]-v[rk[i]]==u[rk[i-1]]-v[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='E'?1:-1); pos[rk[i]+n]=i,p[i]=u[rk[i]]+v[rk[i]];
        }else{
            if(i==n+1) pl[n+1]=n+1;
            else if(chk(rk[i],'N','E')) pl[i]=i;
            else if(u[rk[i]]-v[rk[i]]==u[rk[i-1]]-v[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='S'?1:-1); pos[rk[i]+n]=i,p[i]=u[rk[i]]+v[rk[i]];
        }
    }
    for(int i=2*n+1;i<=3*n;i++){
        if(chk(rk[i],'N','S')){
            if(i==2*n+1) pl[2*n+1]=2*n+1;
            else if(u[rk[i]]==u[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='D'?1:-1); pos[rk[i]+n*2]=i,p[i]=v[rk[i]];
        }else{
            if(i==2*n+1) pl[2*n+1]=2*n+1;
            else if(chk(rk[i],'N','S')) pl[i]=i;
            else if(v[rk[i]]==v[rk[i-1]]) pl[i]=pl[i-1];
            else pl[i]=i;
            typ[i]=(c[rk[i]]=='E'?1:-1); pos[rk[i]+n*2]=i,p[i]=u[rk[i]];
        }
    }
    pr[3*n]=3*n;
    for(int i=3*n-1;i>=1;i--){
        if(pl[i]==pl[i+1]) pr[i]=pr[i+1];
        else pr[i]=i;
    }

    build(1,1,3*n);
    
    for(int i=1;i<=3*n;i++){
        if(pl[i]==i){
            Node d=query(1,1,3*n,pl[i],pr[i]);
            if(d.s!=mv) pq.push((Crash){d.s,d.px,d.py});
        }
    }
    while(!pq.empty()){
        if(pq.top().t>lst){
            us.clear();
            for(int i:upd){
                del(1,1,3*n,pos[i]); del(1,1,3*n,pos[i+n]); del(1,1,3*n,pos[i+2*n]);
                us.insert(pl[i]); us.insert(pl[i+n]); us.insert(pl[i+2*n]);
            }
            for(int i:us){
                Node d=query(1,1,3*n,pl[i],pr[i]);
                if(d.s!=mv) pq.push((Crash){d.s,d.px,d.py});                
            }
            upd.clear();
        }
        bool xok=ans[rk[pq.top().xp]]&&(ans[rk[pq.top().xp]]<pq.top().t);
        bool yok=ans[rk[pq.top().yp]]&&(ans[rk[pq.top().yp]]<pq.top().t);
        if(xok||yok){
            pq.pop(); continue;
        }
        ans[rk[pq.top().xp]]=ans[rk[pq.top().yp]]=pq.top().t;
        del(1,1,3*n,pq.top().xp),del(1,1,3*n,pq.top().yp);
        upd.insert(rk[pq.top().xp]),upd.insert(rk[pq.top().yp]);
        Node d=query(1,1,3*n,pl[pq.top().xp],pr[pq.top().xp]);
        if(d.s!=mv) pq.push((Crash){d.s,d.px,d.py});          
        lst=pq.top().t;
        pq.pop();
    }
    for(int i=1;i<=n;i++){
        if(!ans[i]) std::cout<<i<<'\n';
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 6
Accepted

Test #1:

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

input:

2
675333810 792019962 W
851860476 960355168 W

output:

1
2

result:

ok 

Test #2:

score: 6
Accepted
time: 2ms
memory: 17920kb

input:

2
714148610 688520844 W
359519570 789553998 S

output:

1
2

result:

ok 

Test #3:

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

input:

2
743286406 87591094 E
108453484 326740470 S

output:

1
2

result:

ok 

Test #4:

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

input:

2
629499666 659260200 W
391550936 897208930 N

output:


result:

ok 

Test #5:

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

input:

2
509095668 374922996 W
325521434 191348762 S

output:


result:

ok 

Test #6:

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

input:

2
357656592 713571312 E
456601638 614626266 S

output:


result:

ok 

Test #7:

score: 6
Accepted
time: 2ms
memory: 17880kb

input:

2
353512742 374956722 W
265604916 462864548 N

output:


result:

ok 

Test #8:

score: 6
Accepted
time: 2ms
memory: 17896kb

input:

2
253519292 302668732 E
436627396 119560628 S

output:


result:

ok 

Test #9:

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

input:

2
741954822 709863076 W
516385128 484293380 S

output:

1
2

result:

ok 

Test #10:

score: 6
Accepted
time: 2ms
memory: 15868kb

input:

2
268851874 524109226 E
503673708 758931058 N

output:

1
2

result:

ok 

Test #11:

score: 6
Accepted
time: 1ms
memory: 15868kb

input:

2
629380956 395789270 S
557401140 467769088 E

output:

1
2

result:

ok 

Test #12:

score: 6
Accepted
time: 2ms
memory: 17888kb

input:

2
606361496 587557658 N
667076156 526843000 W

output:

1
2

result:

ok 

Test #13:

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

input:

2
270428340 629167054 N
270428342 179345630 S

output:

1
2

result:

ok 

Subtask #2:

score: 0
Wrong Answer

Test #14:

score: 12
Accepted
time: 2ms
memory: 17956kb

input:

100
32 46 N
8 24 W
74 86 W
2 76 N
90 70 N
34 74 N
4 68 N
42 26 N
66 94 N
28 40 W
96 12 W
82 78 W
54 24 N
36 42 W
92 68 W
0 26 N
14 54 N
94 66 N
26 52 N
66 12 W
72 6 W
64 96 W
6 20 N
4 22 W
26 42 N
40 28 W
70 76 N
18 60 N
62 16 N
30 48 N
36 36 W
42 36 W
52 94 N
62 98 N
0 78 N
70 2 W
28 50 N
80 80 W
8...

output:


result:

ok 

Test #15:

score: 12
Accepted
time: 2ms
memory: 18004kb

input:

100
70 62 N
56 42 N
42 56 W
64 4 N
50 48 W
56 76 N
78 20 W
96 96 W
60 72 N
44 24 N
2 10 N
52 80 W
38 30 N
94 4 W
58 74 W
68 30 W
54 76 N
0 68 N
36 32 N
10 58 W
70 60 W
86 92 N
100 78 W
2 66 W
20 48 N
16 52 N
8 60 N
98 94 N
86 46 W
74 24 W
26 42 W
66 66 W
28 40 W
56 12 W
90 42 W
8 4 W
76 30 W
78 54 W...

output:


result:

ok 

Test #16:

score: 0
Wrong Answer
time: 0ms
memory: 17904kb

input:

100
36 44 E
96 66 E
28 20 E
36 2 E
32 64 W
76 58 E
82 20 E
76 50 E
22 48 W
38 52 E
90 16 N
22 12 W
64 82 S
84 14 E
92 52 E
76 36 E
72 52 N
100 58 S
82 4 E
2 0 N
90 100 E
68 8 S
24 36 S
80 86 W
72 56 W
8 66 W
84 18 S
18 60 N
64 96 E
2 76 S
74 90 E
64 0 S
12 10 S
56 40 S
40 6 S
2 4 S
74 2 S
90 80 N
2 ...

output:

1
2
3
4
5
6
8
10
11
12
13
14
15
17
18
19
20
21
22
23
24
26
28
29
30
31
32
33
35
36
37
39
40
41
42
45
46
47
49
50
51
53
54
55
56
57
58
59
60
61
62
63
64
65
66
68
69
70
71
73
74
76
77
78
79
81
82
83
84
85
86
87
88
89
90
91
92
93
95
96
98
99

result:

FAIL Unexpected end of file - token expected (/var/uoj_data/9161/16.ans)

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%

Subtask #5:

score: 0
Skipped

Dependency #4:

0%

Subtask #6:

score: 0
Time Limit Exceeded

Test #58:

score: 0
Time Limit Exceeded

input:

200000
526715640 430855204 E
731546662 226024182 S
254814720 702756124 E
227354364 730216480 S
764250602 193320242 S
150102088 807468756 E
204858572 752712272 S
635512190 322058654 E
403910248 553660596 S
257917918 4587926 S
949444340 8126504 S
907805098 49765746 S
553836306 403734538 S
40977864 617...

output:


result:


Subtask #7:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%