思维还是不够,只过了三题。还是不知道自己能不能够进复赛,太菜了自己。
还是要多做思维题。
A题
签到题,根据题意写即可。
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
using namespace std;
int n,T;
int a[1005],amax,amin=inf;
void ready()
{
cin>>n;
_for(i,1,n)
{
cin>>a[i];
amin=min(amin,a[i]);
amax=max(amax,a[i]);
}
}
void work()
{
int d=amax-amin;
_for(i,1,n)
{
cout<<100*(a[i]-amin)/d<<' ';
}
}
int main()
{
ready();
work();
return 0;
}
B题
思维题,用二进制去思考。这题当时没有做出来,感谢楊哥赛后指点。
对于一个数x,假设x的二进制为101101。从左往右扫,当扫到第5位为1的时候,当y的这一位为0,后面位数任意时,这个y是必定小于x的。而由于后面位数任意,则x异或y的值必定大于25小于26-1。用前缀和统计这个区间内素数的个数,这样就能计算出答案。然后继续往下扫,扫到第k位为1,则则x异或y的值必定大于2k小于2k+1-1。
(因为洛谷交不了这题,不知道补题的代码对不对)
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
using namespace std;
const int N=2e6+1e5;
int n,T;
ll sum[N+100],primes[N+100],pi;
void ready()
{
_for(i,2,N)
sum[i]=1;
_for(i,2,N)
{
if(sum[i]) primes[++pi]=i;
for(int j=1;primes[j]<=N/i;j++)
{
sum[i*primes[j]]=0;
if(i%primes[j]==0) break;
}
}
_for(i,1,N)
sum[i]+=sum[i-1];
cin>>T;
}
int qsm(int x,int y)
{
int cnt=1;
while(y)
{
if(y&1) cnt*=x;
x=x*x;
y>>=1;
}
return cnt;
}
void work()
{
int x,t=0;
ll ans=0;
cin>>x;
while(x)
{
if(x&1)
{
ans+=sum[qsm(2,t+1)-1]-sum[qsm(2,t)-1];
}
t++;
x>>=1;
}
cout<<ans<<'\n';
}
int main()
{
ready();
while(T--)
work();
return 0;
}
C题
用map去储存每个字段名所对应是第几个字段,然后用vector暴力去做即可。
注意,宏定义for之后是≤,注意写的时候的细节。
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
using namespace std;
int n,T,k,cnt;
vector<int> v[105];
map<int,int> m;
void ready()
{
cin>>n>>k;
}
void work()
{
int t;
cin>>t;
if(t==1)
{
int p;
cin>>p;
_for(i,1,p){
int x,y;
cin>>x>>y;
if(!m[x]) m[x]=++cnt;
v[m[x]].push_back(y);
}
}
else
{
int x,ymin,ymax,ans=0;
cin>>x>>ymin>>ymax;
x=m[x];
_for(i,0,v[x].size()-1)
if(v[x][i]>=ymin && v[x][i]<=ymax)
ans++;
cout<<ans<<'\n';
}
}
int main()
{
ready();
while(n--)
work();
return 0;
}
E题
易得,只有2和3这两个质数异或值为1,其他都不为1。
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
using namespace std;
int n,T;
void ready()
{
cin>>T;
}
void work()
{
int a,b;
cin>>a>>b;
if(a>b) swap(a,b);
if(a==1 && b==2) cout<<"Yes\n";
else cout<<"No\n";
}
int main()
{
ready();
while(T--)
work();
return 0;
}