首页 > 代码库 > LibreOJ 515 贪心只能过样例
LibreOJ 515 贪心只能过样例
题目链接:https://loj.ac/problem/515
题意:
给n(测试数据全是100)个数,第i个数x的取值可以在[a,b](1<=a,b<=100),求sigma(x*x)的取值有多少种。
题解:
这道题很容易得出一个O(n^5)的复杂度的一个dp(暴力),但是很明显这个复杂度是不行的。
这道题可以产生的最大的数是100*100*100=1e6,于是我们可以借助一个叫做bitset的东西来优化一下我们的dp(暴力)。
bitset可以看做一个bool数组(每一位都是0/1),也可以当成一个二进制表示的数(可以进行位运算),biset作为运算时的复杂度大约是O(N/机器字节数)。借助这三点,我们就可以把这道题优化到O(n^5/128)了。
我们开一个1000000的bitset,将其每一位代表一个数字(第0位代表0,第1位代表1……),用1表示当前数存在,表示0当前数不存在,每次加一个数x就相当于每个位置左移x位。在以后统计一下最后有多少个1就行了。。
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long LL; const double eps = 1e-10; const int maxn = 1e5 + 100; bitset<1000011> dp[2]; int l,r,pre,now,n; int main() { #ifdef ac freopen("in.txt" , "r" , stdin); freopen("out.txt" , "w" , stdout); #endif dp[0][0]=1; pre=now=0; cin >> n; for(int i=1;i<=n;++i) { now^=1; dp[now]=0; cin >> l >> r; for(int j=l;j<=r;++j) dp[now]|=dp[pre]<<(j*j); pre^=1; } cout << dp[now].count() << endl; return 0; }
BTW:loj的评测鸡跑得好快,stl大法真的好强
LibreOJ 515 贪心只能过样例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。