当前位置: 首页 > 知识库问答 >
问题:

子数组中两个数字的相同出现(连续)

徐正雅
2023-03-14
int get_total(int* a,int x,int y,int n){
    int result=0;
    for(int i=0;i<n;i++){
        int x_c=0,y_c=0;
        for(int j=i;j<n;j++){
            if(a[j]==x){
                x_c++;
            }
            if(a[j]==y){
                y_c++;
            }
            if(x_c==y_c){
                result++;
            }
        }
    }
    return result;
}

int main(){
    int n,q;
    cin >>n >>q;
    int a[n];
    for(int i=0;i<n;i++){
        cin >>a[i];
    }
    while(q--){
        int x,y;
        cin >>x >>y;
        cout <<get_total(a,x,y,n)<<"\n";
    }
}

对于每个查询,它都在n^2中运行。最大数组大小为8*10^3,最大查询数为10^5

共有1个答案

郎刚捷
2023-03-14

创建辅助数组x_y_diffs,其实质是:

#(times_x_appeared_thus_far) - #(times_y_appeared_thus_far)

并且可以计算为:

x_y_diffs[0] = 0
x_y_diffs[i] = x_y_diffs[i-1] + 1         if array[i-1] == x
               x_y_diffs[i-1] - 1         if array[i-1] == y
               x_y_diffs[i-1]             otherwise

很容易看出它可以在线性时间内计算出来。

std::map<int, int> histogram;
int count = 0;
for (int x : x_y_diffs) {
  count += histogram[x];
  histogram[x] = histogram[x] + 1;
}
 类似资料:
  • 本文向大家介绍详解JS取出两个数组中的不同或相同元素,包括了详解JS取出两个数组中的不同或相同元素的使用技巧和注意事项,需要的朋友参考一下 1、取出两个数组的不同元素 (1)concat() 方法:用于连接两个或多个数组。  该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本,例: (2)Array filter() 方法: 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所

  • 标题输出: 车身输出: 有人能解决这个问题吗?我尝试了不同的命令来合并这两个(包括堆栈),我得到了同样的错误。虽然尺寸(列)看起来是一样的。

  • 我有一个使用iReport在jasper报告2.0.4中创建的报告。我有两个子报告。这两个子报告共享相同的jrxml。我在参数中传递jrxml作为子报告的报告表达式。我有这个参数的代码 一切都很好。问题出在两个子报表数据源上 这些子报表的数据源来自作为参数传递的同一个POJOs列表 以下是两个子报表的子报表jrxml代码 第一 第二 您看,这两个子报告具有相同的代码。 奇怪的是,两个子报告显示,但

  • 你是一个电视游戏节目的参与者,这给了你赢得奖金的机会。在游戏中,你会看到一系列框,每个框都包含一个允许你看到的正整数值。你有机会选择任何数量的盒子。您的总奖金是您选择包含的所有盒子的总和。这个游戏只有一个限制:如果你选择了两个连续的盒子,你不允许在总数中添加任何后续的盒子,而你的奖品是截至该点的累计金额。你的目标是最大化你的奖金。 给定一个正整数数组,代表游戏中呈现给你的每个盒子的值,返回你能赢得

  • 我想创建一个包含所有价格选项的列表,并将唯一的值放在下拉列表中,所以我这样做: 此代码引发错误: 警告:遇到具有相同键的两个子项。键应该是唯一的,以便组件在更新时维护它们的标识。非唯一键可能导致重复和/或省略子键-此行为不受支持,并且可能在未来版本中更改。 从到 更新我也添加到它呈现的地方。 和SearchHandlerPrice:

  • 我想从两个数字创建一个序列,这样其中一个数字的出现次数减少(从减少到1),而另一个数字的出现次数固定在。 我一直在四处寻找并尝试使用seq和rep来做这件事,但我似乎不明白。 下面是和,的一个例子: 这里是和,: