Inversion(hdu 4911)

此题链接单击这里

=================

题意:
有N个数,每次只能和相邻的数交换,只能交换K次,问最少有多少个逆序对(就 是一个数前面有多少个数比它大)。
思路:
用归并排序按升序排列,在排列时记录所有的逆序对。排列完以后用所有的逆序对减K就是行了(注意负数时输出0)

付代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
long long a[110000];
long long b[110000];
long n;
long long cnt;
long long l;
long long k;
void funt(long x,long y)
{
    if(y-x>1){
    long m=x+(y-x)/2;
    long p=x,q=m,i=x;
    funt(x,m);
    funt(m,y);
    while(p<m||q<y)
    {
    if(q>=y||(p<m&&a[p]<=a[q]))
        b[i++]=a[p++];
    else
        {
            b[i++]=a[q++];
              cnt+=m-p;
        }
    }
    for(i=x;i<y;i++)
        a[i]=b[i];
    }
}
int main()
{

    while(scanf("%ld%lld",&n,&k)==2)
    {
        cnt=0;
        memset(b,0,sizeof(b));
        for(long  i=0;i<n;i++)
            scanf("%lld",&a[i]);
        funt(0,n);
        if(cnt>k)
            printf("%lld\n",cnt-k);
        else
            cout<<0<<endl;
    }
}

有问题联系企鹅791267032
邮箱地址….wutanrong@Hotmail.com

<think>好的,用户这次的问题是关于“clock inversion”,也就是时钟反转。我需要先理解用户的具体需求是什么。用户之前询问的是TMS320F28377D芯片的UPP时钟频率,现在转向时钟反转,可能是在配置时钟时遇到了信号同步或时序问题,需要了解时钟反转的作用和配置方法。 首先,我需要回忆时钟反转的基本概念。时钟反转通常指的是将时钟信号的极性反转,即高电平变为低电平,低电平变为高电平。这在数字电路中常用于调整数据的采样边沿,确保数据在正确的时钟边沿被捕获,尤其是在高速接口中,比如SPI、I2C、UART或者像UPP这样的并行接口。 接下来,用户可能是在配置芯片的某个外设时遇到了时序问题,比如数据建立时间或保持时间不满足要求,需要调整时钟极性来优化信号同步。或者在多设备通信中,主从设备的时钟相位需要匹配,避免数据冲突。 然后,我需要查阅TMS320F28377D的技术手册,看看该芯片是否支持时钟反转功能,具体在哪些模块中支持,比如UPP、SPI、CAN等。通常,时钟反转的配置是通过相关外设的寄存器来控制的,比如某个控制位(如CLKINV或CPHA等)来使能时钟的反转。 在之前的对话中,用户提到UPP模块的时钟配置,可能现在的问题也涉及UPP接口的时钟反转。需要确认UPP模块是否支持时钟极性调整,以及如何配置。例如,在UPP的接口配置寄存器中是否有相应的位域来控制时钟的上升沿或下降沿采样。 另外,用户可能需要了解时钟反转的实际应用场景。例如,在SPI通信中,时钟极性和相位(CPOL和CPHA)的组合决定了数据采样的边沿。时钟反转可能对应于改变CPOL的值,从而影响通信的时序。 还需要考虑硬件设计方面的问题,比如时钟信号在PCB布局中的走线是否导致信号相位偏移,通过软件配置时钟反转是否可以补偿这种物理层的延迟或畸变。 此外,用户可能需要具体的配置步骤或代码示例,比如如何设置某个寄存器位来启用时钟反转,以及验证该配置是否生效的方法,比如使用示波器测量时钟信号的实际波形。 最后,需要提醒用户注意时钟频率的限制。反转时钟并不会改变其频率,但需要确保在反转后,时钟的上升沿和下降沿仍然满足外设的时序要求,特别是在高频操作下,边沿的斜率可能影响信号完整性。 总结用户的需求:用户可能在使用TMS320F28377D的某个外设时,遇到了时序问题,希望通过配置时钟反转来调整采样边沿,确保数据的正确捕获。需要解释时钟反转的概念、应用场景、配置方法及注意事项,并结合该芯片的具体寄存器配置进行说明。</think>--- ### **时钟反转(Clock Inversion)技术解析** 时钟反转(Clock Inversion)是数字系统中调整时钟信号相位的一种常见技术,通过反转时钟信号的极性(高电平与低电平互换),改变数据采样或触发的边沿。以下针对TMS320F28377D芯片的时钟反转功能进行详细说明: --- #### **1. 核心概念** - **时钟极性反转**:将时钟信号的高/低电平逻辑取反,例如原时钟上升沿触发变为下降沿触发。 - **作用场景**: - 匹配外部设备的时序要求(如传感器、ADC/DAC)。 - 补偿信号传输延迟或相位偏移。 - 优化高速接口(如SPI、UPP、CAN)的数据建立/保持时间。 --- #### **2. TMS320F28377D中的实现** **a. 外设模块支持** 该芯片的以下模块支持时钟反转配置: - **SPI**:通过`SPICCR.CLKPOL`控制时钟极性。 - **UPP(通用并行接口)**:通过`UPCTL.CLKINV`位实现时钟反转。 - **ePWM**:通过`TBCTL.CLKDIV`分频器中的极性控制。 - **CAN**:在通信位时序配置中调整采样点。 **b. 关键寄存器配置示例** 以**UPP模块**为例,时钟反转配置步骤: 1. 使能UPP模块时钟: ```c SysCtrlRegs.PCLKCR16.bit.UPP_A = 1; // 开启UPP时钟 ``` 2. 配置时钟反转: ```c UppRegs.UPCTL.bit.CLKINV = 1; // 1=时钟反转,0=正常极性 ``` 3. 验证时序: $$ \text{数据采样边沿} = \begin{cases} \text{原时钟上升沿} \rightarrow \text{反转后下降沿} \\ \text{原时钟下降沿} \rightarrow \text{反转后上升沿} \end{cases} $$ --- #### **3. 应用场景分析** - **SPI主从通信**: 若主设备时钟极性(CPOL)为上升沿发送数据,从设备需下降沿采样,则需配置从设备的`CLKPOL=1`实现时钟反转。 时序公式: $$ t_{\text{setup}} = \frac{1}{2} \times T_{\text{CLK}} - \Delta t_{\text{delay}} $$ - **UPP接口与FPGA通信**: 若FPGA在时钟下降沿锁存数据,而UPP默认在上升沿发送数据,则需设置`UPCTL.CLKINV=1`,使UPP时钟下降沿对齐FPGA采样点。 --- #### **4. 硬件设计注意事项** 1. **信号完整性** 时钟反转可能加剧信号边沿抖动,尤其在高速(>50MHz)场景下,需通过以下手段优化: - 缩短PCB走线长度,避免阻抗不匹配。 - 使用差分时钟(如LVDS)减少噪声影响。 2. **时序裕量验证** 使用示波器测量时钟与数据信号的相位关系,确保满足建立时间($t_{\text{setup}}$)和保持时间($t_{\text{hold}}$): $$ t_{\text{setup}} \geq 0.3 \times T_{\text{CLK}}, \quad t_{\text{hold}} \geq 0.2 \times T_{\text{CLK}} $$ --- #### **5. 调试技巧** - **代码验证**:通过CCS的寄存器观察窗口直接检查`UppRegs.UPCTL`或`SPICCR`的值。 - **信号测量**:将UPP时钟引脚映射到CLKOUT(如GPIO24),通过以下代码输出时钟: ```c GPIO_SetupPinOptions(24, GPIO_OUTPUT, GPIO_ASYNC); // 配置CLKOUT功能 CLK_enableClkOut(CLKOUT_SRC_UPP_CLK); // 输出UPP时钟 ``` - **逻辑分析仪**:捕获反转前后的时钟波形(如下示例): - 正常时钟:`____┌─┐____┌─┐____` - 反转时钟:`┌─┐____┌─┐____┌─` --- #### **6. 芯片手册索引** - **时钟反转配置**:《TMS320F2837xD Technical Reference Manual》 - SPI: 第11章(SPI),寄存器`SPICCR.CLKPOL` - UPP: 第15章(uPP),寄存器`UPCTL.CLKINV` - ePWM: 第4章(ePWM),寄存器`TBCTL.CLKDIV[CLKINV]` --- **总结**:时钟反转是解决时序对齐问题的关键手段,需结合具体外设的寄存器配置和硬件信号验证。建议在修改极性后,通过实测波形确认时序裕量是否符合设计要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值