cpp
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin>>n;
int q;
cin>>q;
vector<long long> a(n);
vector<int> x(q);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<q;i++) cin>>x[i];
for(int i=0;i<q;i++)
for(int j=0;j<n;j++)
if(a[j]%(1<<x[i])==0)
a[j]+=1<<(x[i]-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
本来以为秒了,结果在第三个测试点超时了。
cpp
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n,q;
cin>>n>>q;
vector<long long> a(n);
for(int i=0;i<n;i++) cin>>a[i];
int m=30+10;
while(q--)
{
int x;
cin>>x;
if(x<m)
{
m=x;
for(int i=0;i<n;i++)
if(a[i]%(1<<m)==0)
a[i]+=1<<(m-1);
}
}
for(auto e:a)
cout<<e<<" ";
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
需要考虑一个优化,不然肯定超时
假设原来有一个数字a[i]
可以整除数字 2 x [ j ] 2^{x[j]} 2x[j],那么a[i]
更新之后肯定不可以整除 2 x [ j ] 2^{x[j]} 2x[j],举一个例子i,比如说8
本来可以整除4
,现在加上2
之后就不能整除4
了
归纳推理可知,被 2 x [ j ] 2^{x[j]} 2x[j]更新之后,就只能被比 2 x [ j ] 2^{x[j]} 2x[j]更小的数字更新,所以最多30
次操作,时间复杂度是 30 ⋅ n 30\cdot n 30⋅n
1 < < n 1<<n 1<<n表示 2 n 2^n 2n
n < < 1 = 2 ⋅ n n<<1=2\cdot n n<<1=2⋅n
数据比较大,a
数组需要开long long