普通视图

发现新文章,点击刷新页面。
今天 — 2025年12月27日首页

【节点】[NormalBlend节点]原理解析与实际应用

作者 SmalBox
2025年12月27日 08:29

【Unity Shader Graph 使用与特效实现】专栏-直达

法线混合技术概述

在实时渲染中,法线贴图混合是增强表面细节表现的重要技术。Unity URP管线内置的NormalBlend节点通过数学运算实现两张法线贴图的平滑过渡,同时确保法线向量的物理正确性。该技术广泛应用于角色装备切换、地形材质融合、动态形变效果等场景,是现代游戏开发中不可或缺的材质处理工具。

节点核心功能解析

混合模式选择

NormalBlend节点提供两种混合算法:

  1. Default模式:采用分量混合策略,对法线贴图的RG通道进行加法混合,B通道进行乘法混合,最后通过标准化处理确保输出为单位向量。适用于简单表面细节的叠加,例如角色装备纹理的混合。
  2. Reoriented模式:通过重新定向算法维持法线方向一致性,采用齐次坐标系转换与向量投影计算,确保混合结果符合物理光照模型。适用于复杂表面处理,如布料模拟与动态形变效果。

端口与参数配置

  • 输入端口
    • A:接收第一张法线贴图数据(Vector3类型)
    • B:接收第二张法线贴图数据(Vector3类型)
  • 输出端口
    • Out:输出混合后的标准化法线向量(Vector3类型)
  • 控件参数
    • Mode:混合模式选择器(Default/Reoriented)

技术实现原理

法线混合数学基础

法线向量是表示表面朝向的数学实体,其核心属性包括:

  • 单位向量性质:长度必须保持为1
  • 插值特性:在片段着色器中由顶点法线插值获得
  • 空间转换:可通过矩阵运算在不同坐标系间转换

标准化处理流程

混合后的法线向量必须经过标准化处理,以确保:

  1. 光照计算的准确性
  2. 阴影生成的正确性
  3. 表面交互的真实性

坐标空间转换机制

NormalBlend节点自动处理切线空间到世界空间的转换:

  • 输入法线默认为切线空间坐标
  • 输出法线根据材质设置自动转换至目标空间
  • 支持对象空间、视图空间、世界空间和切线空间输出

典型应用场景与实现

角色装备法线混合

实现步骤

  1. 准备角色基础法线贴图(A)
  2. 准备装备法线贴图(B)
  3. 使用Default模式进行混合
  4. 通过材质参数控制混合强度

优化技巧

  • 使用纹理采样节点控制混合区域
  • 结合遮罩贴图实现非均匀混合
  • 在关键区域采用Reoriented模式维持方向一致性

地形法线混合

实现步骤

  1. 准备两种地形材质法线贴图(A和B)
  2. 创建混合遮罩纹理
  3. 根据遮罩值动态调整混合比例
  4. 使用Reoriented模式处理复杂过渡

优化技巧

  • 使用渐变纹理控制混合区域
  • 结合高度图实现物理正确的混合
  • 在斜坡区域增强混合强度

动态变形法线处理

实现步骤

  1. 准备基础法线贴图(A)
  2. 准备变形影响法线贴图(B)
  3. 根据变形参数动态调整混合强度
  4. 使用Reoriented模式保持方向一致性

优化技巧

  • 结合顶点动画参数控制混合
  • 使用噪声纹理丰富细节
  • 在形变剧烈区域增加混合强度

性能优化策略

模式选择优化

  • 优先使用Default模式:性能开销较小,适合简单混合
  • 复杂表面使用Reoriented模式:维持方向一致性
  • 混合强度控制:通过材质参数或遮罩贴图动态调整

计算资源优化

  • 限制混合区域:使用遮罩贴图约束混合范围
  • 简化混合模式:在非关键区域采用Default模式
  • 预计算混合:在材质编辑器中预先计算部分结果

平台兼容性优化

  • URP与HDRP差异:URP采用简化光照模型,HDRP支持物理精确材质
  • 版本兼容性:不同Unity版本对ShaderGraph节点的支持可能存在差异
  • 目标平台:移动端优先选用Default模式以降低计算量

常见问题解决方案

混合后出现伪影

原因

  • 混合区域边界处理不当
  • 法线方向不一致
  • 混合强度过高

解决方案

  • 使用遮罩贴图平滑过渡
  • 在关键区域切换至Reoriented模式
  • 降低混合强度或扩展混合区域

性能下降明显

原因

  • 混合区域过大
  • 采用复杂混合模式
  • 在移动端使用高精度混合

解决方案

  • 缩小混合区域
  • 在非关键区域使用Default模式
  • 针对移动端优化混合参数

光照表现异常

原因

  • 混合后法线未正确标准化
  • 混合模式选择不当
  • 法线贴图格式有误

解决方案

  • 确保输出法线经过标准化处理
  • 根据表面复杂度选择合适的混合模式
  • 检查法线贴图格式与生成方式

进阶应用案例

多层级法线混合

实现方法

  1. 构建多个混合层级
  2. 使用遮罩贴图控制各层级混合区域
  3. 逐层混合法线贴图

优势

  • 实现更复杂的表面细节
  • 可调控不同区域的混合强度
  • 提升材质表现力

动态法线混合系统

实现方法

  1. 依据动画参数动态调整混合强度
  2. 使用噪声纹理增添动态细节
  3. 结合顶点动画实现物理正确的混合

应用场景

  • 角色表情变化
  • 布料模拟
  • 动态环境变化

材质系统集成方案

实现方法

  1. 将混合参数暴露给材质系统
  2. 创建材质参数集合以控制混合行为
  3. 实现动态材质切换

优势

  • 增强材质系统的灵活性
  • 支持运行时动态调整
  • 简化美术工作流程

最佳实践总结

  1. 模式选择原则:简单表面使用Default模式,复杂表面使用Reoriented模式
  2. 性能优化优先级:移动端优先考虑性能,PC端可适度增加细节
  3. 质量保障措施:使用标准化工具验证混合结果,确保法线方向正确
  4. 迭代开发流程:从简单混合起步,逐步提升复杂度,并持续验证效果

【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

“药王”替尔泊肽降价七成,降糖减重市场变天了

2025年12月27日 08:00

文|胡香赟

编辑|海若镜

新晋“全球药王”替尔泊肽,在2025年医保新药目录谈判后,价格即将大幅下降。

近期结束的国家医保目录调整中,多款GLP-1产品被纳入,其中就包括礼来的替尔泊肽,用于成人2型糖尿病治疗。

截至目前,国家医保局并未公布谈判价格结果。但在多位内分泌科、代谢科医生的社交媒体中,流传出2026年1月1日后替尔泊肽将执行的新价格,同比大幅下降。不同用量的月费价格(每月4次)分别为:324.1元(2.5mg)、551元(5mg)、751.6元(7.5mg)和936.7元(10mg)。

网传替尔泊肽2026年即将执行的院内新价格

36氪就该价格向礼来方面求证,礼来未予置评,并表示以“医保局官方发布为准”。

另两家开发GLP-1新药的药企人士称,这组替尔泊肽价格数据与其了解的区间接近,“确实降了很多”。

此外,36氪注意到,多个主流电商平台,均已推出替尔泊肽新的预售价格,降幅显著。例如2.5mg*4次剂量的月费在450元-600元不等,较国谈前低了六、七成。一家医药电商平台直接打出了“医保国谈降价、惠及更多患者”的标语。

2025年前三季度,替尔泊肽的全球销售额高达248.37亿美元,同比增长125%,成功问鼎全球“药王”。当这样一款重磅药物大幅降价,进入以“放量”著称的中国医保市场,必将改写国内同类降糖、减重药物的市场格局。

当前,国内已批准的GLP-1类药物达到10款,后续排队等上市的国产品种还有更多。2026年,这一赛道的商业化考验,或更加残酷。

大降价、大放量

京东、美团、拼多多平台上,替尔泊肽新预售价都有了大幅下降,且自2026年1月开始执行,与国家医保目录的正式落地时间高度契合。

“美团官方补贴”入口中,替尔泊肽预售价示意(时间:2025年12月25日中午)

图2:京东上,替尔泊肽新版预售价示意(时间:2025年12月25日中午)

2025年1月,替尔泊肽在国内正式销售之初,2.5mg*4次剂型的院内月费定价约为1700-1800元。由于院外零售和线上电商渠道的价格影响因素更多,较之于院内价格,会略贵一些,同剂型产品的月费约在1800-2000多元不等。

两相对比,可推算替尔泊肽在本次医保中的降幅或达70%。

需要注意的是,无论替尔泊肽还是其他GLP-1类药物,都只有在治疗糖尿病时能使用医保,这体现的是医保持续纳入新型、优质治疗药物的初衷。

而减重适应症,则具有更强的消费属性,通常需要全自费。因此,有药企也会选择为GLP-1药物的减重适应症定更高的价格。

不过,前述GLP-1新药开发人士认为,尽管适应症、商品名不同,但它们本质上是一种药,二者价格存在相互影响。降糖适应症的价格调整,势必会传导至减重适应症领域,进而带动该品类药物价格的整体下行。

替尔泊肽不是最早进入中国市场的GLP-1药物,但凭借更强的减重效果,快速打开了市场认知,并开始普及。不过,由于价格昂贵,挡住了不少消费者的脚步,也让一些国内药企看到了通过价格策略突围的空间。

但医保目录调整后,替尔泊肽与同类型产品间的价差,骤然缩小。

同样以最小剂量在电商上的月费为参考,诺和诺德的司美格鲁肽降糖版、减重版价格,分别为320元和1260元左右。国产品种中,信达生物的玛仕度肽,由于降糖适应症获批时间晚于医保调整报名时间节点,因此还没有进医保,目前最小剂量月费约980多元。银诺医药的长效降糖药依苏帕格鲁肽α注射液,进入医保后的降价情况尚未在各电商渠道呈现。

疗效、医保、价格多重利好下,替尔泊肽是否会占领更多市场份额?

礼来并未在财报中披露产品的区域具体销售情况,但曾10月的财报会议上提到,2025年二、三两季度,替尔泊肽在中国的表现持续向好。11月底,礼来中国总裁德赫兰亲自带队参与医保国谈,可见其对医保市场放量的期待。

此外,替尔泊肽价格大幅降低,与外部竞争局面改变也息息相关。2026年3月,司美格鲁肽在中国的核心专利即将到期,这意味着大量仿制药即将涌入市场,如华东医药、丽珠集团等进展快者,已经处在上市审评阶段。

众多因素叠加,将真正带动GLP-1药物进入低价竞争时代。“比想象中要快。”前述药企人士提到。

后来者怎么办

速度、价格的双重竞争压力下,GLP-1药物的淘汰赛加速到来。

如何在要求更高的市场环境下提高自己的竞争壁垒、把药物卖得更好,是目前仍在牌桌上的GLP-1企业的核心命题。

押注迭代型药物研发和适应症拓展,是大部分药企的常规思路,而且颇有愈演愈烈的趋势。

几大巨头中,有企业强调自研,比如礼来的三靶点GLP-1新药retatrutide在临床试验中的减重效果已经达到29%,超过了替尔泊肽在3期临床中的表现。

也有企业开启大规模并购、BD之路。11月,辉瑞以百亿美元高价拿下Metsera,为的正是后者手里的GLP-1长效月制剂MET-097i。与传统GLP-1药物略有区别,它在激活疗效通路时能做到更精准,或许能达成更高的减重效率和更小的副作用。

值得一提的是,礼来、罗氏同样也有类似技术路线的产品在研。头部跨国药企的共同背书,或代表行业对下一代代谢疾病疗法已经具备初步的共识性判断。

但新药探索需要时间,在此之前,如何把现有药物卖得更好更为关键。2025年以来,GLP-1企业集体拥抱院外零售、线上电商渠道,抢场景、抢流量,赞助各类“全民减重”、“科学减重”活动势。

比如,今年年中,信达生物的玛仕度肽先后获批了降糖、减重两项适应症。产品上市申请获受理到正式获批的1年间,信达为此投入的开发、营销和商业化费用达到近亿元;形式上,则与抖音等平台开展相关打卡活动,增强产品曝光。

近期,信达生物在披露三季度产品收入的公告中称,第三季度产品总收入超33亿人民币,同比增长40%。玛仕度肽为代表的新产品,正是其收入增长的一个驱动力。

虽然产品和渠道竞争都日益激烈,但总量上来看,中国GLP-1药物市场的潜力仍然很大。

中信医药数据称,当前国内市场的渗透率仅为1%,而美国市场高达10%。因此,国内GLP-1市场尚未进入到此消彼长的存量博弈阶段。对那些兼具疗效和高效执行能力的企业来说,仍然存在一起携手做大“蛋糕”、共享红利的空间。

每日一题-会议室 III🔴

2025年12月27日 00:00

给你一个整数 n ,共有编号从 0n - 1n 个会议室。

给你一个二维整数数组 meetings ,其中 meetings[i] = [starti, endi] 表示一场会议将会在 半闭 时间区间 [starti, endi) 举办。所有 starti 的值 互不相同

会议将会按以下方式分配给会议室:

  1. 每场会议都会在未占用且编号 最小 的会议室举办。
  2. 如果没有可用的会议室,会议将会延期,直到存在空闲的会议室。延期会议的持续时间和原会议持续时间 相同
  3. 当会议室处于未占用状态时,将会优先提供给原 开始 时间更早的会议。

返回举办最多次会议的房间 编号 。如果存在多个房间满足此条件,则返回编号 最小 的房间。

半闭区间 [a, b)ab 之间的区间,包括 a 不包括 b

 

示例 1:

输入:n = 2, meetings = [[0,10],[1,5],[2,7],[3,4]]
输出:0
解释:
- 在时间 0 ,两个会议室都未占用,第一场会议在会议室 0 举办。
- 在时间 1 ,只有会议室 1 未占用,第二场会议在会议室 1 举办。
- 在时间 2 ,两个会议室都被占用,第三场会议延期举办。
- 在时间 3 ,两个会议室都被占用,第四场会议延期举办。
- 在时间 5 ,会议室 1 的会议结束。第三场会议在会议室 1 举办,时间周期为 [5,10) 。
- 在时间 10 ,两个会议室的会议都结束。第四场会议在会议室 0 举办,时间周期为 [10,11) 。
会议室 0 和会议室 1 都举办了 2 场会议,所以返回 0 。 

示例 2:

输入:n = 3, meetings = [[1,20],[2,10],[3,5],[4,9],[6,8]]
输出:1
解释:
- 在时间 1 ,所有三个会议室都未占用,第一场会议在会议室 0 举办。
- 在时间 2 ,会议室 1 和 2 未占用,第二场会议在会议室 1 举办。
- 在时间 3 ,只有会议室 2 未占用,第三场会议在会议室 2 举办。
- 在时间 4 ,所有三个会议室都被占用,第四场会议延期举办。 
- 在时间 5 ,会议室 2 的会议结束。第四场会议在会议室 2 举办,时间周期为 [5,10) 。
- 在时间 6 ,所有三个会议室都被占用,第五场会议延期举办。 
- 在时间 10 ,会议室 1 和 2 的会议结束。第五场会议在会议室 1 举办,时间周期为 [10,12) 。 
会议室 1 和会议室 2 都举办了 2 场会议,所以返回 1 。 

 

提示:

  • 1 <= n <= 100
  • 1 <= meetings.length <= 105
  • meetings[i].length == 2
  • 0 <= starti < endi <= 5 * 105
  • starti 的所有值 互不相同

n<=100,代码可以写得简单(比赛时想复杂了)

作者 newhar
2022年9月4日 12:21

由于 $n\le 100$,可以直接按照题目模拟:

  1. 按开始时间排序,依次安排 meetings

  2. 维护每个会议室的 最早可用时间 $t$。每次安排会议$[start, end)$时,将那些 $t$ 早于 $start$ 的会议室的 $t$ 设为 $start$。这样处理后只需从中选择 $t$ 最早的会议室即可(如果有相等的选下标最小的)。

  3. 同时维护 $cnt$ 数组,遍历完成后按要求返回答案即可

###python

class Solution:
    def mostBooked(self, n: int, meetings: List[List[int]]) -> int:
        cnt, t = [0] * n, [0] * n
        
        for [s, e] in sorted(meetings):
            t = list(map(lambda x : max(x, s), t))
            choice = t.index(min(t))
            t[choice], cnt[choice] = t[choice] + e - s, cnt[choice] + 1
            
        return cnt.index(max(cnt))

双堆模拟(Python/Java/C++/Go)

作者 endlesscheng
2022年9月4日 12:07

本题 视频讲解 已出炉,欢迎素质三连,在评论区分享你对这场周赛的看法~


用两个小顶堆模拟:

  • $\textit{idle}$ 维护在 $\textit{start}_i$ 时刻空闲的会议室的编号;
  • $\textit{using}$ 维护在 $\textit{start}_i$ 时刻使用中的会议室的结束时间和编号。

这两类会议室是互补关系,伴随着会议的开始和结束,会议室在这两类中来回倒。

对 $\textit{meetings}$ 按照开始时间排序,然后遍历 $\textit{meetings}$,按照题目要求模拟即可,具体模拟方式见代码。

复杂度分析

  • 时间复杂度:$O(n+m(\log n + \log m))$,其中 $m$ 为 $\textit{meetings}$ 的长度。注意每个会议至多入堆出堆各一次。
  • 空间复杂度:$O(n)$。

相似题目

class Solution:
    def mostBooked(self, n: int, meetings: List[List[int]]) -> int:
        cnt = [0] * n
        idle, using = list(range(n)), []
        meetings.sort(key=lambda m: m[0])
        for st, end in meetings:
            while using and using[0][0] <= st:
                heappush(idle, heappop(using)[1])  # 维护在 st 时刻空闲的会议室
            if len(idle) == 0:
                e, i = heappop(using)  # 没有可用的会议室,那么弹出一个最早结束的会议室(若有多个同时结束的,会弹出下标最小的)
                end += e - st  # 更新当前会议的结束时间
            else:
                i = heappop(idle)
            cnt[i] += 1
            heappush(using, (end, i))  # 使用一个会议室
        ans = 0
        for i, c in enumerate(cnt):
            if c > cnt[ans]:
                ans = i
        return ans
class Solution {
    public int mostBooked(int n, int[][] meetings) {
        var cnt = new int[n];
        var idle = new PriorityQueue<Integer>();
        for (var i = 0; i < n; ++i) idle.offer(i);
        var using = new PriorityQueue<Pair<Long, Integer>>((a, b) -> !Objects.equals(a.getKey(), b.getKey()) ? Long.compare(a.getKey(), b.getKey()) : Integer.compare(a.getValue(), b.getValue()));
        Arrays.sort(meetings, (a, b) -> Integer.compare(a[0], b[0]));
        for (var m : meetings) {
            long st = m[0], end = m[1];
            while (!using.isEmpty() && using.peek().getKey() <= st) {
                idle.offer(using.poll().getValue()); // 维护在 st 时刻空闲的会议室
            }
            int id;
            if (idle.isEmpty()) {
                var p = using.poll(); // 没有可用的会议室,那么弹出一个最早结束的会议室(若有多个同时结束的,会弹出下标最小的)
                end += p.getKey() - st; // 更新当前会议的结束时间
                id = p.getValue();
            } else id = idle.poll();
            ++cnt[id];
            using.offer(new Pair<>(end, id)); // 使用一个会议室
        }
        var ans = 0;
        for (var i = 0; i < n; ++i) if (cnt[i] > cnt[ans]) ans = i;
        return ans;
    }
}
class Solution {
public:
    int mostBooked(int n, vector<vector<int>> &meetings) {
        int cnt[n]; memset(cnt, 0, sizeof(cnt));
        priority_queue<int, vector<int>, greater<>> idle;
        for (int i = 0; i < n; ++i) idle.push(i);
        priority_queue<pair<long, int>, vector<pair<long, int>>, greater<>> using_;
        sort(meetings.begin(), meetings.end(), [](auto &a, auto &b) { return a[0] < b[0]; });
        for (auto &m : meetings) {
            long st = m[0], end = m[1], id;
            while (!using_.empty() && using_.top().first <= st) {
                idle.push(using_.top().second); // 维护在 st 时刻空闲的会议室
                using_.pop();
            }
            if (idle.empty()) {
                auto[e, i] = using_.top(); // 没有可用的会议室,那么弹出一个最早结束的会议室(若有多个同时结束的,会弹出下标最小的)
                using_.pop();
                end += e - st; // 更新当前会议的结束时间
                id = i;
            } else {
                id = idle.top();
                idle.pop();
            }
            ++cnt[id];
            using_.emplace(end, id); // 使用一个会议室
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) if (cnt[i] > cnt[ans]) ans = i;
        return ans;
    }
};
func mostBooked(n int, meetings [][]int) (ans int) {
cnt := make([]int, n)
idle := hp{make([]int, n)}
for i := 0; i < n; i++ {
idle.IntSlice[i] = i
}
using := hp2{}
sort.Slice(meetings, func(i, j int) bool { return meetings[i][0] < meetings[j][0] })
for _, m := range meetings {
st, end := m[0], m[1]
for len(using) > 0 && using[0].end <= st {
heap.Push(&idle, heap.Pop(&using).(pair).i) // 维护在 st 时刻空闲的会议室
}
var i int
if idle.Len() == 0 {
p := heap.Pop(&using).(pair) // 没有可用的会议室,那么弹出一个最早结束的会议室(若有多个同时结束的,会弹出下标最小的)
end += p.end - st // 更新当前会议的结束时间
i = p.i
} else {
i = heap.Pop(&idle).(int)
}
cnt[i]++
heap.Push(&using, pair{end, i}) // 使用一个会议室
}
for i, c := range cnt {
if c > cnt[ans] {
ans = i
}
}
return
}

type hp struct{ sort.IntSlice }
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() interface{}   { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v }

type pair struct{ end, i int }
type hp2 []pair
func (h hp2) Len() int            { return len(h) }
func (h hp2) Less(i, j int) bool  { a, b := h[i], h[j]; return a.end < b.end || a.end == b.end && a.i < b.i }
func (h hp2) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *hp2) Push(v interface{}) { *h = append(*h, v.(pair)) }
func (h *hp2) Pop() interface{}   { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }

模拟

作者 tsreaper
2022年9月4日 12:07

解法:模拟

因为“当会议室处于未占用状态时,将会优先提供给原开始时间更早的会议”,因此有重要性质:会议开始的相对顺序不会改变。我们只需要按顺序模拟每个会议分配给哪个会议室即可。

复杂度 $\mathcal{O}(m\log m + nm)$,其中 $m$ 是会议的数量。具体实现见参考代码,注意会议的结束时间可能超出 int 的范围。

参考代码(c++)

###c++

class Solution {
public:
    int mostBooked(int n, vector<vector<int>>& meetings) {
        int m = meetings.size();
        // 将会议按开始时间排序
        sort(meetings.begin(), meetings.end());
        // 每个会议室被分配了多少会议
        vector<int> cnt(n);
        // 每个会议室的最早可用时间
        vector<long long> tim(n);
        // 按顺序处理会议
        for (auto &meet : meetings) {
            // best 表示当前不可用,但可用时间最早的会议室编号
            int best = 0;
            for (int i = 0; i < n; i++) {
                if (tim[i] <= meet[0]) {
                    // 当前会议室可用,直接分配
                    cnt[i]++;
                    tim[i] = meet[1];
                    goto OK;
                } else if (tim[i] < tim[best]) best = i; // 当前会议室不可用,更新 best
            }
            // 当前没有会议室可用,等待会议室 best 可用再分配
            cnt[best]++;
            tim[best] += meet[1] - meet[0];
            OK: continue;
        }
        // 统计答案
        int ans = 0;
        for (int i = 0; i < n; i++) if (cnt[i] > cnt[ans]) ans = i;
        return ans;
    }
};

也可以使用线段树将复杂度降至 $\mathcal{O}(m\log m + m\log n)$。

参考代码(c++)

###c++

class Solution {
    vector<long long> mino;

    // 修改 pos 位置的值为 val
    void modify(int id, int l, int r, int pos, long long val) {
        if (l == r) mino[id] = val;
        else {
            int nxt = id << 1, mid = (l + r) >> 1;
            if (pos <= mid) modify(nxt, l, mid, pos, val);
            else modify(nxt | 1, mid + 1, r, pos, val);
            mino[id] = min(mino[nxt], mino[nxt | 1]);
        }
    }

    // 求编号最小的,且值小等于 val 的位置
    int query1(int id, int l, int r, int val) {
        if (l == r) return l;
        else {
            int nxt = id << 1, mid = (l + r) >> 1;
            if (mino[id] > val) return -1;
            else if (mino[nxt] <= val) return query1(nxt, l, mid, val);
            else return query1(nxt | 1, mid + 1, r, val);
        }
    }

    // 求值最小的位置在哪里
    int query2(int id, int l, int r) {
        if (l == r) return l;
        else {
            int nxt = id << 1, mid = (l + r) >> 1;
            return mino[nxt] <= mino[nxt | 1] ? query2(nxt, l, mid) : query2(nxt | 1, mid + 1, r);
        }
    }

public:
    int mostBooked(int n, vector<vector<int>>& meetings) {
        mino.resize(n * 4 + 10);
        int m = meetings.size();
        sort(meetings.begin(), meetings.end());

        vector<int> cnt(n);
        for (auto &meet : meetings) {
            // 是否直接有会议室可用
            int x = query1(1, 0, n - 1, meet[0]);
            if (x >= 0) cnt[x]++, modify(1, 0, n - 1, x, meet[1]); // 直接有会议室可用,更新该会议室的可用时间
            else {
                // 没有会议室直接可用,找接下来最早可用的会议室
                x = query2(1, 0, n - 1);
                // 更新该会议室的可用时间
                cnt[x]++;
                modify(1, 0, n - 1, x, mino[1] + meet[1] - meet[0]);
            }
        }

        // 统计答案
        int ans = 0;
        for (int i = 0; i < n; i++) if (cnt[i] > cnt[ans]) ans = i;
        return ans;
    }
};
昨天 — 2025年12月26日首页

中国人民银行:实施更加积极有为的宏观政策,防范化解重点领域风险

2025年12月26日 20:03
36氪获悉,中国人民银行发布《中国金融稳定报告(2025)》报告指出,金融系统将坚持以习近平新时代中国特色社会主义思想为指导,全面贯彻落实党的二十大和二十届二中、三中、四中全会精神,按照中央经济工作会议、中央金融工作会议部署,统筹国内国际两个大局,完整准确全面贯彻新发展理念,加快构建新发展格局,坚持稳中求进工作总基调,实施更加积极有为的宏观政策,防范化解重点领域风险,为实现“十五五”良好开局打牢基础。

淘宝闪购启动“燎原深耕计划”:加大技术投入,助力服务商提质增效、商家持续增收

2025年12月26日 21:26
12月26日,淘宝闪购官方生态餐饮服务商大会在杭州举行,来自全国各地的百余位官方服务商代表、城市运营团队及行业专家出席会议。会上,淘宝闪购宣布启动“燎原深耕计划”,将通过政策扶持、组织建设与AI技术三位一体的系统性支持,持续加大对官方生态伙伴的战略投入,助力服务商运营团队及商家伙伴把握确定性增长,共建高效、韧性、可持续的商家服务新生态。

“光因科技”获亿元级A+轮融资

2025年12月26日 21:13
近日,钙钛矿光伏企业 “光因科技”宣布完成亿元级A+轮融资。本轮融资由启赋资本、神骐资本等投资机构投资。光因科技将此次资金重点用于加速200MW量产线产能释放、拓展3C消费电子与IoT无源终端场景落地。

大烨智能:涉嫌信息披露违法违规被中国证监会立案

2025年12月26日 20:58
36氪获悉,大烨智能公告,公司于2025年12月26日收到中国证监会下发的《立案告知书》,因公司涉嫌信息披露违法违规,根据相关法律法规,中国证监会决定对公司立案。立案调查期间,公司将积极配合中国证监会的各项工作,并履行信息披露义务。目前,公司生产经营正常,上述事项不会对公司的正常生产经营活动产生重大影响。

派瑞股份:因涉嫌信息披露违法违规被中国证监会立案

2025年12月26日 20:56
36氪获悉,派瑞股份公告,公司于2025年12月26日收到中国证监会下发的《立案告知书》,因公司涉嫌信息披露违法违规,中国证监会决定对公司立案。公司自查发现,2024年度一笔销售合同中部分收入存在延期确认的会计处理差错,并已对所涉定期报告进行会计差错更正及追溯调整。目前公司各项经营活动和业务均正常开展,将积极配合中国证监会的各项工作,并持续关注上述事项的进展情况。

上海北京杭州三城全年卖地收入超千亿

2025年12月26日 20:50
截至12月26日,全国住宅用地出让成交总价前十城市包括上海、北京、杭州、成都、南京、南通、武汉、苏州、广州和西安,其中出让金破千亿元的仅有上海、北京和杭州三城。因此,“谁是今年的卖地第一城”,取决于统计口径。仅看公开招拍挂,北京在2025年最后一周完成反超,险胜上海、杭州;若计入协议与遴选出让的全口径,上海则凭借另一条赛道,稳居第一。 (第一财经)
❌
❌