• [ AT_agc009_c]Division into Two


    题目传送门

    大家都知道集合吧,原谅我喜欢说废话

    解法

    先钦定 A > B A>B A>B,
    先把数排好序得到数组 a a a,考虑先解决集合 X X X的问题,

    设计状态:

    明显只有一维( n < = 1 e 5 n<=1e5 n<=1e5),所以有:
    f i : X 集合最后放的是第 i 个数,对于前 i 个数来说 X , Y 都合法的方案数 f_i:X集合最后放的是第i个数,对于前i个数来说X,Y都合法的方案数 fi:X集合最后放的是第i个数,对于前i个数来说X,Y都合法的方案数
    发现后 ( n − i ) (n-i) ni个放在 Y Y Y的数我们未保证合法,但是我们之后特判一下就好了

    状态转移

    f i f_i fi f j f_j fj转移而来
    考虑有哪些 j j j可以贡献:
    1. i > j i>j i>j(废话)
    2. a i − a j ≥ A a_i-a_j\ge A aiajA(差值大于 A A A)
    3. max ⁡ { a k − a k − 1 } ≥ B , k ∈ ( j , i ) \max\{a_k-a_{k-1}\}\ge B,k\in(j,i) max{akak1}B,k(j,i)(满足 Y Y Y集合的要求)
    则: f i = ∑ f j f_i=\sum f_j fi=fj

    code:
    #include 
    #include 
    using namespace std;
    typedef long long ll;
    const int mod = 1e9 + 7,N=1e5+7;
    int n,l,r;
    int f[N],sum[N];
    ll A,B;
    ll a[N];
    int main(){
    	scanf("%d%lld%lld",&n,&A,&B);
    	if(A=A) r++;
    		if(l<=r) {
    			f[i]=(1ll*f[i]+1ll*sum[r])%mod;
    			if(l) f[i]=(1ll*f[i]-1ll*sum[l-1]+mod)%mod;
    		}
    		sum[i]=(1ll*sum[i-1]+1ll*f[i])%mod;
    		if(a[i]-a[i-1]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    TXL

  • 相关阅读:
    使用POI实现基于Excel的考试成绩分析
    java计算机毕业设计教评系统源码+mysql数据库+系统+lw文档+部署
    【iMessage苹果推日历推位置推送】软件安装 UIApplication 的 registerForRemoteNotifications
    五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率
    Windows 下 Sublime Text 2.0.2 下载及配置
    Mysql高级——索引优化和查询优化(2)
    深度学习框架中的自动微分及高阶导数
    ASP.NET Core中创建中间件的几种方式
    【IOS】iphone型号和Model Identifier对应关系
    pyspark 检测任务输出目录是否空,避免读取报错
  • 原文地址:https://blog.csdn.net/PocketSam/article/details/132653678