手速上了一波分,把上波掉的100加回来了qvq
A.Chess For Three
为奇数则-1,两个小的+起来比最大的小,则肯定有不是平局的
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
typedef pair<int, int> pii;
#define N 2080000
#define endl '\n'
int mod=998244353;
int a[10];
void solve() {
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+3+1);
if((a[1]+a[2]+a[3])&1){
cout<<-1<<'\n';
return;
}
else{
if(a[1]+a[2]<a[3]){
cout<<a[1]+a[2]<<'\n';
}
else
cout<<(a[1]+a[2]+a[3])/2<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
B. Cat, Fox and the Lonely Array
猜的二分
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
typedef pair<int, int> pii;
#define N 108000
#define endl '\n'
int mod=998244353;
int a[N];
int pre[N][32];
int n;
bool check(int x){
int sum=0;
for(int j=0;j<30;j++){
if(pre[x][j]-pre[x-x][j]){
sum|=1ll<<j;
}
}
for(int i=x+1;i<=n;i++){
int dd=0;
for(int j=0;j<30;j++){
if(pre[i][j]-pre[i-x][j]){
dd|=1ll<<j;
}
}
if(dd!=sum){
return 0;
}
}
return 1;
}
void solve() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
for(int j=0;j<30;j++){
pre[i][j]=pre[i-1][j];
pre[i][j]+=(a[i]>>j)&1;
}
}
int l=1,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
}
else{
l=mid+1;
}
}
cout<<r+1<<'\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C. Cat, Fox and Double Maximum
答案肯定是n/2-1,所以对中间奇数位和偶数位上的最小值比较,对比较大的进行操作,让这些数小数配大数先用完,然后肯定有个位置无用,给他分配目前剩下最大值,最后对于有贡献的位置小数配大数
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
typedef pair<int, int> pii;
#define N 108000
#define endl '\n'
int mod=998244353;
int a[N];
int b[N];
struct node{
int w,id;
}c[N];
int cnt=0;
bool cmp(node a,node b){
return a.w<b.w;
}
void solve() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
c[i].w=0;
c[i].id=0;
}
int mi1=1e18;
int mx1=0;
for(int i=2;i<n;i+=2){
mi1=min(mi1,a[i]);
mx1=max(mx1,a[i]);
}
int mi2=1e18;
int mx2=0;
for(int i=3;i<n;i+=2){
mi2=min(mi2,a[i]);
mx2=max(mx1,a[i]);
}
if(mi1>mi2){
cnt=0;
for(int i=2;i<n;i+=2){
c[++cnt].w=a[i];
c[cnt].id=i;
}
sort(c+1,c+cnt+1,cmp);
int now=n;
for(int i=1;i<=cnt;i++){
b[c[i].id]=now;
now--;
}
b[n]=now;
now--;
cnt=0;
for(int i=1;i<=n;i+=2){
c[++cnt].w=a[i];
c[cnt].id=i;
}
sort(c+1,c+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
b[c[i].id]=now;
now--;
}
}
else{
cnt=0;
for(int i=3;i<n;i+=2){
c[++cnt].w=a[i];
c[cnt].id=i;
}
//cout<<cnt<<'\n';
sort(c+1,c+cnt+1,cmp);
int now=n;
for(int i=1;i<=cnt;i++){
b[c[i].id]=now;
now--;
}
b[1]=now;
now--;
cnt=0;
for(int i=2;i<=n;i+=2){
c[++cnt].w=a[i];
c[cnt].id=i;
}
//cout<<cnt<<'\n';
sort(c+1,c+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
b[c[i].id]=now;
now--;
}
}
for(int i=1;i<=n;i++){
cout<<b[i]<<' ';
}
cout<<'\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
D. Cat, Fox and Maximum Array Split
先利用n次把数组中最大值找出来,因为答案很容易知道是最大值的倍数,且最大是n/k倍,枚举到1符合则跳出(赛时提前下班了,很少人过,今天一看怎么过了这么多
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
typedef pair<int, int> pii;
#define N 108000
#define endl '\n'
int mod=998244353;
int n,k;
void solve() {
cin>>n>>k;
int mx;
int ans=-1;
for(int i=n;i>=1;i--){
cout<<"? "<<1<<' '<<i*n<<'\n';
// cout.flush();
int r;
cin>>r;
if(r!=n+1){
mx=i;
break;
}
}
for(int i=n/k;i>=1;i--)
{
int l=1,boo=1;
for(int j=1;j<=k;j++){
if(l<=n){
cout<<"? "<<l<<' '<<mx*i<<'\n';
// cout.flush();
cin>>l;
}
if(j!=k){
l++;
if(l>n){
boo=0;
}
}
if(j==k){
if(l!=n)
boo=0;
}
}
if(boo==1){
ans=mx*i;
break;
}
}
cout<<"! "<<ans<<'\n';
cin>>k;
}
signed main() {
//ios::sync_with_stdio(false);
//cin.tie(nullptr);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}