样例:
s=123412341234
m=2
s1=1234
s2=4321
nt[i][j]:有了j以后找下一个数的位置的坐标。
void solve()
{
cin>>s;
ll len=s.size();
vector<array<ll,10>>nt(len+1);
nt[len].fill(len+1);
for(int i=len-1;i>=0;i--)
{
nt[i]=nt[i+1];
nt[i][s[i]-'0']=i+1;//s[i]-'0的i的后面的数字
}
cin>>m;
string s1,s2;
cin>>s1>>s2;
ll last=0;
for(int i=0;i<m;i++)
{
ll l=s1[i]-'0',r=s2[i]-'0';
ll cur=0;
for(int j=l;j<=r;j++)
{
cur=max(cur,nt[last][j]);
}
last=cur;
if(last==len+1)
{
cout<<"YES\n";return;//不够m后面的值可以随意填
}
}
cout<<"NO\n";
}
它卡常,卡常,ump不能用。
有效的数字最多出现两次,把有用的统计出来,最后对折一下就好了。
void solve()
{
map<ll,ll>mp;
cin>>n;
ll cnt=0;
for(int i=0;i<n;i++)
{
cin>>b[i],mp[b[i]]++;
}
for(auto [x,y]:mp)
{
cnt+=min(2ll,y);
}
cout<<(cnt+1)/2<<"\n";
}
edu66D. Array Splitting
转Resot题解
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>b[i];
a[i]=a[i-1]+b[i];
}
ans=k*a[n];
sort(a+1,a+n);
for(int i=1;i<k;i++)
{
ans-=a[i];
}
cout<<ans<<"\n";
}