专栏文章

P2789 直线交点数 題解

P2789题解参与者 8已保存评论 9

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
9 条
当前快照
1 份
快照标识符
@miq1xusx
此快照首次捕获于
2025/12/03 21:37
3 个月前
此快照最后确认于
2025/12/03 21:37
3 个月前
查看原文

繁體中文

提供一種簡單的 O(n4w)\mathcal O(\frac{n^4} {w}) 的 bitset 做法。
考慮產生交點當且僅當斜率不同,我們考慮按照斜率將物品分組,那麼一組數量為 xx 斜率產生的交點數量顯然是 x(nx)x(n-x)
考慮求 F(n)F(n) 表示 nn 個直線產生的交點數量的種類數,發現不好轉移。
於是我們想到求 Bn(i)B_n(i) 表示 nn 個直線能否形成 ii 個交點,那麼顯然 F(n)=Bn(i)F(n)=\sum B_n(i)
可以轉移,顯然有:
Bn(i)=Bnx(ix(nx))B_n(i)=B_{n-x}(i-x(n-x))
顯然可以考慮 bitset 優化轉移,然後這題就做完了,代碼也很簡單。

简体中文

提供一种简单的 O(n4w)\mathcal O(\frac{n^4}{w}) 的 bitset 做法。
考虑产生交点当且仅当斜率不同,我们考虑按照斜率将物品分组,那么一组数量为 xx 的斜率产生的交点数量显然是 x(nx)x(n - x)
考虑求 F(n)F(n) 表示 nn 条直线产生的交点数量的种类数,发现不好转移。
于是我们想到求 Bn(i)B_n(i) 表示 nn 条直线能否形成 ii 个交点,那么显然 F(n)=Bn(i)F(n)=\sum B_n(i)
可以进行转移,显然有:
Bn(i)=Bnx(ix(nx))B_n(i)=B_{n - x}(i - x(n - x))
显然可以考虑用 bitset 优化转移,然后这题就做完了,代码也很简单。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=900;
bitset<N>B[30];
int n;
int main()
{
	cin>>n;
	B[0][0]=1;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=i;j++)B[i]|=B[i-j]<<(j*(i-j));
	cout<<B[n].count()<<endl;
}

评论

9 条评论,欢迎与作者交流。

正在加载评论...