首页 > 其他分享 >雅礼国庆集训 day1 T2 折射

雅礼国庆集训 day1 T2 折射

时间:2024-10-07 18:44:18浏览次数:1  
标签:node int T2 day1 雅礼 MAXN 递推 dp MOD

题面

题面下载

算法

转化题意

说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小)
pAGu6Sg.png

看着像一种在 y 轴方向排序的 dp
但是由于是折线, 所以需要加一维来判断转向

dp 设计

状态设计

\(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上

状态转移方程

最初想到从 y 轴, 从上往下递推, 但是这样满足不了抽象的 x 轴约束, 因此考虑从 x 轴方向递推
于是有递推式子

\[dp_{i, 0} = dp_{i, 0} + dp_{j, 1} ( y_j < y_i ) \]

\[dp_{j, 1} = dp_{i, 0} + dp_{j, 1} ( y_j > y_i ) \]

边界条件

\[dp_{i, 0} = 1, dp_{i, 1} = 1 \]

时间复杂度

优秀啊

代码

#include <bits/stdc++.h>
const int MAXN = 1e5 + 20;
const int MOD = 1e9 + 7;
int n, m;

int dp[MAXN][2];

int ans = 0;
struct node
{
    int x, y;

    friend bool operator < (node a, node b)
    {
        return a.x < b.x;
    }
} p[MAXN];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d %d", &p[i].x, &p[i].y);
    }
        
    std::sort(p + 1, p + n + 1);

    for (int i = 1; i <= n; i++)
    {
        dp[i][0] = dp[i][1] = 1;
        for (int j = i - 1; j >= 1; j--)
        {
            if (p[i].y > p[j].y)
            {
                dp[i][0] = (dp[i][0] + dp[j][1]) % MOD;
            }
            else
            {
                dp[j][1] = (dp[i][0] + dp[j][1]) % MOD;
            }
        }
            
    }
    for (int i = 1; i <= n; i++)
    {
        ans = (ans + (dp[i][0] + dp[i][1] - 1) % MOD) % MOD;
    }
        
    printf("%d\n", ans);
    return 0;
}

总结

这说明了有些看似顺序很尴尬的题目,说不定瞎搞搞就能减少一个数量级的复杂度

标签:node,int,T2,day1,雅礼,MAXN,递推,dp,MOD
From: https://www.cnblogs.com/YzaCsp/p/18450382

相关文章

  • Day11-Scanner
    Day11-ScannerScanner介绍Scanner对象:之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。基本语法:Scanners=newScanner......
  • day1
    day1雷暴(storm)题目要求计算覆盖所有相同颜色格子的最小正方形的面积。#include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[1005][1005];structnode{ intx,y;}f[100005],g[100005];intmain(){ freopen("storm.in","r",stdin); freopen(......
  • 雅礼国庆集训 day1 T1 养花
    题面题目下载算法考虑当\(k\)确定的时候如何求答案,显然对于所有形如\([ak,(a+1)k)\)的值域区间,最大值一定是最优的似乎怎么都是\(O(n^2)\)的算法观察到\(a_i\)的值域比较小,所以考虑桶显然对于一段区间\([L,R]\)我们可以推出其\(modk\)的最大值方法......
  • day1
    day1雷暴(storm)题目要求计算覆盖所有相同颜色格子的最小正方形的面积。#include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[1005][1005];structnode{ intx,y;}f[100005],g[100005];intmain(){ freopen("storm.in","r",stdin); freopen(......
  • 电脑运行twincat2扫描ethercat设备并进行控制
    电脑运行twincat2扫描ethercat设备并进行控制安装VMware,安装32位版windows操作系统ed2k://|file|cn_windows_7_enterprise_x86_dvd_x15-70737.iso|2465783808|41ABFA74E57353B2F35BC33E56BD5202|/安装在虚拟机中安装32位带运行时的twincat2软件,安装过程中选择nci版本http......
  • Day10-JavaDoc
    Day10-JavaDocJavaDoc介绍JavaDoc:javadoc命令是用来生成自己API文档的。javadoc是一个工具,它可以读取源代码中的文档注释,并将其转换为格式规范的API文档。javadoc通过解析文档注释中的特定标记,如@author、@version、@since、@param、@return、@throws等,来提取关键信......
  • 【GT240X】【06】Linux文本编辑软件vim
    目录一、说明二、什么是vim?三、vi/vim的使用3.1命令模式3.2输入模式3.3底线命令模式四、vi/vim按键说明4.1 一般模式可用的光标移动、复制粘贴、搜索替换等4.2 一般模式切换到编辑模式的可用的按钮说明4.3一般模式切换到指令行模式的可用的按钮说明一......
  • Day10-域名
    Day10-域名域名是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。例如“www.baidu.com”就是一个域名。它主要由几个部分组成:顶级域名(Top-levelDomain,TLD):如“.com”“.net”“.org”等,代表不同的域名类型或用途。......
  • Day10-包机制
    Day10-包机制包机制Java为更好地组织类而提供的机制,用于区别类名的命名空间。包相当于文件夹包语句的语法格式为:(定义包)packagepkg1[.pkg2[.pkg3...]];一般利用公司域名倒置作为包名。为了能够使用某一个包的成员,需要在Java程序中明确导入该包,使用“import”语句可完......
  • FIT2014 Lexical analysis, Parsing
    FIT2014Assignment2RegularLanguages,Context-FreeLanguages,Lexicalanalysis,Parsing,TuringmachinesandQuantumComputationDUE:11:55pm,Friday4October2024Intheseexercises,youwill•implementalexicalanalyserusinglex(Problem3);•imp......