A nona competição provincial
texto
Polilinha espiral
Descrição do tópico
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
输入格式
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
输出格式
输出dis(X, Y)
样例输入
0 1
样例输出
3
Ideias e códigos de tópicos
Ideia: Desde que se encontre a lei de coordenadas de todos os pontos no eixo Y (chamado ponto-chave horizontal), ou seja, a distância até a mesma linha horizontal onde o ponto está localizado também pode ser encontrada.
当y > 0 时:
当abs(x) <= y时,dis(0 , y)=3 * y + (y * y - y) / 2 * 8,所以dis(x , y)=dis(0 , y) + x;
当abs(x) > 时, x > 0时,dis(x , y) = dis(0 , x) + 2 * x - y。
x < 0时,dis(x , y) = dis(0 ,-x) + 2 * x + y。
当y <= 0时:
当y-1 <= x <= -y 时,dis(0 , -y) = 7 * -y + (y * y + y)/2 * 8,所以dis(x , y) =dis(0 , y) - x;
当x >- y 或 x< y - 1时,x > 0 时,dis(x,y) = dis(0 , x) - 2 * x - y。
x < 0 时,dis(x,y) = dis(0 , -x - 1) - 2 * x + y - 1。
Código:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
const ll maxn=1e3+10;
ll x,y;
int main(){
cin>>x>>y;
ll n=max(abs(x),abs(y));
ll dx=-n,dy=-n;
ll ans=0;
ans=n*(n-1)*4;
if(y==-n){
ans+=3*n*2+n-x;
}
if(y==n){
ans+=2*n+x+n;
}
if(x==-n){
ans+=n+y;
}
if(x==n){
ans+=n*2*2+n-y;
}
cout<<ans;
return 0;
}
produto máximo
Descrição do tópico
给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。
注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
即:0-((0-x) % 1000000009)
输入格式
第一行包含两个整数N和K。
以下N行每行一个整数Ai。
对于40%的数据,1 <= K <= N <= 100
对于60%的数据,1 <= K <= 1000
对于100%的数据,1 <= K <= N <= 100000 -100000 <= Ai <= 100000
输出格式
一个整数,表示答案。
样例输入
5 3
-100000
-10000
2
100000
10000
样例输出
999100009
再例如:
样例输入
5 3
-100000
-100000
-2
-100000
-100000
样例输出
-999999829
Ideias e códigos de tópicos
Primeiro classifique de acordo com o valor absoluto do maior para o menor
①Se deve haver 0 nos k números selecionados, o resultado é 0
②Se todos forem números negativos, então se k for um número par, você pode selecionar os primeiros k números, se k é números ímpares, você só pode selecionar k números do início pequeno.
③Se todos forem números positivos, você pode selecionar os primeiros k números.
④Se houver números positivos e negativos, então
- Se os primeiros k números tiverem um número par de números negativos, selecione os primeiros k números
- Se os primeiros k números tiverem um número ímpar de números negativos, podemos ver se podemos escolher um grande número positivo do verso para trocar com o pequeno número negativo na frente ou escolher um grande número negativo do verso para trocar com o pequeno número positivo na frente, e pegamos o resultado dos dois. Grande.
Neste ponto, se o resultado ainda for negativo após todos os casos serem divididos, verificamos se a entrada tem 0, e o resultado é 0 se houver zero , caso contrário, apenas esse número negativo pode ser gerado.
código
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
const ll maxn=1e5+10;
const ll mod=1000000009;
ll n;
ll a[maxn];
ll k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
if(n==k){
ll res=1;
for(int i=1;i<=n;i++){
res=res*a[i]%mod;
}
cout<<res;
return 0;
}
if(a[n]<0){
if(k&1){
ll res=1;
for(int i=n-k+1;i<=n;i++){
res=res*a[i]%mod;
}
cout<<res<<endl;
}
else{
ll res=1;
for(int i=1;i<=k;i++){
res=res*a[i]%mod;
}
cout<<res<<endl;
}
return 0;
}
ll l=1,r=n;
ll res=1;
if(k&1){
res=a[r];
r--;
k--;
//if(res<0)sign=-1;
}
while(k){
ll x=(ll)a[r]*a[r-1],y=(ll)a[l]*a[l+1];
if(x>=y){
r-=2;
res=x%mod*res%mod;//先对x进行取模,在对乘积结果进行取模,原因是x也是乘积结果如果不取模乘上的结果不对
}
else{
l+=2;
res=y%mod*res%mod;//先对y进行取模,在对乘积结果进行取模
}
k-=2;
}
cout<<res;
return 0;
}
Incrementando triplos
Descrição do tópico
给定三个整数数组
A = [A1, A2, ... AN],
B = [B1, B2, ... BN],
C = [C1, C2, ... CN],
请你统计有多少个三元组(i, j, k) 满足:
1. 1 <= i, j, k <= N
2. Ai < Bj < Ck
输入格式
第一行包含一个整数N。
第二行包含N个整数A1, A2, ... AN。
第三行包含N个整数B1, B2, ... BN。
第四行包含N个整数C1, C2, ... CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000
输出格式
一个整数表示答案
样例输入
3
1 1 1
2 2 2
3 3 3
样例输出
27
Ideias e códigos de tópicos
Ideia: você pode classificar os três arrays primeiro, depois percorrer o array b para descobrir quantos do array a são menores que b[i] e quantos do array c são maiores que b[i]
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
const ll maxn=1e5+10;
const ll mod=1000000009;
ll n;
ll a[maxn],b[maxn],c[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
cin>>c[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
sort(c+1,c+1+n);
ll sum=0;
for(int i=1;i<=n;i++){
ll x=lower_bound(a+1,a+1+n,b[i])-a;
ll y=upper_bound(c+1,c+1+n,b[i])-c;
sum=sum+(x-1)*(n-y+1);
//cout<<x<<" "<<y<<endl;
}
cout<<sum;
return 0;
}
Epílogo
"Se você está indeciso, pode perguntar à brisa da primavera, e se a brisa da primavera não falar, você seguirá seu coração" significa: se você está hesitante sobre algo, pergunte à brisa da primavera como fazê-lo. . "Se você está indeciso, pode perguntar à brisa da primavera. Se a brisa da primavera não falar, você seguirá seu coração." A frase vem do "Jianlai" escrito pelo escritor da Internet "Fenghuo Opera Princes". é: "Se você está indeciso, pode pedir à brisa da primavera. Siga seu coração".