HDU-4351-线段树

POWER SI仿真流程 一、打开软件Power SI二、加载PCB,可以直接使用brd文件,不用再进行格式转换三、check Stackup,与原来的PCB叠层对照一遍,检查数据加载后有没有出错。四、select Nets,加载brd文件后,可能所有的网络都处于使用状态,先在右侧net manager下面右键disable all nets,再使能需要仿真的电源网络(如果要仿真的网络没有归属到电源网络,在其上右键,选classfy as power \ground nets) 阅读详情

这题纠结了好久。

状态转移,预处理的话要1024*1024*10*10,感觉会T,然后发现 9 当成 0 就变成了 512*512*9*9,于是就这么写了。

然后 T 了好久, 然后各种改 , IO加速。能加 inline 的都加 inline 。 依然 TLE 。

后来找一下别人的代码 , 发现 查询的时候 , 我是在每个查询里面 分别再查询 左右值。别人都放一个结构体里面,这样别人的事logN,我的事logN*logN。

改了之后,WA。

想到不能区分 0 和 9 然后尝试各种区分0和9. 各种wa 。

矩阵看来还是要用1024*1024的。不能这么预处理啊。写一个记忆化的函数吧。然后这个想法又迅速被自己泯灭了。我就是不想这么写。烦死了。

后来死的次数多了,就无所谓了 , 曾经被自己否决的预处理 , 试试吧。预处理 1024*1024*10*10。 625ms。瞬间激动之情难以言表。


每一段存 4 个值。本区间的数根val[0, 9]。前缀可达状态Left[0, 1023] 。后缀可达状态Right[0, 1023]。区间可达状态sum[0, 1023]。

状态转移见代码吧。各种亦或。



const int N = 100002;

__int16 tri_one[1030][10]; //tri_one[a][b] 表示 状态a加上一个数b
__int16 tri_sum[1030][1030]; //表示 a 边和 b 左边一定连着。
__int16 val[N<<2], sum[N<<2], Left[N<<2], Right[N<<2];
__int16 bit[10];
int n;

void init()
{
    for(__int16 i=0; i<=9; i++) bit[i] = 1<<i;
}

void in(__int16 &a)
{
    a = 0;
    char ch;
    while(ch=getchar(), ch<'0'||ch>'9');
    while(ch>='0'&&ch<='9') a = a*10+ch-'0', ch=getchar();
}

void inn(int &a)
{
    a = 0;
    char ch;
    while(ch=getchar(), ch<'0'||ch>'9');
    while(ch>='0'&&ch<='9') a = a*10+ch-'0', ch=getchar();
}

inline __int16 to(__int64 x)
{
    if(x==0) return 0;
    x %= 9;
    return x==0?9:x;
}

void make_one()
{
    __int16 a, b;
    for(a=0; a<1024; a++)
        for(b=0; b<=9; b++)
        {
            __int16 ans = 0;
            for(__int16 i=0; i<=9; i++)
            if( a & bit[i] )
            {
                ans |= bit[ to(i+b) ];
            }
            tri_one[a][b] = ans;
        }
}

void make_sum()
{
    __int16 a, b;
    for(a=0; a<1024; a++)
        for(b=0; b<1024; b++)
        {
            __int16 ans = a|b;
            for(int i=0; i<=9; i++)
            if(a&bit[i])
            {
                for(int j=0; j<=9; j++)
                if(b&bit[j])
                {
                    ans |= bit[ to(i+j) ];
                    if(ans==1023) break;
                }
                if(ans==1023) break;
            }
            tri_sum[a][b] = ans;
        }
}

void build(int l, int r, int k)
{
    if(l==r)
    {
        int x;
        inn(x);
        x = to(x);
        val[k] = x;
        x = 1<<x;
        sum[k] = Left[k] = Right[k] = x;
        return ;
    }
    int mi = (l+r)>>1;
    int lk = k<<1, rk = k<<1|1;
    build(l, mi, lk);
    build(mi+1, r, rk);

    val[k] = to(val[lk]+val[rk]);
    Left[k] = Left[lk]|tri_one[Left[rk]][val[lk]];
    Right[k] = Right[rk]|tri_one[Right[lk]][val[rk]];
    sum[k] = sum[lk]|sum[rk];
    sum[k] |= tri_sum[Right[lk]][Left[rk]];

}

struct node
{
    __int16 val, sum, left, right;
};

void query(int l, int r, int ll, int rr, int k, node &p)
{
    if(l==ll && r==rr)
    {
        p.sum = sum[k];
        p.val = val[k];
        p.left = Left[k];
        p.right = Right[k];
        return;
    }
    int mi = (ll+rr)>>1;
    if(r<=mi) query(l, r, ll, mi, k<<1,  p);
    else if(l>mi) query(l, r, mi+1, rr, k<<1|1, p);
    else
    {
        node lp, rp;
        query(l, mi, ll, mi, k<<1, lp);
        query(mi+1, r, mi+1, rr, k<<1|1, rp);
        p.val = to(lp.val+rp.val);
        p.left = lp.left|tri_one[rp.left][lp.val];
        p.right = rp.right|tri_one[lp.right][rp.val];
        p.sum = lp.sum|rp.sum;
        p.sum |= tri_sum[lp.right][rp.left];
    }
}

int main()
{
    int t, tt=0, n, q, l, r, i, j;
    init();
    make_one();
    make_sum();
    inn(t);
    while(t--)
    {
        inn(n);
        build(1, n, 1);

        inn(q);
        printf("Case #%d:\n", ++tt);
        while(q--)
        {
            inn(l), inn(r);
            node p;
            query(l, r, 1, n, 1, p);
            __int16 res = p.sum;
            i=9, j=1;
            for(; ; i--)
            if( res&bit[i] )
            {
                putchar(i+48);
                i--;
                break;
            }
            for(; i>=0 && j<5; i--)
            if(res & bit[i])
            {
                j++;
                putchar(' ');
                putchar(i+48);
            }
            while(j++ < 5)
            {
                putchar(' ');
                putchar('-');
                putchar('1');
            }
            putchar('\n');
        }
        if(t) putchar('\n');

    }
    return 0;
}


fast-lio运行步骤(使用velodyne数据) 使用fast-lio运行velodyne数据 阅读详情

相关推荐

Nvidia Jetson CH340 驱动安装

最近调一个USB设备,Windows系统上是可以安装CH340 驱动使用的,移到Jetson AGX Orin 上发现没有 /dev/ttyUSB* 设备显示。是一个为盲人和视力障碍者提供的终端设备驱动程序,它会在系统启动时自动加载并占用串口设备,导致我们无法正常使用部分串口设备。安装完后,内核中已经有。

Vulcan_S的博客 1639

线段树之逆序数

求逆序数的方法: 1.直接暴力求解 2.线段树求解 需要知道HASH(离散化)。//192和132逆序数是一样的,所以可以映射到一样的情况。 求逆序数的思路:遍历每一个数字,如果这个数字前面有比它大的数字,那么比它大的数字的个数即比他大的区间的sum值,例如a=5,它的逆序数即6-10的sum值。 例题: The inversion number of a given number sequenc...

weixin_42949580的博客 353

python调用海康工业相机并用opencv显示(整体实现)

python语言调用海康机器人(hikrobotics)工业相机 第一章 Python 语言下连接海康工业相机,并获取数据 文章目录 系列文章目录 前言 目录 python语言调用海康机器人(hikrobotics)工业相机 文章目录 前言 一、底层接口的准备 二、使用步骤 1.引入库 2.枚举设备 3.判断设备类型 4.输入连接设备 5.创建相机实例并创建句柄 6.打开设备 7.获取相关参数 8.主动获取图像 9.开启取流并获取每张.

qq_39570716的博客 5万+

逆序对——线段树

逆序对——线段树做法大体思路三道题目Sort it(模板题)Inversion(线段树+离散化)Minimum Inversion Number(线段树+思维)错误提示 大体思路 使用线段树统计逆序对。建立一个空树。注意树的范围,如果数组中的数值很大就需要进行离散化。按照数组从前往后向线段树中插入数字,统计每次插入都要查询线段树(已经插入的数)中,比当前要插入的数大的数字个数。统计出的就是逆序对个数。 三道题目 Sort it(模板题) HDU2689. #include <iostream>

qq_44817002的博客 1824

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

Cisco Packet Tracert 无线路由器配置

Cisco Packet Tracert 无线路由器配置

yushan_caoyu的博客 2万+

【HDOJ】4351 Digital root

digital root = n==0 ? 0 : n%9==0 ? 9:n%9;可以简单证明一下n = a0*n^0 + a1*n^1 + ... + ak * n^kn%9 = a0+a1+..+ak然后,数学归纳易知结论是正确的。因此9个状态就够了,表示%9的结果。这里需要特殊处理0, 表示状态为0。 1 /* 4351 */ 2 #include <iostream&...

weixin_34362875的博客 133

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3546

【BZOJ4540】【Hnoi2016】序列 线段树

Claris劲啊!CA劲啊! %%%两位线段树做法传送门在这里和这里 逆向题解时间到: 首先将询问按照终点排序,并且一边从到遍历,不妨设当前遍历到了点,对于之前的每个点,我们维护两个值和。 其中表示从这个点到之间A的最小值,而,表示从我们遍历第一个点到当前这个点的所有时刻下的所有历史版本和。(事实上。) 不(很)难发现对于每一个询问,当且仅当时,有。也就是说,如果我们把询问全

鲜衣怒马少年郎 3206

【原理图PCB专题】Cadence17.4 PCB位号重排与反标

Cadence17.4 PCB位号重排与反标比Cadence16版本更简单一些,那到底如何操作?

一点硬件 1181

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

Lost Cows_poj_2182(线段树).java

线段树

繁华过后你还有我 1050

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

【HDU 4351】Digital root【线段树】

这道题是考验如何处理一个区间的所有子区间

Hacb的专栏 563

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HDU 4351 Digital root 线段树

裸的线段树。 每个节点记录三个值,假设当前节点表示的区间是[L, R], 记录从L开始往右连续取能取到不同的root值,从R往左连续取能取到不同的root值,在中间取得连续区间的不同的root值 合并的时候也很简单,左儿子从左边全取,然后和右儿子从左边取连续的段的所有情况合并。其他两个同理 比赛时候写漏佢直接将左右儿子的中间段值回传到父亲节点,怨念啊!!!! 如果只这样写会TLE的,注

Troy_Cornelius的专栏 1127

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HDU 4351 (线段树)

#include #include #include using namespace std; #define MAX 100005 int add[1025][11],res[1025][1025]; int val[MAX]; bool flag; struct node { int lsta,rsta,sta; int root; } tree[MAX<<2]; inl

BehappyXiang的专栏 718

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

hdu 4351 Digital root(线段树区间合并)

题意:给出n个数,m组询问,每次

绝望的乐园 842

HDU 4351 Digital root 线段树 区间合并

看了解题报告后说有一种离线不用线段树的做法,表示不解 只会用线段树做 因为题目中所查询的区间,是所有的子区间的结果的并。所以区间合并就很必要了。 每个结点,记录这个区间的和的数根, 记录本区间内从左端点为端点往右的连续区间出现的数根,从右端点为端点往左的连续区间出现的数根,以及整个区间能出现的数根 比赛的时候狂WA一下午。 最后发现查询的时候左右区间合并有问题,查询的时候也需要像push

水 1271

HDU 4351 - Digital root

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4351   这题囧死了~~~    耽搁了几天,终于解决它了~~   0的字根是0。   非0数a的字根是 a%9==0 ? a%9 : 0  。   ===================================================================

诳人居 947

hdu4351 线段树 区间合并

这道题目网上很多题解都是错的,

creater_X 825

HDU 4351 Digital root 线段树区间合并

依然不是十分理解……待考虑…… 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 #define lson l, m, rt << 1 7 #def...

aegt43853的博客 147

HDU 4351 (水过的方法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4351           题意就不描述了,这道题目的标准做法应该是区间合并的线段树,因为比赛的时候想到了能水过的方法,赛后证明是可行的,特意记录说明一下。         题目说明 0         如果数据中有大量连续的0,易知枚举必定会TLE,因此需要构造一个 next

Night__elf 576

hdu 4351 Digital root

http://acm.hdu.edu.cn/showproblem.php?pid=4351   这题是一道稍微复杂的区间合并线段树,因为没有query,可以写成RMQ来降低query的复杂度。   题意不难理解,先解释一下所谓的数字的根是指一个数的各位数字和的各位数字和的各位数字和的各位数字和。。。。直到数只剩一位。数字根有一个性质,就是它如果是非0,最后必然是非0的数;如果这个数模9余d,...

weixin_33885676的博客 86

HDU 4351

区间合并的线段树 #include #include #include #include #define N 100100 #define f(x) ((x)==0?0:((x)%9==0?9:(x)%9)) using namespace std; struct Tree{ int l,r; int ls,rs,all,num; }tree[5*N]; int val[N],

1292765944的专栏 1131

hdu4351 Digital root

Digital root Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) Total Submission(s): 1056    Accepted Submission(s): 328 Problem Description The digital ro

喵呜的Blog 1377
上一篇: 多校五。
下一篇: HDU-4359-DP+C(n, m)大数求
walk_up
博客等级 码龄15年 2粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值