越来越破防......
题目链接
bitset是个存储二进制序列的容器,容器本身支持位运算
这道题的意思:
A→B,A和B一共有多少种数?,B不知道
B→C,B和C一共有多少种数?,C不知道。。。。。。
大问题可拆成小问题,
小问题有最小问题,DP
从最右边往左DP
每次将当前 i 的 value 计入当前 dp[ i ]的统计数量中
若右边有可达的地方,就合并集合
但合并集合很麻烦
所以就有了bitset
将bitset开到二维
第一维为当前位置 i
第二维为当前位置 i 能到的所有点的 value 的集合
将可达的点设为 1,通过异或操作即可轻松完成集合合并
要统计有几个数时,用 .count() 函数就可以获得 二进制序列中 1 的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
LL n,ans,value[N];
bitset<N> dp[N];int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>value[i];for(int i=n;i>=1;i--){dp[i][value[i]]=1;if(2*i<=n){dp[i] |=dp[i*2];}if(i+value[i]<=n){dp[i] |=dp[i+value[i]];}ans=max(ans,(LL)(dp[i].count()));}cout<<ans;return 0;
}