直接输出n/2;不解释
题意有点繁琐,其实想一想因为之选2*n-2个,又看到他一定能够造出来,其实能想到直接让他gcd是2,(!!!!其实就该秒的,一开始还没想出来)
#pragma G++ optimize(2)
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;//unsigned
typedef unsigned long long ull;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=a*a%mod; b>>=1; } return ans;}
/* i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
ll n,m;
ll a[2100];
ll b[2200];
ll c[2200];
int main()
{
ll k,p,sum,maxl,minl=INF;
ll t;
cin>>t;
while(t--)
{
read(n);
ll cnt1=0,cnt2=0;
rep(i,1,2*n)
{
read(a[i]);
if(a[i]%2==1) b[++cnt1]=i;
else c[++cnt2]=i;
}
ll sum=0;
for(ll i=1;i<=cnt1;i+=2)
{
if(i<cnt1)
{
printf("%lld %lld\n",b[i],b[i+1]);
sum++;
}
if(sum==n-1) break;
}
for(ll i=1;i<=cnt2;i+=2)
{
if(i<cnt2)
{
printf("%lld %lld\n",c[i],c[i+1]);
sum++;
}
if(sum==n-1) break;
}
}
return 0;
}
博弈类似,判断一下素数就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=a*a%mod; b>>=1; } return ans;}
/* i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
int main()
{
ll t,n;
cin>>t;
while(t--)
{
cin>>n;
if(n==1)
{
puts("FastestFinger");
continue;
}
if(n%2==1||n==2)
{
cout<<"Ashishgup"<<endl;
continue;
}
ll cnt=0;
while(n%2==0)
{
cnt++;
n/=2;
}
if(n==1)
puts("FastestFinger");
else
{
if(cnt>1)
cout<<"Ashishgup"<<endl;
else
{
ll f=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
f=1;
}
if(f==0)
puts("FastestFinger");
else
cout<<"Ashishgup"<<endl;
}
}
}
return 0;
}
D - Odd-Even Subsequence |
min(max(s1,s3,s5,…),max(s2,s4,s6,…))min(max(s1,s3,s5,…),max(s2,s4,s6,…)).
就求一个这个。
大体怎么求呢,我们可以二分答案。(其实这个挺明显的)但是要考虑边界,比如四个数1 2 2 1,可以选1,1.因为1,1隔着两个,但是2,2就不行了,一开始偶数的这种情况一直没考虑,但奇数的时候却考虑了好多,然后就一直改奇数的,最后一想自己好蠢。
二分我们是二分k/2个数是否可以组成一个可行的偶数或奇数序列。
四个judge就粘贴复制。边界判断
#pragma G++ optimize(2)
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;//unsigned
typedef unsigned long long ull;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){ if(!b) return a; return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=a*a%mod; b>>=1; } return ans;}
/* i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
ll n,m;
ll a[maxx];
ll pipei[maxx];
ll judeg(ll k,ll geshu)
{
ll cnt=0;
rep(i,1,n)
{
if(a[i]<=k&&(pipei[cnt]!=i-1))
{
pipei[++cnt]=i;
}
}
if(cnt>=geshu) return 1;
return 0;
}
ll judeg2(ll k,ll geshu)
{
ll cnt=0;
rep(i,2,n-1)
{
if(a[i]<=k&&(pipei[cnt]!=i-1))
{
pipei[++cnt]=i;
}
}
if(cnt>=geshu) return 1;
return 0;
}
ll judeg3(ll k,ll geshu)
{
ll cnt=0;
rep(i,1,n-1)
{
if(a[i]<=k&&(pipei[cnt]!=i-1))
{
pipei[++cnt]=i;
}
}
if(cnt>=geshu) return 1;
return 0;
}
ll judeg4(ll k,ll geshu)
{
ll cnt=0;
rep(i,2,n)
{
if(a[i]<=k&&(pipei[cnt]!=i-1))
{
pipei[++cnt]=i;
}
}
if(cnt>=geshu) return 1;
return 0;
}
int main()
{
pipei[0]=1000;
ll k,p,sum,maxl=0,minl=INF;
ll t;
cin>>n>>k;
rep(i,1,n)
{
read(a[i]);
minl=min(a[i],minl);
maxl=max(a[i],maxl);
}
ll l,r;
l=minl;r=maxl;
ll ans1=INF,ans2=INF;
if(k%2==0)
{
p=k/2;
while(l<=r)
{
ll mid=(l+r)/2;
if(judeg3(mid,p))
{
ans1=min(mid,ans1);
r=mid-1;
}
else l=mid+1;
}
l=minl;r=maxl;
while(l<=r)
{
ll mid=(l+r)/2;
if(judeg4(mid,p))
{
ans2=min(mid,ans2);
r=mid-1;
}
else l=mid+1;
}
cout<<min(ans1,ans2)<<endl;
}
else
{
ans1=INF; ans2=INF;
l=minl;r=maxl;
p=k/2+1;
while(l<=r)
{
ll mid=(l+r)/2;
if(judeg(mid,p))
{
ans1=min(mid,ans1);
r=mid-1;
}
else l=mid+1;
}
p--;
l=minl;r=maxl;
while(l<=r)
{
ll mid=(l+r)/2;
if(judeg2(mid,p))
{
ans2=min(mid,ans2);
r=mid-1;
}
else l=mid+1;
}
//printf("%lld %lld\n",ans1,ans2);
cout<<min(ans1,ans2)<<endl;
}
// ke buxianglin
return 0;
}