924 div2
B题光想着构造了,其实赛时已经推出重复元素对答案没有贡献,其实就暗含着1-n只会选一次,然后就是去重,遍历数组中的每个数,设比我当前的数a[i] 大n的数在j位置(即a[j]),那么在a[j]前面的元素一定有1-n之间的一个元素和它加以来相等(其实赛中只要从相等的数入手就行了),气死了,赛时一直想着差值,后来越想越难.......
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n;
scanf("%d",&n);
vector<int> a(n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
int ans=0;
for(int i=0;i<a.size();i++)
{
int j=int(lower_bound(a.begin(),a.end(),a[i]+n)-a.begin());
ans=max(ans,j-i);
}
printf("%d\n",ans);
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
C题就是找循环,因为在一个循环中,x的位置可能在k的左边,还可能在k的右边,所以直接枚举n-x和n+x-2的因子,然后去重,最后判断是否为k>=x因为x在1-k之间(赛时最开始推出来n-x的,后来在最后15分钟推出n+x-2,然后一直想着合并n-x和n+x-2的操作,然后一直想着把去重,判断都堆到一起,然后卡细节,就Wa了)
#include <bits/stdc++.h>
using namespace std;
vector<int> factor(int N){
vector<int> ans;
for (int i = 1; i * i <= N; i++){
if (N % i == 0){
ans.push_back(i);
if (i * i < N){
ans.push_back(N / i);
}
}
}
return ans;
}
int main(){
int t;
cin >> t;
for (int i = 0; i < t; i++){
int n, x;
cin >> n >> x;
n--;
x--;
vector<int> A = factor(n - x);
vector<int> B = factor(n + x);
vector<int> C;
for (int a : A){
if (a % 2 == 0){
C.push_back((a + 2) / 2);
}
}
for (int a : B){
if (a % 2 == 0){
C.push_back((a + 2) / 2);
}
}
sort(C.begin(), C.end());
C.erase(unique(C.begin(), C.end()), C.end());
//求出每一个k,不直接用边界来判断,而是直接将情况枚举
int ans=0;
for(auto k:C)
{
if(k>=x+1) ans++;
}
printf("%d\n",ans);
}
return 0;
}