QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#241018 | #964. Excluded Min | Thankto_zy6 | WA | 10ms | 14036kb | C++14 | 3.4kb | 2023-11-05 21:57:42 | 2023-11-05 21:57:43 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int l[200005],r[200005];
int ans[200005];
const int INF=1<<28;
const int N=200000;
struct point{
int x[2];
int id;
bool operator == (point y)const{
return y.x[0]==x[0]&&y.x[1]==x[1];
}
}p[200005],g[200005];
bool cmp1(point x,point y)
{
return x.x[0]<y.x[0]||x.x[0]==y.x[0]&&x.x[1]<y.x[1];
}
bool cmp2(point x,point y)
{
return x.x[1]<y.x[1]||x.x[1]==y.x[1]&&x.x[0]<y.x[0];
}
int _x;
namespace edge{
int he[200005],to[200005],ne[200005],cnt;
void link(int x,int y)
{
cnt++;
to[cnt]=y;
ne[cnt]=he[x];
he[x]=cnt;
}
}
namespace star{
int he[200005],to[200005],ne[200005],cnt;
void link(int x,int y)
{
cnt++;
to[cnt]=y;
ne[cnt]=he[x];
he[x]=cnt;
}
}
namespace KDT{
struct node{
int fl;
int lx,rx,ly,ry,dep;
int mx,tag;
int ls,rs;
void make(int _l,int _r,int _s,int _t,int _d){lx=_l;rx=_r;ly=_s;ry=_t;dep=_d;}
}tr[4000005];
void add_tag(int k,int val)
{
tr[k].mx+=val;
tr[k].tag+=val;
}
void pushdown(int k)
{
if(tr[k].ls)add_tag(tr[k].ls,tr[k].tag);
if(tr[k].rs)add_tag(tr[k].rs,tr[k].tag);
tr[k].tag=0;
}
void pushup(int k)
{
tr[k].mx=max(tr[tr[k].ls].mx,tr[tr[k].rs].mx);
}
int tot;
int build(int l,int r,int d)
{
int mid=(l+r)>>1,no=++tot;
tr[no].dep=d;
tr[no].fl=-1;
if(l==r)
{
tr[no].make(p[l].x[0],p[l].x[0],p[l].x[1],p[l].x[1],d);
tr[no].fl=p[l].id;
return no;
}
if(d&1)
{
nth_element(p+l,p+mid,p+r+1,cmp1);
tr[no].ls=build(l,mid,d+1);
tr[no].rs=build(mid+1,r,d+1);
}
else
{
nth_element(p+l,p+mid,p+r+1,cmp2);
tr[no].ls=build(l,mid,d+1);
tr[no].rs=build(mid+1,r,d+1);
}
tr[no].lx=min(tr[tr[no].ls].lx,tr[tr[no].rs].lx);
tr[no].rx=max(tr[tr[no].ls].rx,tr[tr[no].rs].rx);
tr[no].ly=min(tr[tr[no].ls].ly,tr[tr[no].rs].ly);
tr[no].ry=max(tr[tr[no].ls].ry,tr[tr[no].rs].ry);
pushup(no);
return no;
}
bool outof(int a,int b,int c,int d)
{
return (b<c)||(a>d);
}
void modify(int k,int lx,int rx,int ly,int ry,int v)
{
if(outof(tr[k].lx,tr[k].rx,lx,rx)||outof(tr[k].ly,tr[k].ry,ly,ry))return;
if(lx<=tr[k].lx&&tr[k].rx<=rx&&ly<=tr[k].ly&&tr[k].ry<=ry)
{
add_tag(k,v);
return;
}
pushdown(k);
if(tr[k].ls)modify(tr[k].ls,lx,rx,ly,ry,v);
if(tr[k].rs)modify(tr[k].rs,lx,rx,ly,ry,v);
pushup(k);
}
bool search(int k)
{
if(tr[k].fl!=-1)
{
if(tr[k].mx>=_x)
{
for(int i=star::he[tr[k].fl];i;i=star::ne[i])
{
ans[star::to[i]]=_x;
}
tr[k].mx=-INF;
return true;
}
return false;
}
pushdown(k);
bool ret;
if(tr[tr[k].ls].mx>=tr[tr[k].rs].mx)
{
ret=search(tr[k].ls);
}
else
{
ret=search(tr[k].rs);
}
pushup(k);
return ret;
}
}
int main()
{
int n,m,q=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
edge::link(a[i],i);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l[i],&r[i]);
g[i]={{l[i],r[i]},i};
}
sort(g+1,g+1+m,cmp1);
for(int i=1;i<=m;i++)
{
if(!(g[i]==g[i-1]))
{
q++;
p[q]={{l[i],r[i]},q};
}
star::link(q,i);
}
int rt=KDT::build(1,q,1);
for(int i=1;i<=n;i++)KDT::modify(rt,1,i,i,n,1);
_x=N+1;
while(_x>=0)
{
for(int i=edge::he[_x];i;i=edge::ne[i])
{
int j=edge::to[i];
KDT::modify(rt,1,j,j,n,-1);
}
while(KDT::search(rt));
_x--;
}
for(int i=1;i<=m;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 4ms
memory: 9832kb
input:
3 3 0 0 2 1 3 2 3 3 3
output:
3 1 0
result:
ok 3 number(s): "3 1 0"
Test #2:
score: 0
Accepted
time: 0ms
memory: 9996kb
input:
3 2 1 2 2 1 2 1 3
output:
0 3
result:
ok 2 number(s): "0 3"
Test #3:
score: 0
Accepted
time: 5ms
memory: 9996kb
input:
10 10 3 0 3 3 9 7 9 6 0 7 3 3 9 9 4 6 1 9 3 4 2 4 7 10 3 7 5 7 2 7
output:
0 1 0 5 0 1 1 0 0 1
result:
ok 10 numbers
Test #4:
score: 0
Accepted
time: 5ms
memory: 14036kb
input:
10 10 3 0 0 0 5 1 1 1 2 1 1 2 8 8 5 7 1 7 2 2 1 5 5 6 4 6 3 10 6 8
output:
1 0 2 7 1 4 0 2 8 3
result:
ok 10 numbers
Test #5:
score: 0
Accepted
time: 4ms
memory: 7696kb
input:
100 100 15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90 1...
output:
68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 100 numbers
Test #6:
score: -100
Wrong Answer
time: 10ms
memory: 9804kb
input:
100 100 17 86 33 8 11 27 8 11 13 9 3 43 11 23 26 42 44 12 44 12 15 0 75 51 72 5 49 2 40 57 24 47 39 42 4 5 6 52 3 2 42 19 62 33 24 22 16 69 4 33 44 70 29 11 2 2 58 9 6 10 25 10 33 26 17 3 14 0 48 7 48 51 0 39 54 37 14 9 3 85 18 4 25 9 2 0 39 8 17 13 25 45 10 39 12 18 9 5 66 6 13 89 10 90 42 67 43 52...
output:
76 80 0 0 18 1 18 1 5 5 1 1 22 11 0 15 0 59 5 56 1 80 0 1 1 21 0 61 22 11 0 3 8 15 40 1 8 81 71 20 2 0 60 0 60 31 0 59 0 0 0 28 0 21 1 7 5 0 31 0 76 28 0 0 27 1 23 0 1 27 1 0 0 1 0 5 63 52 2 43 73 73 86 0 61 0 27 2 30 5 31 1 0 14 59 27 1 1 67 63
result:
wrong answer 82nd numbers differ - expected: '1', found: '73'