【模板】三维偏序

本文深入解析CDQ分治算法,通过实例演示如何利用该算法处理三维数据,实现高效查询与更新。文章详细介绍了算法步骤,包括按特定维度排序、使用树状数组进行预处理及查询操作,为读者提供了一种解决复杂数据结构问题的新思路。

 

CDQ分治

首先按a排序,分成两段后再分别对两段按b排序,这样就保证了w[x2].a>=w[x1].a,消去一维

按b排序后找到w[x2].b>=w[x1].b的同时满足w[x2].c>=w[x1].c的值

按b排序后有单调性,所以b可以在O(n)时间,对于c,每找到一个w[x1]满足b的条件,则在树状数组中+1

w[x2].ans+=query(w[x2].c)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Node
 7 {
 8     int a,b,c,cnt,ans;
 9 }w[100001];
10 int m,n,c[2000001],ans,f[100001];
11 bool cmp2(Node a,Node b)
12 {
13     if (a.b==b.b)
14      return a.c<b.c;
15      else return a.b<b.b;
16 }
17 bool cmp1(Node a,Node b)
18 {
19     if (a.a==b.a)
20      return cmp2(a,b);
21      else return a.a<b.a;
22 }
23 void add(int x,int d)
24 {
25     while (x<=m)
26     {
27      c[x]+=d;
28      x+=(x&(-x));
29     }
30 }
31 int query(int x)
32 {int s=0;
33     while (x)
34     {
35      s+=c[x];
36      x-=(x&(-x));
37     }
38   return s;
39 }
40 void cdq(int l,int r)
41 {int r1,r2;
42     int mid=(l+r)/2;
43     if (l==r)
44     return;
45      cdq(l,mid);cdq(mid+1,r);
46      sort(w+l,w+mid+1,cmp2);
47      sort(w+mid+1,w+r+1,cmp2);
48      r1=l;r2=mid+1;
49      while (r2<=r)
50      {
51         while (r1<=mid&&w[r1].b<=w[r2].b)
52          add(w[r1].c,w[r1].cnt),r1++;
53          w[r2].ans+=query(w[r2].c);
54         r2++;
55      }
56     for (int i=l;i<=r1-1;i++)
57     add(w[i].c,-w[i].cnt);
58 }
59 int main()
60 {int i,j,num=0;
61     cin>>n>>m;
62     for (i=1;i<=n;i++)
63     {
64       scanf("%d%d%d",&w[i].a,&w[i].b,&w[i].c);
65       w[i].cnt=1;
66     }
67     sort(w+1,w+n+1,cmp1);
68     for (i=1;i<=n;i++)
69     {
70         int k=i+1;
71         while (w[i].a==w[k].a&&w[i].b==w[k].b&&w[i].c==w[k].c)
72          k++;
73          num++;
74          k--;
75          w[i].cnt+=k-i;
76          w[num]=w[i];
77          i=k;
78     }
79     cdq(1,num);
80     for (i=1;i<=num;i++)
81     f[w[i].ans+w[i].cnt-1]+=w[i].cnt;
82     for (i=0;i<n;i++)
83     printf("%d\n",f[i]);
84 }

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/7406116.html

STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动内容概要:本文档为一份关于STM32电机控制的无传感器版本代码注释资源,聚焦于龙贝格观测器在永磁同步电机(PMSM)无感控制中的应用。内容涵盖三电阻双通道AD采样技术、前馈控制、弱磁控制及斜坡启动等关键控制策略的实现方法,旨在通过详细的代码解析帮助开发者深入理解基于STM32平台的高性能电机控制算法设计与工程实现。文档适用于从事电机控制开发的技术员,重点解析了无位置传感器控制下的转子初始定位、速度估算与系统稳定性优化等问题。; 适合群:具备一定嵌入式开发基础,熟悉STM32平台及电机控制原理的工程师或研究员,尤其适合从事无感FOC开发的中高级技术员。; 使用场景及目标:①掌握龙贝格观测器在PMSM无感控制中的建模与实现;②理解三电阻采样与双AD同步采集的硬件匹配与软件处理机制;③实现前馈补偿提升动态响应、弱磁扩速控制策略以及平稳斜坡启动过程;④为实际项目中调试和优化无感FOC系统提供代码参考和技术支持; 阅读建议:建议结合STM32电机控制硬件平台进行代码对照阅读与实验验证,重点关注观测器设计、电流采样校准、PI参数整定及各控制模块之间的协同逻辑,建议配合示波器进行信号观测以加深对控制时序与性能表现的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值