这一次女生赛的热身赛前面两道题都很简单,就是最后面一题要用了质因数分解+
A、赛题分析
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,k=1001;
cin>>t;
while(t--)
{
int n,m,x;
cin>>n>>m;
printf("Problem %d:\n",k++);
int minn=0x3f3f3f3f;
for(int i=0; i<n; i++)
{
cin>>x;
minn=min(minn,x);
}
printf("Shortest judge solution: %d bytes.\n",minn);
minn=0x3f3f3f3f;
if(m==0)
printf("Shortest team solution: N/A bytes.");
else
{
for(int i=0; i<m; i++)
{
cin>>x;
minn=min(minn,x);
}
printf("Shortest team solution: %d bytes.",minn);
}
// if(t>0)这里oj上面跟比赛的时候有一定的出入,问题不大
printf("\n");
}
return 0;
}
我很惊讶!他(oj)竟然卡我的回车??!!我不李姐。热身赛是一次过的。
B、SA-IS后缀数组
任意门
思维题!
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int n;
char s[MAXN];
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d%s", &n, s);
int cnt = 1;
for (int i = 0; i < n-1; i++)
{
if (s[i] < s[i+1])
{
while (cnt--) printf("<");
cnt = 1;
}
else if (s[i] > s[i+1])
{
while (cnt--) printf(">");
cnt = 1;
}
else cnt++;
}
while (--cnt) printf(">");
printf("\n");
}
return 0;
}
C、口算训练
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
vector<int>vec[maxn];//每一个vector存储的是某个质因子x在哪一个数(以下标存储)中存在
bool isprime[maxn];
int prime[maxn];
int cnt=0;
void PJ(){//素数筛,并获取各个质数
memset(isprime,0,sizeof(isprime));
cnt=0;
for(int i=2;i<=maxn;i++){
if(!isprime[i]){
prime[cnt++]=i;
}
for(int j=0;j<cnt&&prime[j]*i<=maxn;j++){
isprime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
void Get(int x,int index){//质因数分解,index表示下标
for(int i=0;isprime[x];i++){
while(x%prime[i]==0){
vec[prime[i]].push_back(index);
x/=prime[i];
}
}
if(x>1){
vec[x].push_back(index);
}
}
int main()
{
int t;
PJ();
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=cnt;i++){
vec[prime[i]].clear();
}
for(int i=1;i<=n;i++){//获取每一位数,并进行质因数分解
int num;
scanf("%d",&num);
Get(num,i);
}
while(m--){
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
int num=0;
bool flag=1;
for(int i=0;isprime[d];i++){//分解d的质因数
while(d%prime[i]==0){
d/=prime[i];
num++;
}
if(num){//二分答案
int rr=upper_bound(vec[prime[i]].begin(),vec[prime[i]].end(),r)-vec[prime[i]].begin();
int ll=lower_bound(vec[prime[i]].begin(),vec[prime[i]].end(),l)-vec[prime[i]].begin();
//cout<<rr-ll<<endl;
if(rr-ll<num){
flag=false;
break;
}
}
num=0;
}
if(d>1&&flag){//如果d本身就是质数,则同理也进行二分
int rr=upper_bound(vec[d].begin(),vec[d].end(),r)-vec[d].begin();
int ll=lower_bound(vec[d].begin(),vec[d].end(),l)-vec[d].begin();
if(rr-ll<1) flag=false;
}
if(flag){
puts("Yes");
}
else puts("No");
}
}
return 0;
}