Codeforces Round #720 (Div. 2)Codeforces-1521ABC
Posted JophieQu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #720 (Div. 2)Codeforces-1521ABC相关的知识,希望对你有一定的参考价值。
前半场断网,后半场疯狂wa。真·自闭场,我太菜了。
A. Nastia and Nearly Good Numbers
显然先特判B=1
构造
k
1
∗
A
∗
B
=
k
2
∗
A
+
k
3
∗
A
k_1*A*B=k_2*A+k_3*A
k1∗A∗B=k2∗A+k3∗A
化简
k
1
∗
B
=
k
2
+
k
3
k_1*B=k_2+k_3
k1∗B=k2+k3,其中
k
2
!
=
k
3
k_2!=k_3
k2!=k3且
k
2
、
k
3
k_2、k_3
k2、k3与B互质。
我们令
k
1
k_1
k1为1,再令
k
2
=
B
−
1
,
k
3
=
1
k_2=B-1,k_3=1
k2=B−1,k3=1。显然的,当B=2时
k
2
k_2
k2只能取
k
4
∗
B
−
1
k_4*B-1
k4∗B−1,其中
k
4
≥
2
k_4\\geq2
k4≥2。
构造方法还有很多。比赛的时候脑抽了,总觉得怪怪的,想再hack自己的答案。我好sb。。。
void solves(){
ll a,b;cin>>a>>b;
if(b>2){
cout<<"YES\\n";
cout<<1LL*a*(b-1)<<" "<<a<<" "<<1LL*a*b<<endl;
} else if(b==2){
b*=2;
cout<<"YES\\n";
cout<<1LL*a*(b-1)<<" "<<a<<" "<<1LL*a*b<<endl;
} else{
cout<<"NO\\n";
}
}
B. Nastia and a Good Array
一开始是想着
k
∗
m
i
n
(
a
[
i
]
,
a
[
i
−
1
]
)
−
1
k*min(a[i],a[i-1])-1
k∗min(a[i],a[i−1])−1与
m
i
n
(
a
[
i
]
,
a
[
i
−
1
]
)
min(a[i],a[i-1])
min(a[i],a[i−1])互质,然后随便rand一个k。但rand的偶然性还是比较大,从左遍历到右对相邻的数进行修改的话,难免还是会影响到已经修改好的数组。
有一个不讲武德的解法。先找到数组中最小值的坐标,再把除掉最小值的其他n-1个数全部交替修改成两个很大的质数即可。
由于
a
i
≤
1
0
9
a_i\\leq10^9
ai≤109且
x
,
y
≤
2
∗
1
0
9
x,y\\leq2*10^9
x,y≤2∗109,那么只要任意找两个处于(1e9,2*1e9)之间的质数即可。
void solves(){
ll pri1=1e9+7,pri2=1e9+9;
int n;cin>>n;
int max=1e9+1,idx=0;//数据卡得很毒,max初始化一定要>1e9
for(int i=1;i<=n;++i){
cin>>a[i];
if(a[i]<max){
max=a[i];
idx=i;
}
}
cout<<n-1<<endl;
for(int i=1;i<=n;++i){
if(i==idx)continue;
if(i&1){
a[i]=pri1;
cout<<i<<" "<<idx<<" "<<a[i]<<" "<<a[idx]<<endl;
} else{
a[i]=pri2;
cout<<i<<" "<<idx<<" "<<a[i]<<" "<<a[idx]<<endl;
}
}
}
C. Nastia and a Hidden Permutation
我们先确定整个数组中最大值的位置。
我们令
v
a
l
=
m
a
x
(
m
i
n
(
n
−
1
,
p
i
)
,
m
i
n
(
n
,
p
j
)
)
val=max(min(n-1,p_i),min(n,p_j))
val=max(min(n−1,pi),min(n,pj)),当
v
a
l
=
n
val=n
val=n时显然有
p
j
=
n
p_j=n
pj=n。特别的,当
v
a
l
=
n
−
1
val=n-1
val=n−1时,
p
i
p_i
pi有可能等于n,此时需要交换
p
i
p_i
pi和
p
j
p_j
pj的位置来再次确定是
p
j
=
n
−
1
p_j=n-1
pj=n−1还是
p
i
=
n
p_i=n
pi=n。
我们可以由此在最多
⌊
n
2
⌋
+
1
\\lfloor \\frac {n} {2} \\rfloor +1
⌊2n⌋+1次查询中寻找到最大值n的下标,设其为maxidx。
然后我们再令
v
a
l
u
e
=
m
i
n
(
m
a
x
(
1
,
p
i
)
,
m
a
x
(
2
,
p
m
a
x
i
d
x
)
)
value=min(max(1,p_i),max(2,p_{maxidx}))
value=min(max(1,pi),max(2,pmaxidx)),显然的,
v
a
l
u
e
=
p
i
value=p_i
value=pi。于是我们可以在
n
−
1
n-1
n−1次查询中得到剩下的排列。
理论上查询次数不会超过
⌊
3
n
2
⌋
\\lfloor \\frac {3n} {2} \\rfloor
⌊23n⌋。
const int N=1e4+7;
int p[N];
int n;
int ask(int t,int i,int j,int x){
cout<<"? "<<t<<" "<<i<<" "<<j<<" "<<x<<endl<<endl;
int val;cin>>val;
return val;
}
void solves(){
cin>>n;
cin.ignore();
memset(p,0,sizeof(p));
int idx;
for(int i=1;i<=n;i+=2){
if(n&1 && i==n){
p[i]=n;idx=i;break;
}以上是关于Codeforces Round #720 (Div. 2)Codeforces-1521ABC的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #720 (Div. 2)Codeforces-1521ABC
Codeforces Round #720 (Div. 2) ABCDE题解
Codeforces Round #720 (div2) AB
Codeforces Round #720 (Div. 2), B. Nastia and a Good Array
Codeforces Round #720 (Div. 2) A. Nastia and Nearly Good Num