nyoj123 士兵杀敌(四)

线段树与树状数组算法详解
本文详细介绍了线段树与树状数组的概念、原理及应用,并通过实例展示了如何使用这两种数据结构解决区间更新与查询问题。重点强调了算法优化与复杂度分析。
 1 #include<stdio.h>
 2 #define N 1000010
 3 struct node{
 4     int l,r;
 5     int inc;
 6 }tree[3*N];
 7 inline void build(int l,int r,int i)
 8 {
 9     tree[i].l=l;
10     tree[i].r=r;
11     if(l<r){
12         int mid=(l+r)>>1;
13         build(l,mid,i<<1);
14         build(mid+1,r,(i<<1)+1);
15     }
16 }
17 inline void add(int l,int r,int inc,int i)
18 {
19     if(l==tree[i].l&&tree[i].r==r){//要是l为0的话就不能这样写了,否则RE,死循环 
20         tree[i].inc+=inc;//加的时候单单加到本段,不往下压 
21         return;
22     }
23     int mid=(tree[i].l+tree[i].r)>>1;
24     if(r<=mid) add(l,r,inc,i<<1);
25     else if(l>mid) add(l,r,inc,(i<<1)+1);
26     else{
27         add(l,mid,inc,i<<1);
28         add(mid+1,r,inc,(i<<1)+1);
29     }
30 }
31 inline int query(int k,int i)
32 {
33     if(tree[i].l<tree[i].r){//查询的时候父辈的inc值往下压,直到压到叶子节点为止 
34         if(tree[i].inc){
35             tree[i<<1].inc+=tree[i].inc;
36             tree[(i<<1)+1].inc+=tree[i].inc;
37             tree[i].inc=0;//记得清零 
38         }
39         int mid=(tree[i].l+tree[i].r)>>1;
40         if(k<=mid) return query(k,i<<1);
41         else return query(k,(i<<1)+1);
42     }
43     return tree[i].inc;//返回此叶子节点的值,也即是结果 
44 }
45 int main()
46 {
47     int a,b,inc,n,q;
48     char cmd[6];
49     scanf("%d%d",&q,&n);
50     build(1,n,1);
51     while(q--){
52         scanf("%s",cmd);
53         if(*cmd=='A'){
54             scanf("%d%d%d",&a,&b,&inc);
55             if(!a) a++;//真像讨论区有人说的那样本题测试数据有Bug,a可能为0,坑爹啊! 
56             add(a,b,inc,1);
57         }else{
58             scanf("%d",&a);
59             printf("%d\n",query(a,1));
60         }
61     }
62     return 0;
63 }
64 //本题貌似用树状数组做更加简洁,以后说吧!!先把线段树搞定!!


贴下最优代码:
 1 #include<cstdio>
 2 #include<cstring>
 3 const int M=1000010;
 4 int data[M];
 5 int Max;
 6 inline int LowBit(int n)
 7 {
 8     return n&(-n);
 9 }
10 void Plus(int n,int value) //前n项每项增加value
11 {
12     while(n>0)
13     {
14         data[n]+=value;
15         n-=LowBit(n);
16     }
17 }
18 int Get(int n) //获取每个位置的值
19 {
20     int sum=0;
21     while(n<=Max)
22     {
23         sum+=data[n];
24         n+=LowBit(n);
25     }
26     return sum;
27 }
28 char cmd[50];
29 int main()
30 {
31     int n,a,b,v;
32     scanf("%d%d",&n,&Max);
33     while(n--)
34     {
35         scanf("%s",cmd);
36         if(!strcmp(cmd,"ADD"))
37         {
38             scanf("%d%d%d",&a,&b,&v);
39             Plus(a-1,-v);
40             Plus(b,v);
41         }
42         else
43         {
44             scanf("%d",&a);
45             printf("%d\n",Get(a));
46         }
47     }
48     
49 
50 }

转载于:https://www.cnblogs.com/shihuajie/archive/2012/08/13/2635785.html

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值