2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻
2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色,
它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上,
一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻转,
那么这个范围上的每一颗棋子的颜色也就都改变了,
请在每次操作后,求这n个棋子中,黑色向上的棋子个数。
1 <= n <= 10^18,
1 <= q <= 300,
0 <= 每一条操作的L、R <= n - 1,
输出q行,每一行一个整数,表示操作后的所有黑色棋子的个数。
注意 : 其实q <= 10^5也可以通过,360考试时候降低了难度。
来自360。
答案2022-12-28:
动态开点线段树。
这道题用rust和shell都不好写,所以用golang。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
N := 1000
testTimes := 5000
opTimes := 500
fmt.Println("功能测试开始")
for i := 0; i < testTimes; i++ {
n := rand.Intn(N) + 1
right := NewRight(n)
dst := NewDynamicSegmentTree(n)
pass := true
for j := 0; j < opTimes; j++ {
a := rand.Intn(n)
b := rand.Intn(n)
l := getMin(a, b)
r := getMax(a, b)
right.reverse(l, r)
dst.reverse(l, r)
if right.blacks() != dst.blacks() {
pass = false
return
}
}
if !pass {
fmt.Println("出错了!")
break
}
}
fmt.Println("功能测试结束")
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func getMin(a, b int) int {
if a < b {
return a
} else {
return b
}
}
// 为了测试
// 暴力方法
type Right struct {
white []bool
}
func NewRight(n int) *Right {
return &Right{white: make([]bool, n)}
}
func (this *Right) reverse(l, r int) {
if l <= r {
for i := l; i <= r; i++ {
this.white[i] = !this.white[i]
}
}
}
func (this *Right) blacks() int {
ans := 0
for _, s := range this.white {
if !s {
ans += 1
}
}
return ans
}
// 正式结构的实现
// 动态开点线段树
// 1 ~ 10^18 -> node
// l ~ r -> node
// l ~ r -> sum(黑子的数量)
// l ~ r -> 当前有没有翻转的动作需要往下传
type Node struct {
sum int
change bool
left *Node
right *Node
}
func NewNode(len int) *Node {
ans := &Node{}
ans.sum = len
ans.change = false
return ans
}
// n = 10^18
// DynamicSegmentTree dst = new DynamicSegmentTree(n);
// int[] c1 = {4, 4000万} dst.reverse(c1[0], c1[1]) -> dst.blacks
// int[] c2 ...
// ...
// c1 [l, r] 翻转, 数量 1~n
// c2 [l, r] 翻转, 数量 1~n
type DynamicSegmentTree struct {
// 1 ~ n
root *Node
size int
}
func NewDynamicSegmentTree(n int) *DynamicSegmentTree {
ans := &DynamicSegmentTree{}
ans.root = NewNode(n)
ans.size = n
return ans
}
func (this *DynamicSegmentTree) blacks() int {
return this.root.sum
}
// l++ r++
// 0, 7 -> 1,8
// 4, 19 -> 5, 20
// 19, 4 -> 不操作
func (this *DynamicSegmentTree) reverse(l, r int) {
if l <= r {
l++
r++
this.reverse0(this.root, 1, this.size, l, r)
}
}
// l...r 线段树范围 s...e 任务范围
// Node cur
func (this *DynamicSegmentTree) reverse0(cur *Node, l, r, s, e int) {
if s <= l && r <= e {
cur.change = !cur.change
cur.sum = (r - l + 1) - cur.sum
} else {
m := (l + r) >> 1
this.pushDown(cur, m-l+1, r-m)
if s <= m {
this.reverse0(cur.left, l, m, s, e)
}
if e > m {
this.reverse0(cur.right, m+1, r, s, e)
}
this.pushUp(cur)
}
}
func (this *DynamicSegmentTree) pushDown(cur *Node, ln, rn int) {
if cur.left == nil {
cur.left = NewNode(ln)
}
if cur.right == nil {
cur.right = NewNode(rn)
}
if cur.change {
cur.left.change = !cur.left.change
cur.left.sum = ln - cur.left.sum
cur.right.change = !cur.right.change
cur.right.sum = rn - cur.right.sum
cur.change = false
}
}
func (this *DynamicSegmentTree) pushUp(cur *Node) {
cur.sum = cur.left.sum + cur.right.sum
}

2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻的更多相关文章
- 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)
读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...
- hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。
/** 题目:A Simple Nim 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作 ...
- 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L<R<=n; 如果选过L,R这两个位置,那么以后选择的L,R都不可以再选择这两个位置。最多操作m次,求可以获得的 最大贡献和。
Partial Sum Accepted : Submit : Time Limit : MS Memory Limit : KB Partial Sum Bobo has a integer seq ...
- Django之model F/Q以及多对多操作
model之F/Q操作 F操作,使用查询条件的值 打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块: from django.db.m ...
- Codeforces Round #304 (Div. 2) B. Soldier and Badges【思维/给你一个序列,每次操作你可以对一个元素加1,问最少经过多少次操作,才能使所有元素互不相同】
B. Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standa ...
- jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax
jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...
- [置顶] MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...
- 前端笔记之服务器&Ajax(中)MySQL基础操作&PHP操作数据库&Ajax
一.数据库基础 1.1什么是数据库? 什么是数据库? 答:就是一个很大的一个文件,只不过这个文件可以通过一些‘命令’操作数据: 增.删.改.查数据: 数据库等于持久数据和数据操作的一个统称. 数据库是 ...
- Jedis操作Redis--Key操作
/** * Key(键) * DEL,DUMP,EXISTS,EXPIRE,EXPIREAT,KEYS,MIGRATE,MOVE,OBJECT,PERSIST,PEXPIRE,PEXPIREAT,PT ...
- redis 原生操作 & python操作redis
一.基本介绍 1.简介 Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...
随机推荐
- TortoiseGit自动保存用户名和密码
在使用TortoiseGit上传时,会多次提示输入用户名和密码,采用以下方法解决 1.桌面点击右键 -> 选择TortoiseGit -> 点击settings 2.点击选择Git 3.点 ...
- [ABC284F] ABCBAC(字符串哈希)
思路 这里我们要注意以下几点: 字符串哈希自然溢出(\(\pmod 2^64\))会被卡,会\(WA~5\)个点 注意有模数的时候不要用\(unsigned\ long \ long\)类型 代码 # ...
- mysql 的存储过程
定义不带参数的存储过程 CREATE PROCEDURE s1() BEGINselect * from ecs_admin_action;End call s1; 2.带输入参数的 create P ...
- Java-14流Stream【创建一个简易for循环工具】
Java-14流Stream 构造简易的循环取代for IntStream类提供了一个range()方法,可以生成一个流----由int值组成的序列 import static java.util.s ...
- Django+bootstrap+layui集成
一.django项目搭建:1.Python安装2.下载Django解压到Python安装目录G:\python3.7.4\3.cmd G:\python3.7.4\Django-4.0.5 执行 py ...
- 开学考--MIS系统(javaweb的开学练习--网络新闻发布系统)
关于本次考试的相关理解 看到题目的时候,第一反应是这道题不难,之前已经做过十分类似的题目了,然后对于难度是很有自信的(当然,对于用户的权限管理部分,还是很懵): 而第二反应就是,题量挺大的,我在这有限 ...
- 全球IP whois信息获取与情报挖掘
全球IP的whois信息获取与情报挖掘 什么是whois信息? Whois是一种网络协议,也是一种网络服务,能够让客户端查询域名或者IP是否注册,以及注册人的相关信息.我们通常所说的whois信息就是 ...
- 《操作系统导论》读书笔记1——CPU虚拟化,进程
系列文章目录和关于我 一丶CPU的虚拟化 一个桃子,我们称之为物理(physical)桃子.但有很多想吃这个桃子的 人,我们希望向每个想吃的人提供一个属于他的桃子,这样才能皆大欢喜.我们把给每个 人的 ...
- MyBatis 分页(前后端插件)实现
一.后端使用 PageHelper插件 [1]引入 PageHelper jar包(Maven项目) 1 <dependency> 2 <groupId>com.github. ...
- SQL优化(二)-- 慢查询
1.慢查询日志 MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说 ...