列表

详情


NC17193. 简单瞎搞题

描述

一共有 n个数,第 i 个数是 xi 
xi 可以取 [li , ri] 中任意的一个值。
,求 S 种类数。

输入描述

第一行一个数 n。 
然后 n 行,每行两个数表示 li,ri

输出描述

输出一行一个数表示答案。

示例1

输入:

5
1 2
2 3
3 4
4 5
5 6

输出:

26

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 773ms, 内存消耗: 1016K, 提交时间: 2019-05-18 15:38:55

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	bitset<1010000>a,b;
	b=1;
	while(n--)
	{	
		int l,r;
		cin>>l>>r;
		a.reset();
		for(int i=l;i<=r;i++)
			a|=b<<(i*i);
			
		b=a;
	}
	cout<<b.count()<<endl;
	return 0; 
}

C++(g++ 7.5.0) 解法, 执行用时: 513ms, 内存消耗: 12912K, 提交时间: 2023-07-03 01:48:00

#include <bits/stdc++.h>
using namespace std;
int t,n,m,l,r;
bitset<1000100>dp[110];
int main()
{
	cin>>n;
	dp[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		cin>>l>>r;
		for(int j=l;j<=r;j++)
			dp[i]|=(dp[i-1]<<(j*j));
	}
	cout<<dp[n].count()<<endl;
}

C++(clang++ 11.0.1) 解法, 执行用时: 476ms, 内存消耗: 13020K, 提交时间: 2023-07-29 10:35:51

#include<bits/stdc++.h>
using namespace std;
int n,l,r,i,j;
bitset<1000005>f[105]; 
int main(){
    cin>>n,f[0]=1;
    for(i=1;i<=n;i++){
        cin>>l>>r;
        for(j=l;j<=r;j++) f[i]|=f[i-1]<<j*j;
    }
    cout<<f[n].count();
}

上一题