树状数组总结

单点更新区间查询 HDU 1166

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define LL long long
#define maxn 60000
using namespace std;
int n;
LL va,sum[maxn];
char s[15];
LL getSum(int x)
{
    LL ans = 0;
    for(int i=x;i>0;i-=(i&(-i)))ans+=sum[i];
    return ans;
}
void update(int x,LL va)
{
   for(int i=x;i<=n;i+=(i&(-i)))sum[i]+=va;
}
int main()
{
    int t,i1 = 1;
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d",&n);
      memset(sum,0,sizeof(sum));
      for(int i=1;i<=n;i++)
      {
          scanf("%I64d",&va);
          update(i,va);
      }
      printf("Case %d:\n",i1);
      i1++;
      while(scanf("%s",s))
      {
          int a,b;
          if(s[0]=='E')break;
          else{
            scanf("%d%d",&a,&b);
            if(s[0]=='Q')printf("%I64d\n",getSum(b)-getSum(a-1));
            else if(s[0]=='S')update(a,-b);
            else update(a,b);
          }
      }
      system("pause");
    }
    return 0;
}

HDU 1541 键值和下标反转的题目

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 36000
using namespace std;
int sum[maxn],n,ans1[maxn];
int getSum(int x)
{
    int ans = 0;
    for(;x;x-=(x&(-x)))ans+=sum[x];
    return ans;
}
void update(int x)
{
     for(;x<=maxn;x+=(x&(-x)))sum[x]+=1;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(sum,0,sizeof(sum));
        memset(ans1,0,sizeof(ans1));
        int x,y;
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&x,&y);
            x++;
            ans1[getSum(x)]++;
            update(x);
        }
        for(int i=0;i<n;i++)printf("%d\n",ans1[i]);
    }
    return 0;
}

二维的单点的更新 poj 1195

#include<cstdio>
#include<algorithm>
#include<iostream>
#define maxn 1300
#define LL long long
using namespace std;
int sum[maxn][maxn],n,a,b,c,d,flag;
void update(int x,int y,int va)
{
    for(int i=x;i<=n;i+=(i&(-i)))
        for(int j=y;j<=n;j+=(j&(-j)))
            sum[i][j]+=va;
}
int getSum(int x,int y)
{
    LL ans = 0;
    for(int i=x;i;i-=(i&(-i)))
        for(int j=y;j;j-=(j&(-j)))ans+=sum[i][j];
    return ans;
}
int main()
{
    while(scanf("%d",&flag)!=EOF)
    {
        if(flag==0){
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)sum[i][j] = 0;
        }
        else if(flag==1)
        {
            scanf("%d%d%d",&a,&b,&c);
            a++;
            b++;
            update(a,b,c);
        }
        else if(flag==2)
        {
            scanf("%d%d%d%d",&a,&b,&c,&d);
            a++;b++;c++;d++;
            printf("%d\n",getSum(c,d)-getSum(a-1,d)-getSum(c,b-1)+getSum(a-1,b-1));
        }
        else break;
    }
    return 0;
}

hdu 2852 与二分相结合使用的树状数组查询

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 100005
using namespace std;
int sum[maxn],m,flag,cnt[maxn];
int getSum(int x)
{
    int ans = 0;
    for(;x;x-=(x&(-x)))ans+=sum[x];
    return ans;
}
void update(int x,int va)
{
     for(;x<maxn;x+=(x&(-x)))sum[x]+=va;
}
void binSearch(int L,int am)
{
    int R = maxn-1,ans = - 1,ll = getSum(L-1);
    while(L<=R)
    {
        int mid = (L+R)/2;
        int pre = getSum(mid)-ll;
        if(pre<am)L = mid+1;
        else {ans = mid;R = mid-1;}
    }
    if(ans==-1)printf("Not Find!\n");
    else printf("%d\n",ans);

}
int main()
{
    while(scanf("%d",&m)!=EOF)
    {
        memset(sum,0,sizeof(sum));
        memset(cnt,0,sizeof(cnt));
        while(m--)
        {
           int a,b;
           scanf("%d",&flag);
           if(flag==0)
           {
               scanf("%d",&a);
               update(a,1);
               cnt[a]++;
           }
           else if(flag==1)
           {
                scanf("%d",&a);
                if(!cnt[a])printf("No Elment!\n");
                else {
                    cnt[a]--;
                    update(a,-1);
                }
           }
           else{
             scanf("%d %d",&a,&b);
             binSearch(a+1,b);
           }
        }
    }
    return 0;
}

hdu 3584 多维的区间更新单点查询

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int sum[105][105][105],n,m,flag,cnt[105][105][105];
int getSum(int x,int y,int z)
{
    int ans = 0;
    for(int i=x;i;i-=(i&-i))
         for(int j=y;j;j-=(j&-j))
             for(int k=z;k;k-=(k&-k))ans+=sum[i][j][k];
    return ans%2;
}
void update(int x,int y,int z)
{
     for(int i=x;i<=n;i+=(i&-i))
         for(int j=y;j<=n;j+=(j&-j))
             for(int k=z;k<=n;k+=(k&-k))sum[i][j][k]++;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                {
                  sum[i][j][k] = 0,
                  cnt[i][j][k] = 0;
                }
        while(m--)
        {
            scanf("%d",&flag);
            if(flag){
                int x1,y1,z1,x2,y2,z2;
                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                update(x1,y1,z1);
                update(x2+1,y1,z1);
                update(x1,y2+1,z1);
                update(x1,y1,z2+1);
                update(x2+1,y2+1,z1);
                update(x2+1,y1,z2+1);
                update(x1,y2+1,z2+1);
                update(x2+1,y2+1,z2+1);
            }
            else{
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                printf("%d\n",getSum(x,y,z));
            }
        }
    }
    return 0;
}

多维的区间更新区间查询 设两个树状数组一个存deg[i]累加和,另一个存i*deg[i]累加和
sum[x] = (x+1)*sum1(deg[i])+sum2(i*deg[i]) 1<=i<=x;

<think>嗯,用户问的是AD软件中换层的快捷键。首先,我需要确定AD指的是哪个软件。通常,AD可能指Altium Designer,这是一款常用的电子设计自动化软件,用于电路板设计。所以用户可能是在使用Altium Designer时想要快速切换层,提高工作效率。 接下来,我需要回忆或查找Altium Designer中关于层切换的快捷键。根据之前的知识,Altium Designer中确实有一些快捷键用于切换不同的层。比如,小键盘的数字键可能对应不同的层,例如1是Top Layer,2是Mid Layer 1,依此类推。不过,不同版本可能会有些差异,所以需要确认这一点是否正确。 另外,用户可能还不太清楚如何自定义这些快捷键,或者是否有其他方式快速换层。比如,使用快捷键L调出层设置面板,或者通过Preferences设置自定义快捷键。这可能是用户潜在的需求,想要更灵活地调整快捷键以适应自己的习惯。 还要考虑用户可能的操作环境,比如是否在使用英文版软件,或者是否有安装不同版本的Altium Designer,因为不同版本快捷键可能不同。此外,用户可能对层的概念不太熟悉,比如信号层、电源层、丝印层等,是否需要简要解释这些层的用途,以帮助用户更好地理解换层的意义。 另外,是否有其他相关功能,比如切换层的同时切换走线层,或者如何在多层板中快速跳转,这些也可能是用户需要的信息。比如在布线时按数字键切换层并自动添加过孔,这样的操作是否可行,需要确认正确性。 总结一下,回答需要包括: 1. 常用默认快捷键,如小键盘数字键对应各层。 2. 如何通过快捷键L打开层设置面板。 3. 自定义快捷键的方法。 4. 可能需要注意的版本差异或操作细节。 5. 简要说明层的类型和用途,帮助用户理解为何需要换层。 需要确保信息准确,避免错误,比如Altium Designer是否真的使用小键盘数字键作为默认切换层的快捷键。可能需要查阅官方文档或可靠来源确认。此外,提醒用户如果快捷键不起作用,可能需要检查键盘设置或软件版本,确保兼容性。 最后,组织回答时要结构清晰,分点说明,便于用户理解。如果有不确定的地方,建议用户参考软件帮助文档或官方资源,以确保信息的正确性。</think>在 Altium Designer(AD)中,**换层快捷键**是提高 PCB 设计效率的重要工具。以下是常用操作说明: --- ### 一、默认快捷键 1. **小键盘数字键** - 按下数字键 **1~6** 可快速切换至对应信号层(例如:1=Top Layer,2=Mid Layer 1,依此类推)。 - **+/- 键**:切换至下一层/上一层(需开启小键盘的 Num Lock)。 2. **信号层与平面层切换** - **Shift+Ctrl+鼠标滚轮**:按住后滚动滚轮可快速切换层(需按住快捷键)。 3. **特殊层快捷键** - **L**:打开层设置面板(快速启用/禁用层显示)。 - **Ctrl+Shift+G**:切换到丝印层(Top Overlay)。 - **Ctrl+Shift+M**:切换到阻焊层(Top Solder Mask)。 --- ### 二、自定义快捷键 1. 通过 **Preferences > PCB Editor > Shortcuts** 修改快捷键。 2. 搜索功能关键词(如 `Layer Next`、`Layer Previous`)绑定自定义按键。 --- ### 三、实用技巧 1. **布线时自动换层**: 布线过程中按下对应层数字键,软件会自动添加过孔并切换至目标层。 2. **层高亮显示**: 按 **Shift+S** 进入单层模式,按层数字键可快速高亮特定层。 --- ### 四、注意事项 - 不同版本快捷键可能略有差异,建议通过 **Help > Shortcuts** 确认当前版本设置。 - 若快捷键失效,检查键盘输入法或软件冲突。 如果需要更详细的层管理(如创建/删除层),可通过 **Design > Layer Stack Manager** 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值