A.小沙的炉石----推性质+二分
二分代码
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1000010,mod=1000000007;
signed main()
{
int n,m,q;
scanf("%lld%lld%lld",&n,&m,&q);
int x;
while(q--)
{
scanf("%lld",&x);
int l=0,r=min(n,m+1);
while(l<r)
{
int mid=l+r+1>>1;
if(mid*mid<=x)l=mid;
else r=mid-1;
}
int res=m*r+(r+1)*r/2;
if(res>=x)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
超简单代码
#include <iostream>
using namespace std;
#define int long long
signed main()
{
int n,m,q,x;
scanf("%lld%lld%lld",&n,&m,&q);
n=min(n,m+1);
int maxv=n*m+n*(n+1)/2;
while(q--)
{
scanf("%lld",&x);
if(x>maxv||(m+1==n&&x==n*n-1))puts("NO");
else puts("YES");
}
}
I.小沙的构造----构造
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=10010;
char res[N];
int main()
{
int n,m;
scanf("%d%d", &n, &m);
string sa="\"!'*+-.08:=^_WTYUIOAHXVM|",sb="<>\\/[]{}()";
if(m==36||n<m)return cout<<-1<<endl,0;
if(m>=10&&((n-10+1)/2)<(m-10))return cout<<-1<<endl,0;
int pb=0,l=1,r=n;
while(pb<sb.size()&&(m>2||(m==2&&(r-l==1))))
{
res[l++]=sb[pb++];
res[r--]=sb[pb++];
m-=2;
}
int pa=0;
while(l<=r)
{
if(l==r)res[l++]=sa[pa];
else res[l++]=sa[pa],res[r--]=sa[pa];
m--;
if(m>0)pa++;
}
for(int i=1;i<=n;i++)cout<<res[i];
}