模拟就行
#include <bits/stdc++.h>
using namespace std;
const int M = 1<<31;
int main()
{
int n,m;
cin>>n>>m;
if(m%n!=0)
{
puts("-1");
return 0;
}
int q=m/n;
int a=0,b=0;
while(q%2==0&&q!=0)
{
a++;
q/=2;
}
while(q%3==0&&q!=0)
{
b++;
q/=3;
}
if(q==1)
{
cout<<a+b<<endl;
}
else
cout<<"-1"<<endl;
return 0;
}
就把这个序列扩大两倍然后再暴力就行。
#include <bits/stdc++.h>
using namespace std;
const int M = 400000+100;
typedef long long ll;
ll a[M],qi[M];
int main()
{
#ifdef FASTIO
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#endif
int n;
cin>>n;
for(int i =1;i<=n;i++)
{
cin>>a[i];
a[n+i]=a[i];
}
int ma=0,ans=1,flag=0;
n+=n;
for(int i=1;i<=n;i++)
{
if(a[i]==1)
flag=1;
if(a[i]==a[i-1]&&a[i]==1)
ans++;
else
{
ma=max(ma,ans);
ans=1;
}
}
/* while(l<=n)
{
if(a[l]==0)
l++;
else
{
r=l;
while(r<=n&&a[r]==1)
{
r++;
}
ans=max(r-l,ans);
l=r;
}
}*/
if(flag)
cout<<ma <<endl;
else
puts("0");
return 0;
}
C - Polycarp Restores Permutation
假定第一个元素为0,用给定序列求出拟定原序列,全部加上(0-最小值+1)结果就是正确序列。
最后只要没有重复元素一定可行
#include <bits/stdc++.h>
using namespace std;
set<int>ss;
const int M = 2*100000+100;
int a[M];
int b[M];
int main()
{
int n;
int x=0,ma=0,mi=0;
cin>>n;
ss.insert(x);
b[0]=x;
for(int i=1;i<=n-1;i++)
{
scanf("%d",&a[i]);
x+=a[i];
mi=min(x,mi);
ss.insert(x);
b[i]=x;
}
set<int>::iterator it;
if(ss.size()!=n)
puts("-1");
else
{
int w=0;
if(mi<=0)
w=0-mi+1;
printf("%d",b[0]+w);
for(int i=1;i<=n-1;i++)
printf(" %d",b[i]+w);
puts("");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int M = 150000+100;
int za[30];
int zb[30];
int lca[30][M];
int lcb[30][M];
struct node
{
int l,r;
}pr[M];
void pri(int n)
{
printf("%d\n",n);
for(int i=1;i<=n;i++)
printf("%d %d\n",pr[i].l,pr[i].r);
}
int main()
{
int n,x,qa=0,qb=0;
cin>>n;
string a,b;
cin>>a>>b;
int la=a.length();
int lb=b.length();
for(int i=0;i<la;i++)
{
if(a[i]=='?')
{
za[27]++;
lca[27][za[27]]=i+1;
//printf("%d\n",i+1);
continue;
}
x=a[i]-'a'+1;
// cout<<x<<a[i]<<endl;
za[x]++;
lca[x][za[x]]=i+1;
}
for(int i=0;i<lb;i++)
{
if(b[i]=='?')
{
zb[27]++;
lcb[27][zb[27]]=i+1;
continue;
}
x=b[i]-'a'+1;
zb[x]++;
lcb[x][zb[x]]=i+1;
//printf("%d %d %d\n",zb[i],lcb[x][zb[x]],i);
}
int sum=0;
for(int i=1;i<=26;i++)
{
if(za[i]>=1&&zb[i]>=1)
{
while(za[i]>=1&&zb[i]>=1)
{
sum++;
// printf("%d %d %d\n",za[i],zb[i],i);
pr[sum].l=lca[i][za[i]];
pr[sum].r=lcb[i][zb[i]];
// printf("%d %d %d\n",pr[sum].l,pr[sum].r,i);
zb[i]--,za[i]--;
}
}
}
//printf("%d \n",sum);
//puts("");
while(za[27])
{
if(sum>=n)
{
pri(sum);
return 0;
}
sum++;
pr[sum].l=lca[27][za[27]];
za[27]--;
for(int i=1;i<=27;i++)
{
if(zb[i]>0)
{
pr[sum].r=lcb[i][zb[i]];
// printf("%d %d \n",i,lcb[i][zb[i]]);
zb[i]--;
break;
}
}
}
// printf("%d \n",sum);
while(zb[27])
{
if(sum>=n)
{
pri(sum);
return 0;
}
sum++;
pr[sum].r=lcb[27][zb[27]];
zb[27]--;
for(int i=1;i<=27;i++)
{
if(za[i]>0)
{
pr[sum].l=lca[i][za[i]];
za[i]--;
break;
}
}
}
pri(sum);
return 0;
}