CF1807G2 - Subsequence Addition (Hard Version)
bitset
最开始序列
由于可以在
初步检查之后将 bitset 下标为
从小到大枚举 bitset 中的对应的位是否为
若其值为 bitset 中所有可以被拼出的值下标处为
从小到大枚举 bitset 与其自身左移
由于序列长度
可以使用 CodeForces 语言选项中的 GNU C++20 (64) 来加速 bitset,使
bitset 的效率非常好,一秒内跑完
下面的代码在赛后 18h 左右被 hack(TLE),但最终 System Test 时通过了所有 hack 数据,同样是本题的 AC 代码。
bitset 能否通过一定程度上取决于评测机发挥,存在风险,但它仍然是一种值得学习的解法。
#include<bits/stdc++.h>
using namespace std;
int T,n,c[200005];
bitset<200004> s;
void deal(){
cin>>n,s.reset();
for(int i=1;i<=n;i++) cin>>c[i];
s[1]=1,sort(c+1,c+n+1);
if(c[1]!=1) return cout<<"NO\n",void();
for(int i=2;i<=n;i++)
if(s[c[i]]) s|=s<<c[i];
else return cout<<"NO\n",void();
cout<<"YES\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
for(cin>>T;T;T--) deal();
return 0;
}