A. Submission Bait
如果最大值有奇数个显然Alice赢,否则只需要看排序后是否存在是否为奇数且
即可。
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
cin >> n;
rep(i, 1, n) cin >> a[i];
sort(a + 1, a + n + 1);
rep(i, 1, n)
{
if(a[i] > a[i - 1] && (n - i + 1) % 2 == 1)
{
cout << "YES" << endl;
return;
}
}
cout << "NO" << endl;
}
signed main()
{
IOS;
int t;
t = 1;
cin >> t;
while(t -- )
{
solve();
}
return 0;
}
B. Array Craft
可以确定x和y这两个位置一定是1且x+1和y-1一定是-1,不难想到可以把y到x之间全填1,两边1和-1交叉填即可
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
int x, y;
cin >> n >> x >> y;
rep(i, y, x) a[i] = 1;
int now = 0;
pre(i, y - 1, 1)
{
if(!now) a[i] = -1, now = 1;
else a[i] = 1, now = 0;
}
now = 0;
rep(i, x + 1, n)
{
if(!now) a[i] = -1, now = 1;
else a[i] = 1, now = 0;
}
rep(i, 1, n) cout << a[i] << " ";
cout << endl;
}
signed main()
{
IOS;
int t;
t = 1;
cin >> t;
while(t -- )
{
solve();
}
return 0;
}
C. Mad MAD Sum
模拟一下发现从第三轮开始往后相当于把前一轮的数组删去最后一个数,因为假设数组为
9 5 6 4 4 4 4 5 6 9 9 9这样的,那么第一轮结束后数组为0 0 0 0 4 4 4 5 6 9 9 9,第二轮结束后数组为0 0 0 0 4 4 4 4 4 9 9发现5和6都变成了4,且这种情况很好推出只有前两轮会发生,所以模拟完前两轮依次删除最后一个数,统计贡献即可
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
cin >> n;
rep(i, 1, n) cin >> a[i];
map<int, int>mp;
int ans = 0, res = 0;
set<int>s;
rep(i, 1, n)
{
ans += a[i];
mp[a[i]] ++ ;
if(mp[a[i]] > 1) s.insert(a[i]);
if(!s.size()) b[i] = 0;
else
{
auto it = s.end();
it -- ;
b[i] = *it;
}
res += b[i];//cout<<b[i]<<" ";
}
ans += res;
mp.clear();
s.clear();
res = 0;
rep(i, 1, n)
{
a[i] = b[i];
mp[a[i]] ++ ;
if(mp[a[i]] > 1) s.insert(a[i]);
if(!s.size()) b[i] = 0;
else
{
auto it = s.end();
it -- ;
b[i] = *it;
}
res += b[i];//cout<<b[i]<<" ";
}
ans += res;
pre(i, n, 1)
{
res -= b[i];
if(res == 0) break;
ans += res;
}
cout << ans << endl;
}
signed main()
{
IOS;
int t;
t = 1;
cin >> t;
while(t -- )
{
solve();
}
return 0;
}
D. Grid Puzzle
当均大于2时,相邻两行需要的操作数不会小于2,因此每行都选1操作不会更劣,答案为n
当均小于等于2时,发现对相邻行贪心一边,能涂色就涂色,模拟一下就行。
以上两种特判完后,进行dp即可,表示前
行全涂成白色的最小操作数。
当 时,这一行至少要两个1操作,直接用2操作显然更优,
当 时,
当 时,发现当上一个小于等于2的位置j到当前位置i之间的数全都小于等于4且个数为偶数时,可以通过1操作使用i-j+1个操作,即
。记录上一个小于等于2的位置以及这段区间的最大值。
注意取min
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N], dp[N];
void solve()
{
cin >> n;
rep(i, 1, n) cin >> a[i];
int f = 0;
rep(i, 1, n) if(a[i] <= 2) f ++ ;
if(!f)
{
cout << n << endl;
return;
}
if(f == n)
{
int ans = 0;
rep(i, 2, n)
{
if(a[i] && a[i - 1]) ans ++ , a[i] = 0, a[i - 1] = 0;
}
rep(i, 1, n) if(a[i]) ans ++ ;
cout << ans << endl;
return;
}
rep(i, 1, n) dp[i] = 1e9;
dp[0] = 0;
int j = 0, ma = 0;
rep(i, 1, n)
{
if(a[i] == 0) dp[i] = dp[i - 1];
dp[i] = min(dp[i], dp[i - 1] + 1);
if(a[i] <= 2 && j && ma <= 4 && (i - j + 1) % 2 == 0) dp[i] = min(dp[i], dp[j - 1] + i - j);
if(a[i] <= 2) j = i, ma = 0;
else ma = max(ma, a[i]);
}
cout << dp[n] << endl;
}
signed main()
{
IOS;
int t;
t = 1;
cin >> t;
while(t -- )
{
solve();
}
return 0;
}