A
假设一个数中有连续的33,表示出来,再去掉33表示,相减,发现差可以被33整除。故可以直接%33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+20;
int T,x;
void solve()
{
cin>>x;
if(x%33==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}
B
让最小的几个数尽量覆盖最多的区间即可
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+20;
int T,n,k,a[N];
void solve()
{
cin>>n>>k;
memset(a,0,sizeof(a));
int p=n/k;
for(int i=1;i<=p;i++)
{
a[i*k]=i;
}
int w=p;
for(int i=1;i<=n;i++)
{
if(a[i]) cout<<a[i]<<" ";
else cout<<++w<<" ";
}
cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}
C
介绍一个O(n)做法。有一个序列肯定是原序列,高位的优先级最高,我们尽量让高位的0变成1,1不变。找到最高位的0位置p此时第二个区间的l肯定在(1,p-1)。找之后连续的0对上(1,p-1)中连续的1,1不够就确定l为1,否则连续的0变成1优先和原序列最高位的0匹配,之后我们无法保证。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+20;
int T,n,pos,t;
char cc[N],c[N];
void init()
{
t=pos=0;
}
void solve()
{
cin>>cc;
n=strlen(cc);
init();
for(int i=1;i<=n;i++)
c[i]=cc[i-1];
for(int i=1;i<=n;i++)
if(c[i]=='0') {pos=i;break;}
if(!pos)
{
cout<<1<<" "<<n<<" "<<1<<" "<<1<<endl;
return ;
}
for(int i=pos;i<=n;i++)
{
if(c[i]=='0')
{
t++;
if(t>pos-1)
{
cout<<1<<" "<<n<<" "<<1<<" "<<n-pos+1<<endl;
return ;
}
}
else break;
}
cout<<1<<" "<<n<<" "<<pos-t<<" "<<n-t<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}
D
纯贪心。先把问题化简。能力值<=a[1]的去掉不用管,其他从小到大排序。b中难度<=a[1]的全部赋成无穷,因为此时的a[1]能解决其他人也能解决,都能解决=都不能解决。这样的好处是把所有题都变成了a[1]解决不了的。我们统计出来每道题有多少人能解决c[i],这些能解决的人数就是排在a[1]前面的。问题转化为m个题分组,使得每组c的最大值的和最小。c从小到大排序,连续的k个一组即可。这一步的复杂度为m/1+m/2+m/3+........m/m为调和级数不超时。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+20;
int T,n,m,a[N],b[N],aa[N],tot,c[N],ans[N];
void init()
{
tot=0;
for(int i=1;i<=m;i++) ans[i]=0;
}
void solve()
{
cin>>n>>m;
init();
cin>>a[1];
for(int i=2;i<=n;i++)
{
cin>>a[i];
if(a[i]>a[1]) aa[++tot]=a[i];
}
sort(aa+1,aa+tot+1);
for(int i=1;i<=m;i++)
{
cin>>b[i];
if(b[i]<=a[1]) b[i]=0x3f3f3f3f;
}
sort(b+1,b+m+1);
for(int i=1;i<=m;i++)
{
c[i]=tot-(lower_bound(aa+1,aa+tot+1,b[i])-aa)+1;
}
reverse(c+1,c+m+1);
for(int i=1;i<=m;i++)
for(int j=0;j<=m;j+=i)
{
if(j<=m) ans[i]+=c[j];
}
for(int i=1;i<=m;i++) cout<<ans[i]+m/i<<" ";
cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
}