LibreOJ #515

Posted Blogggggg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LibreOJ #515相关的知识,希望对你有一定的参考价值。

题目链接:https://loj.ac/problem/515

解题思路:

  DP部分不难想到:从 a 到 b 遍历,然后在已有的状态上加上遍历得到的数字的平方,难点在于记录状态。

  于是我学到了一个新的 C++ 类,bitset,开熏~

  S最大只能到 1000000,所以我们开一个比 1000000 稍大的 bitset 类,bitset 上面的各位代表数字 1~1000000,如果能得到一个数字,那么就在这个数字对应的位上置 1,否则置 0。那么加法运算就用移位符解决,各种情况的合并用 ‘|’ 来处理。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <bitset>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 bitset<1000005> dp[2];
 8 int main(){
 9     int pre=0,now=1;
10     dp[0][0]=1;
11     int n,a,b;
12     scanf("%d",&n);
13     while(n--){
14         dp[now]=0;
15         scanf("%d%d",&a,&b);
16         for(int i=a;i<=b;i++)
17             dp[now]|=(dp[pre]<<(i*i));
18         swap(now,pre);
19     }
20     printf("%d\n",dp[pre].count());
21     return 0;
22 }

 

以上是关于LibreOJ #515的主要内容,如果未能解决你的问题,请参考以下文章

LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例

LibreOJ 515 贪心只能过样例

「LibreOJ#515」贪心只能过样例 (暴力+bitset)

LibreOJ 6280

AC日记——「HNOI2017」单旋 LiBreOJ 2018

LibreOJ 6004 圆桌聚餐 (最大流)