好耶,第一次div2做出来3道题,虽然中间看了个题解,但是思路差不多,被复杂度困住了,nnd
首先是第一个题,emm
第一题
那么这个题的要求是,构造一个数组,满足这些条件:
注意如果没有第一个条件的话,那么直接输出
i
×
n
i \times n
i×n,然而出错,喵
事实上,如果输出的是
i
i
i的话,那么整个和就是
(
1
+
n
)
n
2
\frac{(1+n)n}{2}
2(1+n)n,然而,我输出之后又错了,因为
n
+
1
n+1
n+1不一定是偶数,所以输出
i
×
2
i\times 2
i×2就完了呗。
第二题:第二题
这个题呢,是可以交换第i和第j个位置上的元素,但是必须满足i-j为k,我们注意到,如果多交换几次的话,那么就可以了呢。所以这个k应该是所有距离的最大公因数,而不应该用二分去判断,因为他不是连续的。
第三题:C. Counting Orders
那么这个题呢,是从后往前找比b组中大的数,然后放到一个集合里,指针向左移动的时候再把比b大的数放到集合里面。我有点说不明白,看代码吧。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int length = 2e5 + 5;
vector<int> a;
vector<int> b;
int mod = 1e9 + 7;
int main(void)
{
int t;
scanf_s("%d", &t);
for (int i = 0; i < t; i++)
{
int n;
scanf_s("%d", &n);
a.clear(), b.clear();
for (int i = 0; i < n; i++)
{
int q; scanf_s("%d", &q);
a.push_back(q);
}
for (int i = 0; i < n; i++)
{
int p;
scanf_s("%d", &p);
b.push_back(p);
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
vector<int> stk;
int res = 1;
for (int i = n - 1; i >= 0; i--)
{
while (!a.empty()&&a.back() > b[i])
{
stk.push_back(a.back());
a.pop_back();
}
res = ((ll)res * (stk.size() - (n - 1 - i)))%mod;
if (res == 0)
break;
}
printf("%d\n", res);
}
}