戳我进入比赛
Problem A. Sort
题目大意
T T T 组,每组给出一个长度为 n n n 的序列 a [ ] a[] a[] 和 整数 k k k.
定义一次操作为将序列 a [ ] a[] a[] 分割成 v i v_i vi 段,再对段做置换 p i p_i pi.
若在有限次数操作中,无法使得序列 a [ ] a[] a[] 变成非降序,则输出 − 2 -2 −2.
若在有限次数操作中,可以使得序列 a [ ] a[] a[] 变成非降序,且 ∑ v i ≤ 3 n \sum{v_i} \leq 3n ∑vi≤3n,则输出方案,否则输出 − 1 -1 −1.
1 ≤ T ≤ 1 0 3 , 1 ≤ k , n ≤ 1 0 3 , 1 ≤ a [ i ] ≤ 1 0 9 , ∑ n ≤ 3 × 1 0 4 1 \leq T \leq 10^3, 1 \leq k,n \leq 10^3,1 \leq a[i] \leq 10^9, \sum{n} \leq 3\times 10^4 1≤T≤103,1≤k,n≤103,1≤a[i]≤109,∑n≤3×104.
分析
不难发现,当 k ≥ 3 k \geq 3 k≥3 时,总可以构造出合法方案,就是一傻逼模拟题(被细节搞炸
当 k = 2 k=2 k=2 时,注意这个样例
2
3 2
1 2 1
2 1 2
代码实现
#include <bits/stdc++.h>
using namespace std;
const int M = (int)1e3;
int n, k;
int a[M + 5];
int b[M + 5];
bool is_sort(int p)
{
for(int i = 1; i < n; ++i)
{
if(a[(i + p - 2) % n + 1] > a[(i + p - 1) % n + 1]) return 0;
}
return 1;
}
void work()
{
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
if(n == 1) printf("0\n");
else if(k == 1)
{
if(is_sort(1)) printf("0\n");
else printf("-2\n");
}
else if(k == 2)
{
if(is_sort(1)) printf("0\n");
else
{
for(int i = 1; i <= n; ++i)
{
if(is_sort(i))
{
printf("1\n");
printf("2\n");
printf("%d %d %d\n", 0, i - 1, n);
printf("2 1\n");
for(int j = 1; j <= n; ++j) b[j] = a[j];
for(int j = 1; j <= n - i + 1; ++j) a[j] = b[j - 1 + i];
for(int j = n - i + 2; j <= n; ++j) a[j] = b[j - n + i - 1];
return;
}
}
printf("-2\n");
}
}
else if(k >= 3)
{
printf("%d\n", n - 1);
for(int i = 1; i < n; ++i)
{
int p = i; for(int j = i; j <= n; ++j) if(a[p] > a[j]) p = j;
if(i == p)
{
printf("2\n");
printf("%d %d %d\n", 0, 1, n);
printf("1 2\n");
}
else if(i == 1)
{
printf("2\n");
printf("%d %d %d\n", 0, p - 1, n);
printf("2 1\n");
for(int j = 1; j <= n; ++j) b[j] = a[j];
for(int j = 1; j <= n - p + 1; ++j) a[j] = b[j + p - 1];
for(int j = n - p + 2; j <= n; ++j) a[j] = b[j - n + p - 1];
}
else
{
printf("3\n");
printf("%d %d %d %d\n", 0, i - 1, p - 1, n);
printf("1 3 2\n");
for(int j = 1; j <= n; ++j) b[j] = a[j];
for(int j = 1; j <= i - 1; ++j) a[j] = b[j];
for(int j = i; j <= i + n - p; ++j) a[j] = b[j - i + p];
for(int j = i + n - p + 1; j <= n; ++j) a[j] = b[j - n + p - 1];
}
}
}
}
int main()
{
int T; scanf("%d", &T);
for(int ca = 1; ca <= T; ++ca)
{
work();
}
return 0;
}
Problem G. Limit
题目大意
给出 n , a i , b i , t n, a_i, b_i, t n,ai,bi,t,求 lim x → 0 ∑ i = 1 n a i l n ( 1 + b i x ) x t \lim\limits_{x \rightarrow 0}{\frac{\sum_{i=1}^n{a_i ln(1+b_ix)}}{x^t}} x→0limx

这篇博客讨论了四个不同领域的算法问题:排序操作的有效性判断、数学极限计算、集合构造、动态概率分析以及二进制加法表示。通过实例解析和代码实现,展示了如何解决这些问题并利用特定的数据结构和技巧进行优化。
最低0.47元/天 解锁文章
334

被折叠的 条评论
为什么被折叠?



