在攻防中,遇到直接拿poc怼,结果返回json有问题,注册失败?
网上大部分poc都是直接上has_admin_role":true
,但在低版本中,user结构体中是int值,所以poc为:has_admin_role":1
先了解一下harbor:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。
作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。
Harbor1.7.6之前版本和Harbor1.8.3之前版本
has_admin_role":true
Post 注册,抓包,post内容加上
1 | POST /api/users HTTP/1.1 |
想一下为什么会有这个漏洞,无非是Post请求包中的has_admin_role值被接受了,没有经过校验。
哎?我们发现他居然不是boolean值,而是int值。那么我们想一下,在语言中,如果判断一个值为真假,就像C没boolean,那int=1
就是真,所以我们把poc稍做修改
注册之后抓包,添加"has_admin_role":1
,不要直接用下面的,因为cookie不一样,建议抓包修改添加"has_admin_role":1
。
1 | POST /api/users HTTP/1.1 |
ok,任意用户注册成功。
利用点:可以先docker login进去,pull下docker环境找敏感信息
]]>1 | 本文记录impdx遇到的问题与解决方案,其中机子是S9+,从8.0升级到了10,所以安卓中的某些机制变化了,比如,从converted 转到2SI ramdisk SAR |
https://wwi.lanzoup.com/b012yl25g
密码:hmup
1.打开 SamFirm
2.Region为CHC,国行的意思,model就是型号,auto勾上,check update,会检查出适合的ROM包,点download下载就可以了,下载后是zip,解压一下。
(小知识:三星的ROM包为定制,tar.md5格式,三星无fastboot模式,准确说改为了download模式)
1.解锁bl,点开设置-关于手机-软件信息-点击编译编号5次,进入开发者设置
2.记一下,你的基带版本,比如我的是 G9650ZCS9FVA4 (后面有用)
3.找到开发者设置中的OEM解锁,直接点开,需要重启设置并清楚数据
4.完成,S9+只需要上面步骤就可以了,20年之后的还需要进入download模式长按音量上键,但S9+不需要。
1.刷入一遍rom包,AP选带ap的,以此类推,csc选择无home
3.刷入完成按住音量下+Bixby+电源键重启,黑屏一瞬间换音量上+bixby+电源键
4.点wipe -> format data 输入yes,格式化data,接着重启到recovery
5.TWRP 完成!要进行下一步可以不用重启
1.TWRP中选择Advanced > Terminal, type: multidisabler
,可以输入mul然后按tab自动补全,回车,出现finsh就是完成
2.点开mtp,用电脑传输g9650_klabit_gsi_V6.5.zip,magisk.zip,magisk.apk
3.点install刷入g9650_klabit_gsi_V6.5.zip
,接着刷入magisk
4.系统中安装magisk.apk
5.会弹出提示,点确认就可以了,期间重启正常,如重启后还需点确认就点。我点了俩次magisk正常运行
6.完成
后面就可以愉快的使用lsposed了。
三星还是比较麻烦的,其他手机一般直接解锁bootload后,可以通过fastboot直接刷入修补后的boot.img,非常方便。最近几款新的kernelsu,superkernelroot也是非常有意思。都是通过内核层面的root。其中superkernelroot值得研究一下,好似是今年刚开源不久。
]]>我,是在一个南方十八线小县城土生土长的。准确说是农村hhh,只不过后来到城里了,生活也不咋样,总体还算幸福。住过别人的储物间,也住过烈士林园旁的一间房间(真的只是一间,吃饭烧饭都在,至于厕所只能在公厕),因它们都比较便宜。
记得母亲身体不好,父亲一人撑起一个家。现在想都不敢想,居然有一整间套房居住,虽然小,但足以。
小学和初中就不多过述,实际上我也忘了许多,依稀记得初中当时有幻影pin,水滴跑pin,跑包。还有一些刷钻,刷vip,刷机,各种原生rom,当时的酷安嘎嘎牛,各路大神,还在suroot的阶段,4.x,其实我还有部2.3.5的机子,那是我安卓版本最低的机子。当然还有游戏,这也导致我从不关心学习,只对科学一门感兴趣。当时好似科学单科180,我可以考150?忘了hhh。
县里只有几所高中,可惜的是,向来学习成绩不好。依稀记得当时中考有好似60%以上的同学只能去职业高中/技校/企业办高中,而我正是其中一员。
到了职高,其实与本科也无缘了,高中幸遇恩师,给我创造了很多不敢想象的条件。在职高中,我可以接触到机房,机房的还原卡,也有一天到晚研究电脑的时间,当时特别对linux感兴趣,试着arch/centos/debian/deepin,可笑的是当时我把debian听成了deepin。中途学了些python,vb,都是些变量赋值循环哈哈哈。当时我有一间小小的实验室,无聊的时候,夜自修也总是在那边捣鼓着各种各样的关于电脑的东西,还搭建了第一个博客,学会了基本的修电脑。当时就想着找个电脑店或者电脑公司,干干修电脑修手机的活,一辈子就这么过去,现在想来真是幸运。
不出意外,就要出意外,高中时病了一年。那一年是深刻的,是幸运的。本该留级,也多亏恩师照顾。最后可以顺利继续上学,继续职高考。
对于我的恩师,他姓鲍,一日为师,终身为父。当然也有其他良师益友,比如曾教我计算机理论的吕老师,是她让我可以面对台下无论多少人,都可以面不改色的说话。高中的老师,都很好,都很不错。遇到这群老师,是我的幸运。
初中也有不错的班主任,他姓方,从不放弃任何一个学生。授课同时也教我们一些做人的道理。从最差的班级,带成最好的班级。不过我则是倒数,实在是让老师们操心了。
初中的记忆是比较深刻的,失去过朋友,是生死离别,我们永远也不不知道意外和明天哪个会先来。甚至都没来得及打个招呼。
其实,我更愿换一种称呼,称他们为先生。他们是真正教书育人的先生。
不出意外,考上了一个大专。当时想的特别简单,随便报。
于是乎,人生的第一所大学。
依稀记得,刚开学有位头发稀少的老师来跟我们说软件技术的课程定位,当时瞄了一眼杂而不精,切没有linux,顿时开怼。后来才知,这是我们当时的教学主任。
开学时普普通通,我一心想好好学习刚开始,追随大众潮流,却不想竞选班委一个都没选上。如此想起之前,我要搞竞赛,我要打ACM,我要当一名合格的程序员。途中认识了一位好友,虽不是本专业,但志同道合。也是后来ACM的队友。
于是狂学c语言,半夜和好友在校内排行榜上的一妹子刷半天榜一,可那些都是简单的水题,什么输入输出,韩信点兵罢了。学了一学期,晚上就到图书馆咖啡厅敲代码,有夜自修就在夜自修敲代码。半夜也在敲。
过了一学期,3月,是个重要的转折点。老师们开始招新,但竞赛是4.16号就开始hhh。当时有很多人报名,选拔赛,我一听说有竞赛,急忙问了工作室地点,直接把台式给搬了过去,一扔,一坐,就开始敲代码。
很遗憾,以我当时的成绩是应该不具备进入的资格。经过正常普高的学生,数学比我好的太多了,思维也比我敏捷。老师看我一天到晚,中午午休,晚上吃晚饭,下课时间都在。给了我一个名额。
进入工作室后,有俩位学长,一位是aa大三准备升本,每天我都可以看到他7:30到,晚上9点准时走。还有一位是bb学长,大二同样准备竞赛。比我可强太多了,我的队友也比我强。
时间很快,第一次竞赛依然是没有什么输出,靠着队友混了个省三。
竞赛就不多讲了,可以看我的竞赛之路
同时,舍友也发生了有趣的变化,以为A同学喜爱游戏开发,就如陈丹青所说:“喜欢游戏开发我操这拦不住的”,他就来学习C#和unity了,为啥学这俩呢,对面我看有个工作室正是unity。还有位B同学,买了几k的课学建模,想来刚好他们可以组一个队伍上去打。还有C同学,本是想着去Android竞赛,可事与愿违。于是便在专升本的道路上一路狂奔。其实我们是6人寝,还有DE同学就在摆烂了。
大一就这么过去了。
大二的时候刚开学,脑子一热,想起以前刷钻那时候,卧槽,我想干网络安全,我想当大黑阔,就如陈丹青所说:“喜欢当大黑阔我操这拦不住的”。泥煤的,队友给我找到了网络安全工作室,不过只有大三一人,之前也没人,也没拿过奖。比起ACM实力纵然弱了不少。但还是为了梦想,义无反顾一头脑扎进去了,10月就开赛,而我9月多刚进去。依稀记得当时一个base64-base32反复解密就有一题flag,就有一个省三。
之后我就有些飘飘自然了。
引用 redateam-notes
例如会把所谓成为一名黑客想象成一种至高的事情, 觉得自己的职业和其他的职业与众
不同, 觉得自己选择了搞安全, 走的路子就和其他搞代码的人不一样了。
再加上外界电影, 电视, 国内武侠小说的渲染, 自媒体人的烘托, 来一两下还好, 来多
了, 妈的, 还真以为自己有点东西了。
这种自认为与众不同的心态, 就是外面的壳。
当沉浸在壳中的时候, 就像逆向的时候, od 调代码, 断点断在了壳上, 壳也做的挺好
的, 调了半天, 觉得自己真牛逼, 实际上壳都没脱掉, 源码都没见到。
妈的, 还真以为自己有点东西了。这个心态是真的傻逼自大。
之后就是新生来喽,之前没有招新。这次一间间教室去串门招新。对了还有游戏开发工作室。舍友已经成功去游戏开发了,我的队友也去了,他说,我的梦想是开发游戏。梦想还是要有的,不然和咸鱼有什么区别。
同时着手工作室建设,搭建wiki
也有了acm的oj,ctf的ctfd。
至此。
很快就大三了,快如初中至高中,高中至大学。
ACM我一人,CTF我一人。便要开始升本了。
幸运的是,大一学弟们有很不错的苗子,比我可强太多了。
大三就没有什么了。
2022.10.4
无论是什么时候,我都是一个追赶者,追赶者前人的脚步。打竞赛也好,学习也罢。
我从来不是一个优秀的人。我这人吧,可以说全是运气。运气好接触到了手机,运气好接触到了好的先生,运气好,进了竞赛,运气好,靠着队友拿了奖,又是靠这运气,拿了一些奖。
现在又在升本中挣扎,这么差的基础,其实我心里也没底,但总得学,总得往前。
从来没有准备好,也不会有准备好的时候。总得往前走。
为什么要写这篇文章?
突然某一天意识到有wiki的存在
那便整一个
还有很多不一一列举了,最终选择了wiki.js
理由是权限严格,同时刚好wiki可以给多个工作室用。多个竞赛用来分享知识点。
1 | sudo yum install -y yum-utils |
测试docker,运行以下俩条命令,显示hello world可以了。
1 | sudo systemctl start docker |
1 | # Create installation directory for Wiki.js |
ufw设置一波,也可以用iptables,firewall都可以。
1 | sudo ufw allow http |
1 | docker start db |
这时候就可以访问了,ip直接访问,默认是只有80端口
1 | docker stop wiki |
注: 访问需要手动加上https,如果想直接重定向,需要进wiki后台更改,有可视化GUI界面
以下是权限分配
w
:write(写入权限) r
:read(读取权限)实现以上需求看图
具体请看 官方文档
x^{x^3}
这种情况需要改为x^{{x^3}}
,因为wiki的多层渲染导致的历史遗留问题。笨鸟
的大专一年竞赛生涯。4月底,这次ACM打完了,竞赛生涯几乎结束了。无论是CTF还是ACM亦或着是蓝桥/信息安全管理与评估等。
身体也越来越发不舒适了,大致还需俩次小手术。
说说ACM吧,来ACM已有一年。
21年3月,当时听说有ACM竞赛工作室,马上就把我那台式给放在了工作室。考核时,我是最后一名卡线而进入工作室的。当时想的,就算不能打竞赛,也要学习,无论在哪里。(其实我很清楚,应该是老师给我放了点小水,不然我不可能来竞赛。)
学习了一个月,队友很给力,把签到题写完拿了一个铜。而我当时苦于dfs,为了n皇后问题学了一周也没太懂,真是蠢到家了。可奇怪的是,那一年只有一个学长和我们这支队拿了铜。后自想来,我也不过是没拿奖的水平罢了。
时隔一年,这次却没有拿奖意料之中。中途的事情,一言难尽。有主观也有客观。
我对ACM是有感情的,我看到很多强校,他们有oj,有资源,有老师,有学校的支持。我们弱校又该如何,根本无法竞争。萌发了OJ的想法,资源暂时用acwing替代,学校的支持不敢渴求。21年的学弟们也成功上线了oj,慢慢在放题目。我想,或许可以下一届举办一场ACM校赛
我的数学只有初中水平。没错,数学这种水平还敢来打竞赛,因为是弱校,也没有多少人竞争。所以重在坚持,中途有其他同学的天赋和智商都比我高,毫不夸张的说他们没有中途放弃,最终都会拿到奖。甚至我连竞赛名额都没有。
来到21年的十月份,接触到了ctf,学了一个月。写了一题签到题,依然是铜牌。
但ctf也是如此,我们是弱校,什么都没有。没有到什么程度么,比ACM还没有。整个学校只有大三一位学长在苦苦支撑。虽然ACM也是hh。于是看到ctfd,也有不错的学弟上线了第一款ctfd。我想,或许可以下一届举办一场CTF校赛。
弱校的资源少的可怜,学的学生也是,在我这届ACM只有包括我俩个人,CTF只有我一人。但好在现如今他们的人数在慢慢变多。
直到现在,信息安全堪堪入门罢了。当然也确定了我所热爱的职业。也算是迟来的幸运,相比于大佬们的初中开始入门信安,我却到了大二才堪堪赶上。
专升本,绕不开的话题,这个社会对于学历的歧视。毫无办法,学历洗白私以为只有考研一条路,但还需看行业。
或许以我的基础无法顺利专升本,尽力而为。有时候挺怕学的太努力把自己送进医院hh。如专升本不成,那便只有一条路,考研。
b级没过,数学初中水平。没有什么捷径,只能一步一个脚印去学。
依稀记得大型甲方如银行招聘,四年制全日制本科及以上。
我希望我的学弟们他们进来可以有好的资源,可以和那些强校正真的去较量。而不是用资源去较量。也不想他们像我一样受资源所制。也不要像我一样,走这么多弯路。如果热爱,希望你们可以尽快进入行业里。无论是信息安全还是开发,还是运维测试。
大专里,我们需保持初心。濯清涟而不妖,出淤泥而不染。即便有花花世界的各种诱惑,我们也需要沉下心来慢慢搞技术,补基础。
80
888 phpmyadmin
8888 宝塔后台,尝试访问因无777权限
22
21
8080
8090
vulhub docker
由于各大搜索引擎没有过多的收录,所以被迫采取主动扫描
Web,80端口直接上扫描器
下载www.zip看看源码(应该是某个师傅打包的?那地方还有webshell),然后都访问一遍康康
先去admin看看,发现有管理员登录和普通登录(弱密码没有尝试)
注册新用户,看到可以更改头像,想到文件上传,尝试上一句话木马。
看到有后缀检测,经多次尝试确认是Content-Type 检测
于是bp抓包绕过
尝试了很多次依然不行,突然想起有源码
虽然没学过php,但根据大概语法以及注释得知大图后面加上了big,而小图(F12看到的)没有big
于是乎访问路径+big.php 发现上马成功
蚁剑进行链接
直接传大马
打开大马
接着从源码和目录文件中翻阅
得知数据库配置文件(不知这一个文件)
连数据库
注意:有俩个数据库
至此web后期不会了,提权没太多了解由于是linux,大马自带的提权也无法使用,至于反弹msf和shell,无公网ip的机器可操作,文件只有www:www组的权限也就是655.
(通过日志可以看到其他师傅的方法)
请注意,大部分知识点都可以在archwiki中找到
archwiki是linux最好用,最全的wiki之一,请学会使用/阅读
1 | sudo 提升到root运行权限 |
shutdown -h now
立刻关机(常用)halt
poweroff
shutdown -h 10
10分钟后自动关机一般我就用着俩
reboot
shutdown -r -h
镜像源:tuna(清华),中科大,163,阿里,搜狐,腾讯,华为
sync表示源在同步中
1 | sudo vim /etc/apt/sources.list |
1 | sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ |
1 | /etc/pacman.d/mirrorlist |
1 | apt update //更新源 |
1 | pacman -Syyu //更新 |
ls
列出目录及文件名
cd
切换目录
pwd
显示目前的目录
mkdir
创建一个新的目录
rmdir
删除一个空的目录
cp
复制文件或目录
touch
创建一个文件
rm
删除文件或目录 千万别sudo rm -rf /*
mv
移动文件与目录
cat
查看文件
unzip
解压zip文件等具体看man/help -v查看解压,后面直接跟压缩包直接解压
Vim 是一个功能非常强大,且具有很强扩展性的编辑器。你只要知道他很牛
就对了
中文文档https://yianwillis.github.io/vimcdoc/doc/help.html
退出 :q
保存 :w
保存退出:wq
强制执行:!
强制保存退出:wq!
插入文本
i
当前位置插入o
下一行位置插入O
上一行位置插入I
光标所在行的最前面插入a
光标后插入A
行尾插入u
撤销
ctrl+r
撤销上一次撤销的行动
复制粘贴 y和p,有y10j这种用法,很棒
有兴趣可以看看https://www.runoob.com/linux/linux-vim.html
1 | Ctrl+G,显示帮助文本 |
ping
默认ICMP
TCPping
走tcp ping
curl
获取web服务器文件,直接在终端显示,比如curl www.baidu.com
(稍微带一下)
有兴趣可以去Google
chmod +x xxx
给予运行权限chmod 777 xxx
一般不这么写,给予任何人的所有权限,读写执行1 | u user 文件所有者 |
左对齐 | 右对齐 | 居中对齐 | 居中对齐 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r– | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | –x | 001 |
0 | 无 | — | 000 |
umask
可以了解一下git init
git 初始化git clone
//克隆项目到本地git add .
//添加所有项目到目前分支git commit -m "更新说明"
//把内容说明添加到本地仓库git push
//将本地仓库提交上去git pull
//将远程仓库同步到本地仓库git diff
//比较暂存区和本地文件区别git config
// git配置,具体看参数git log
// 查看历史提交记录git status
// 查看当前状态git branch xxx
// 创建分支python
默认使用python2
python3
默认使用python3
pip3
//建议使用镜像源,tuna有源,可用-i参数,也可以修改全局
1 | sudo apt fcitx5 |
1 | gcc -o 1.c 1 |
编译内核请参考另一篇文章:https://www.impdx.vip/posts/1017/ 都是基于debian,差别不是很大
1 | https://wiki.archlinux.org/title/Tencent_QQ_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) |
gnome
kde
xfce
lxqt
…等
机器配置高首选kde,花里胡哨美化效果好
其次gnome上手即可用,
机器配置差建议xfce,lxqt等
后期看情况更新本文
刚装好arch因为keepass选择了webdav,所以需要坚果云同步。
报错为 Nutstore meets some problems. You may try to restart it to fix. If it still
之后同步直接闪退,由于log加密所以发邮件给官方,官方回复,配置中文编码和字体
1 | ----------- |
1 | vim /etc/locale.gen |
1 | zh_CN.GB18030 GB18030 |
2.重新编译locale-gen
3.安装中文字体pacman -S wqy-zenhei
(参考archwiki https://wiki.archlinux.org/title/Fonts_(简体中文))
算法原理
1、数据填充
对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。
填充方法:在消息后面进行填充,填充第一位为1,其余为0。
2、添加消息长度
在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。
在此步骤进行完毕后,最终消息长度就是512的整数倍。
3、数据处理
准备需要用到的数据:
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,
重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。
1 | 运算(6 & 2) |
具体计算的实现较为复杂,建议查阅相关书籍。
接着分组进行循环运算,最后换位就变成了加密MD5
用来检验文件是否被修改,通常和sha1或者sha256配合检查,比如txt文件中修改了一个字母,那么他的md5会完全不相同。
对于某些明文密码传输,需要保护,普通加密方式具有可逆性,但是MD5不可逆。但常常不会单独使用MD5进行,因为通常的密码都可以通过撞库来获取(撞库:通过用空间换时间的方式,由于MD5的唯一性,我可以用计算机跑出任何字符串的MD5,比如12345的MD5,可以跑出来,也可以通过别人分享来获取)
例子只演示MD5在PHP中的漏洞
什么是弱类型,众所周知PHP是一门弱语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量的值转换为正确的数据类型,但在这个转换过程中就有可能引发一些安全问题。
当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.',‘e’,'E’并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
题目来自于bugku
https://ctf.bugku.com/challenges/detail/id/94.html
一进去我们可以看到题目是用MD5,同时用?a=a显示false。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以"0E"开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以"0E"开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
输入 a=s1885207154a
成功绕过
最后附上c++版本的MD5实现
1 |
|
1 | E9:D :D 7=28L2H`abcN |
上面中的%$等符号
centos7:https://mirror.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ (这里采用tuna[清华源])
1 | su //提升到root权限 |
1 | sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ |
1 | sudo yum makecache |
1 | sudo yum install mariadb* |
1 | systemctl start mariadb |
1 | 将下载好的DVWA-master.zip解压 |
1 | 在html文件夹中 |
1 | mysql -u root -p //进入数据库,初始化是回车进入,如果进入不了就先启动一下mariadb服务 |
此时重启一下mysql服务:systemctl restart mariadb
1 | #vim config.inc.php |
systemctl restart mariadb //重启数据库
systemctl restart httpd //重启apache
systemctl stop firewalld //关闭防火墙
setenforce 0 //关闭selinux
最后去浏览器测试一下网址http://ip/DVWA/login.phpip是centos的ip用户名是admin,密码是password创建一下就可以了
]]>1.看清题目,主要有俩个操作,合并和查询 。 总体思路是找到俩个祖宗节点,并且把俩个祖宗节点相连(其实就是改p[a的祖宗]=b的祖宗 比如p[3]=4,p[3]=p[4]=4,他们的祖宗都是4,)
2.合并是在一个数组中,利用下标和他所指向的值,如果他所指向的值一样,那么就是一个集合。用下表来记录具体数据。
3.查询直接查询祖宗节点,很好理解,就是比如说查询x,他就会查询p[x]的值,如果和x不一样,会查询find[p[x]]的值,这里有点绕,x如果和p[x]的值不一样,就查询find(p[x]),一个个找,找到祖宗节点,就是x和p[x]一样的节点,原始节点。
主要操作就是针对于祖宗节点进行的。
题目难点(个人愚见):find函数,寻找祖宗节点的过程,下标和值的用法。
1 | #include <iostream> |
https://www.acwing.com/problem/content/description/789/
2021/4/19 21:10
1 | #include <iostream> |
https://www.acwing.com/problem/content/description/800/
1 | sum[i]=a[1]+a[2]+a[3].....a[i]; |
可以根据以上结果推出公式a[n] = a[n-1] + a[n]
差分就是前缀和的逆运算。关系如下
如果 前缀和可以表示为f(x)=d 查分就是d=f(x)
具体看以下推理
1 |
|
1 | 核心部分 |
1 | 核心部分 |
1 | 核心部分 |
b[x1][ y1 ] +=c ; 对应图1 ,让整个a数组中蓝色矩形面积的元素都加上了c。
b[x1,][y2+1]-=c ; 对应图2 ,让整个a数组中绿色矩形面积的元素再减去c,使其内元素不发生改变。
b[x2+1][y1]- =c ; 对应图3 ,让整个a数组中紫色矩形面积的元素再减去c,使其内元素不发生改变。
b[x2+1][y2+1]+=c; 对应图4,让整个a数组中红色矩形面积的元素再加上c,红色内的相当于被减了两次,再加上一次c,才能使其恢复。
1 | 自个儿推 |
输入一个长度为 n的整数序列。
接下来再输入 m
个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l
个数到第 r个数的和。
输入格式
第一行包含两个整数 n 和 m。
第二行包含 n个整数,表示整数数列。
接下来 m
行,每行包含两个整数 l 和 r,表示一个询问的区间范围
输出格式
共 m行,每行输出一个询问的结果。
数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
1 | #include <iostream> |
输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。
接下来 n行,每行包含 m个整数,表示整数矩阵。
接下来 q行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。
输出格式
共 q行,每行输出一个询问的结果。
数据范围
1≤n,m≤1000
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
输出样例:
17
27
21
1 | #include <iostream> |
输入一个长度为 n的整数序列。
接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n
和 m。
第二行包含 n个整数,表示整数序列。
接下来 m行,每行包含三个整数 l,r,c,表示一个操作。
输出格式
共一行,包含 n个整数,表示最终序列。
数据范围
1≤n,m≤100000
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
1 | 6 3 |
输出样例:
1 | 3 4 5 3 4 2 |
1 | #include <iostream> |
输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。
每个操作都要将选中的子矩阵中的每个元素的值加上 c。
请你将进行完所有操作后的矩阵输出。
输入格式
第一行包含整数 n,m,q。
接下来 n行,每行包含 m个整数,表示整数矩阵。
接下来 q行,每行包含 5 个整数 x1,y1,x2,y2,c,表示一个操作。
输出格式
共 n行,每行 m个整数,表示所有操作进行完毕后的最终矩阵。
数据范围
1 | 1≤n,m≤1000, |
输入样例:
1 | 3 4 3 |
输出样例:
1 | 2 3 4 1 |
1 | #include <cstdio> |
https://www.acwing.com/problem/content/description/790/
1 | #include <iostream> |
https://www.acwing.com/problem/content/description/167/
1.排序优化 //可略过,不加也可以ac
2.让猫坐满一辆车
3.开新的车
4.重复2-3
1.确定参数 (int u(第几只猫),int k(第几辆车))
2.跳出条件 (u==n) 当猫走完时,跳出,n为总得猫数量,已经枚举完最后一个猫了。所以跳出,为什么是u==n,因为数组是从0开始的,最后一个猫为n-1。
3.判断当前这只猫,简称u猫(判断u猫能不能放在之前的车中)
for循环,枚举第一辆车到现在所有的车
如果可以放得下u猫,则进入新的dfs(u+1,k)
(u+1,k),
可以放得下猫所以车辆数不变,k就不变,u猫被放进去了,下一只猫就是u+1猫。
1 | for(int i=0;i<k;i++) |
dfs(下一只猫,下一辆车)
1 | car[k]=a[u]; |
1 | #include <bits/stdc++.h> |
模拟机器人走路,在符合条件的情况下,上下左右走,走到符合条件的格子,标记/累加。走完即可。
1.越界情况,x,y的值得在符合二维数组范围的情况下进行
2.走过的点,不需要累加/标记
3.x,y坐标相加是否大于k的时
最近看到一条定理:一直在变化的数,就可以用于dfs的参数。
这里我选择了,x,y坐标的值作为dfs的参数
1 | 是否可以直接遍历出x,y相加的值, |
1 | class Solution { |
1 |
|
±/* 我就不介绍了
%余数运算符,整除后的余数
B%A 将得到 3
1 |
|
变量名++; // 表示在本次使用变量后再自增;
++变量名; // 表示在本次使用变量前自增;
变量名–; // 表示在本次使用变量后再自增;
–变量名; // 表示在本次使用变量前自减;
其实很简单,无论是i++还是++i,i这个变量一定会变,那么i++与++i有什么不同呢?
i++这个式子的值还是i,++i式子的值是i+1,不同的是式子的值
字符串(字符数组)不能使用赋值运算符。
运算符 | 描述 |
---|---|
= | A=B |
+= | A+=B;A=A+B |
-= | A-=B;A=A-B |
*= | A*=B;A=A*B |
/= | A/=B;A=A/B |
%= | A%=B;A=A%B |
sizeof是C语言的关键字,它用来计算变量(或数据类型)在当前系统中占用内存的字节数。
sizeof不是函数,产生这样的疑问是因为sizeof的书写确实有点像函数,sizeof有两种写法:
1 | sizeof(数据类型); |
1 | printf("%d",sizeof(a)); //输出a的占用字节数 |
1 | == = |
1 | if (a>-1 && a<0) //表示只有满足俩个条件时才继续运行 |
1 | if (a>-1 || a<0) //表示满足其中一个条件时才继续运行 |
1 | if (!(a>-1)) //表示不满足此条件时运行 |
此文章仅作为网站更新日志
2022.1.23
2021.7.22 22:33
2021.7.22
2020年 太久远了 没有记录哦^_^