T1
大意:已知形如
(
x
−
a
1
)
b
1
×
(
x
−
a
2
)
b
2
×
(
x
−
a
3
)
b
3
×
⋯
×
(
x
−
a
n
)
b
n
<
0
(x-a_1)^{b_1}\times (x-a_2)^{b_2}\times (x-a_3)^{b_3}\times \dots \times(x-a_n)^{b_n}<0
(x−a1)b1×(x−a2)b2×(x−a3)b3×⋯×(x−an)bn<0
的不等式,给出长度为
n
n
n的
a
a
a、
b
b
b两个数组,求满足该不等式的解集。
无解输出NO ANSWER
MIND
赛时
既然偶次幂的结果一定
≥
0
\ge0
≥0(注意后面要考),所以我们可以先不管偶次幂,把奇次幂的
a
i
a_i
ai提出来放进一个新数组
c
u
r
[
]
cur[\;]
cur[]里,然后再进行升序排序,最后类似在数轴上确定。只是要判断一下结果为负的幂的数量为奇即可。
赛后
听了出题人讲完后,不是很理解穿根法。所以我在想我赛时思路为什么挂了。
“既然偶次幂的结果一定 ≥ 0 \ge0 ≥0……”
是的。偶次幂的结果不能为 0 0 0,否则整个不等式左边为 0 0 0,不等式明显不成立。而我代码中就对偶次幂没有任何处理,所以挂了。所以我们还要判断一下偶次幂不能为 0 0 0。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,o,p) for(ll i=o;i<=p;++i)
#define pr(i,o,p) for(ll i=o;i>=p;--i)
const ll MAXN=1e5+5,INF=1e16;
ll n;
ll ter[MAXN];
ll ans,tl;
pair<ll,ll> Ans[MAXN],a[MAXN];
struct node
{
ll num,ix;
}cur[MAXN];
bool cmp(node aa,node bb)
{
if(aa.num!=bb.num)
return aa.num<bb.num;
return aa.ix<bb.ix;
}
bool cnp(pair<ll,ll> aa,pair<ll,ll> bb)
{
if(aa.first!=bb.first)
return aa.first<bb.first;
return aa.second<bb.second;
}
int main()
{
scanf("%lld",&n);
rp(i,1,n) scanf("%lld",&a[i].first);
rp(i,1,n) scanf("%lld",&a[i].second);
bool isok=0;
rp(i,1,n) if(a[i].second&1) isok=1;
if(!isok)
return puts("NO ANSWER"),0;
sort(a+1,a+n+1,cnp);
ll hd=0;
rp(i,1,n)
{
if(a[i].second&1)
{
cur[++hd]={a[i].first,i};
}
else
{
ter[++tl]=a[i].first;
}
}
sort(cur+1,cur+hd+1,cmp);
sort(ter+1,ter+tl+1);
if(hd&1)
{
a[0].first=-INF;
rp(j,0,cur[1].ix-1)
{
Ans[++ans].first=a[j].first;
Ans[ans].second=a[j+1].first;
}
for(ll i=3;i<=hd;i+=2)
{
rp(j,cur[i-1].ix,cur[i].ix-1)
{
Ans[++ans].first=a[j].first;
Ans[ans].second=a[j+1].first;
}
}
}
else
{
for(ll i=2;i<=hd;i+=2)
{
rp(j,cur[i-1].ix,cur[i].ix-1)
{
Ans[++ans].first=a[j].first;
Ans[ans].second=a[j+1].first;
}
}
}
if(!ans)
puts("NO ANSWER");
else
{
printf("%lld\n",ans);
rp(i,1,ans)
{
if(Ans[i].first==-INF)
printf("-INF<");
else
printf("%lld<",Ans[i].first);
printf("x<%lld\n",Ans[i].second);
}
}
return 0;
}