启发式合并

本文深入探讨了启发式分治算法在解决特定问题时的应用,包括数组元素唯一性检查、石子堆区间合法性和序列无聊性判断。通过具体实例,讲解了如何利用启发式分治提高效率,达到O(NlogN)甚至O(Nlog^2N)的复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定数组a[],求区间个数,满足区间的数各不同,而且满足maxval-len<=K;

思路:一看就可以分治做,对于当前的区间,从max位置分治。 对于这一层,需要高效的统计答案,那么对短的一边开始统计。

(这个过程很像启发式的逆过程,所以叫做启发式分治)

1,对于数不同,这个可以预处理前缀和后缀的最大区间长度A[],B[]。

2,st表得到区间最大值位置,然后就可以搞了。

题意:给定N,表示N堆石子,每堆石子数为a[],问多少个区间,可以满足“石子总和若为偶数,那么可以两两取来自不同堆的石子,直到取完; 如果为奇数,那么排除其中一个,然后可以两两取来自不同堆的石子,直到取完”。

思路:结论是,如果一个区间的区间和大于等于区间最大值的两倍,则这个区间合法。 考虑分治,我们首先找到区间最大值(为了不重复统计,多个最大值时,统一取最左边的,这个可以ST表示实现),然后考虑跨越这个位置的合法区间个数。枚举一端,另外一段二分即可。

由于分治的性质,我们每次的复杂度要倾向于小的那边,即是一个启发式合并的逆过程,所以启发式分治复杂度是O(NlogN)的,加上二分,这个做法的复杂度是O(Nlog^2N)。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=300010;
int lg[maxn],a[maxn],dp[maxn][20],N;
ll sum[maxn],sum2[maxn],ans;
void RMQ()
{
    rep(i,1,N) dp[i][0]=i;
    for(int i=1;(1<<i)<=N;i++){
        for(int j=1;j+(1<<i)-1<=N;j++){
           dp[j][i]=a[dp[j][i-1]]>=a[dp[j+(1<<(i-1))][i-1]]?
             dp[j][i-1]:dp[j+(1<<(i-1))][i-1];
        }
    }
}
void solve(int L,int R)
{
    if(L>=R) return ;
    int k=lg[R-L+1];
    int Mid=(a[dp[L][k]]>=a[dp[R-(1<<k)+1][k]]?
      dp[L][k]:dp[R-(1<<k)+1][k]);
    if(Mid-L<R-Mid){
        rep(i,L,Mid) {
            int pos=lower_bound(sum+Mid,sum+R+1,sum[i-1]+2LL*a[Mid])-sum;
            ans+=R-pos+1;
        }
    }
    else {
        rep(i,Mid,R) {
            int pos=lower_bound(sum2+N-Mid+1,sum2+N-L+2,sum2[N-i]+2LL*a[Mid])-sum2;
            ans+=N+1-L-pos+1;
        }
    }
    solve(L,Mid-1); solve(Mid+1,R);
}
int main()
{
    lg[0]=-1;
    rep(i,1,maxn-1) lg[i]=lg[i>>1]+1;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N); ans=0;
        rep(i,1,N)
          scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
        rep(i,1,N) sum2[i]=sum2[i-1]+a[N+1-i];
        RMQ();
        solve(1,N);
        printf("%lld\n",ans);
    }
    return 0;
}

题意:一个序列被称作是不无聊的,当且仅当,任意一个连续子区间,存在一个数字只出现了一次,问给定序列是否是不无聊的。

对于一个区间 [l, r] 来说,符合条件时,会存在一个独特的数字位于 m,则对于 i in [l, m-1] and j in [m+1, r],所有 [i, j] 产生的区间必然会符合,则递归下去查找 [l, m-1] 和 [m+1, r] 有没有符合。

这题有趣的地方在于-如何快速得到这个独特数字,不过也不难想地,建出数字的前一个相同和下一个相同。判断该数字在区间是独特时,则前一个和下一个皆不会在区间中。

这样仍不会通过测资,如果是想要接近中间的方式去切割,则会接受 TLE 的残酷事实,当初在想是不是递迴太深还怎么的,这裡留下困惑,根据快速排序的经验,如果切割点在中间是比较好的,复杂度为 O(n log n)。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn],pre[maxn],nex[maxn],n;
map<int,int>R;
bool dfs(int l,int r) {
    if (l >= r) return 1;
    for (int i = 0; i <= (r - l + 1)/2; i++) {
        if (nex[l + i] > r && pre[l + i] < l) return dfs(l, l + i - 1) && dfs(l + i + 1, r);
        if (nex[r - i] > r && pre[r - i] < l) return dfs(l, r - i - 1) && dfs(r - i + 1, r);
    }
    return 0;
}
int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            nex[i] = n + 1;
            pre[i] = 0;
        }
        R.clear();
        for (int i = 1; i <= n; i++) {
            pre[i] = R[a[i]];
            nex[pre[i]] = i;
            R[a[i]] = i;
        }
        if (dfs(1, n)) printf("non-boring\n"); else printf("boring\n");
    }
}

转载于:https://www.cnblogs.com/Accpted/p/11391570.html

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值