B. Restore Modulo
看榜靠前的发现这么个代码很奇妙
首先分析下题目,这个数列如果没有mod m,妥妥的一个等差数列
等差数列每个值都mod m,设当前是x,下一项要么是 x + c,要么是 x - (m - c),可以推出ai - ai-1的 要么是 c,要么是 c - m 。
然后发现相邻的差的的差的绝对值要么是 0, 要么是 m
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll NN=1e6+10;
int n;
int main()
{
int t=1; cin >> t;
while(t--)
{
scanf("%d" , &n);
ll a[n];
ll m = 0;
for (ll &x : a)
scanf("%lld" ,&x);
for (ll i = 1; i < n - 1 ; i++)
m = __gcd(m, abs(a[i + 1] + a[i - 1] - 2 * a[i]));
if (m == 0)
printf("0\n");
else if (m <= *max_element(a, a+n))
printf("-1\n");
else
printf("%lld %lld\n" , m, (a[1] - a[0] + m) % m);
}
return 0;
}
C. Basic Diplomacy
贪心
把只有一个人的固定,多人的选一个即可
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
int T, n, m, x, k;
map <int,int> ma;
vector <int> ans, a[maxn];
void work()
{
ma.clear(); ans.clear();
int Max = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i) a[i].clear();
for(int i = 1; i <= m; ++i)
{
scanf("%d", &k);
for(int j = 1; j <= k; ++j)
{
scanf("%d", &x);
a[i].push_back(x);
}
if(k == 1) ma[a[i][0]]++;
Max = max(Max, ma[a[i][0]]);
}
if(Max > (m + 1) / 2){// 某个人在只有一个人的天数中超过了要求,输出NO
puts("NO"); return;
}
for(int i = 1; i <= m; ++i)
{
if(a[i].size() > 1)
{
for(int j = 0; j < a[i].size(); ++j)
{
int t = a[i][j];
if(ma[t] + 1 <= (m + 1) / 2)
{
ans.push_back(t); ma[t]++;break;
}
}
}
else ans.push_back(a[i][0]);
}
puts("YES");
for(int i = 0; i < ans.size(); ++i)
{
if(i > 0) cout << " ";
cout << ans[i];
}
cout << endl;
}
int main()
{
cin >> T;while(T--)
work();
return 0;
}