爱吃橘子的猴 2023-01-09 16:27 采纳率: 100%
浏览 93
已结题

用int类型可以获得答案但改long long就只会输出0

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std ;
#define int long long
signed main(){
    int k;
    int c,d=0;
    cin>>k;
    int e[k]={0};
    for(int i=0;i<k;i++){
        int n,m;
        cin>>n>>m;
        int a[n];
        int b[m];
        for(int j=0;j<n;j++){
            scanf("%lld",&a[j]);
        }
        for(int j=0;j<m;j++){
            scanf("%lld",&b[j]);
        }
        int l=0;
        for(int j,k=0;j<n&&k<m;l++){
            if(a[j]>=b[k]){
                if(a[j]==b[k])c++;
                if(k==m-1)d=c^d;
                k++;
            }
            if(a[j]<b[k]){
                d=c^d;
                c=0;
                j++;
            }
        }
        e[i]=d;
    }
    for(int i=0;i<k;i++){
        printf("%lld\n",e[i]);
    }
    
    return 0;
}

img


#include<iostream>
#include<vector>
using namespace std ;
signed main(){
    int k;
    int c,d=0;
    cin>>k;
    int e[k]={0};
    for(int i=0;i<k;i++){
        int n,m;
        cin>>n>>m;
        int a[n];
        int b[m];
        for(int j=0;j<n;j++){
            scanf("%d",&a[j]);
        }
        for(int j=0;j<m;j++){
            scanf("%d",&b[j]);
        }
        int l=0;
        for(int j,k=0;j<n&&k<m;l++){
            if(a[j]>=b[k]){
                if(a[j]==b[k])c++;
                if(k==m-1)d=c^d;
                k++;
            }
            if(a[j]<b[k]){
                d=c^d;
                c=0;
                j++;
            }
        }
        e[i]=d;
    }
    for(int i=0;i<k;i++){
        printf("%d\n",e[i]);
    }
    
    return 0;
}

img


原题:洛谷p1366有序表的合并

有序表的合并

题目描述

给出两个数列 $a, b$,均按不降序排序。其中保证 $a$ 中没有重复的数字。

现在请你求出:$a$ 中每一个数字在 $b$ 中出现了几次?

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数,表示数据组数 $T$。接下来按顺序给出每组数据的输入信息:

第一行为两个整数,依次表示 $a$ 数列的长度 $n$ 和 $b$ 数列的长度 $m$。
第二行有 $n$ 个整数表示数列 $a$,第 $i$ 个整数表示 $a_i$。
第三行有 $m$ 个整数表示数列 $b$,第 $i$ 个整数表示 $b_i$。

输出格式

为了避免输出过大,对于每组数据,请你输出一行一个整数,表示数列 $a$ 的每个数在 $b$ 中出现次数的按位异或和

形式化的,设 $a_i$ 在 $b$ 中出现了 $c_i$ 次,则你需要输出 $c_1 \bigoplus c_2 \bigoplus \dots \bigoplus c_n$ 的值,其中 $\bigoplus$ 表示按位异或操作。你可以参考提示来完成计算。

样例 #1

样例输入 #1

1
3 5
1 3 6
1 3 3 5 5

样例输出 #1

3

样例 #2

样例输入 #2

1
9 4
1 2 3 4 5 6 7 8 9
1 1 4 5

样例输出 #2

2

样例 #3

样例输入 #3

2
3 5
1 3 6
1 3 3 5 5
9 4
1 2 3 4 5 6 7 8 9
1 1 4 5

样例输出 #3

3
2

提示

样例 1 解释

  • $a_1 = 1$ 在 $b$ 中出现了 $1$ 次。
  • $a_2 = 3$ 在 $b$ 中出现了 $2$ 次。
  • $a_3 = 6$ 在 $b$ 中出现了 $0$ 次。

故输出为 $1 \bigoplus 2 = 3$。

样例 2 解释

$1, 4, 5$ 分别在 $b$ 中出现了 $2, 1, 1$ 次,故输出为 $2 \bigoplus 1 \bigoplus 1 = 2$。

数据规模与约定

对于全部的测试点,保证:

  • $1 \leq T \leq 10$;
  • $1 \leq n, m \leq 10^7$,$\sum (n + m) \leq 10^7$;
  • $1 \leq a_i, b_i < 2^{64}$,且 $a_i < a_{i + 1}$,$b_i \leq b_{i + 1}$。

其中 $\sum (n+m)$ 表示单测试点内所有 $n$ 与 $m$ 的和,即输入数列的总长度不超过 $10^7$。

提示

  • 请注意大量数据读入对程序效率造成的影响,选择合适的读入方式,避免超时。
  • 请采用合适的数据类型存储变量,避免溢出。
  • 如果你不知道什么是按位异或和,可以在你的代码里添加如下的函数:
template <class T>
T getXorSum(T *begin, T *end) {
  T ret = 0;
  for (T *it = begin; it != end; ++it) ret ^= *it;
  return ret;
}

这一函数的作用是计算传入数组(包括 std::vector)某一左闭右开区间的按位异或和,返回值类型与传入数组的类型相同,调用方法与 std::sort 类似,例如,要求数组 $a$ 的 $a_1 \sim a_n$ 的按位异或和,则调用 getXorSum(a + 1, a + 1 + n),求 $a_0 \sim a_{n - 1}$ 的按位异或和,则调用 getXorSum(a, a + n)。如果 $a$ 是 std::vector,则将上述调用代码里的 a 均改为 a.begin() 即可。

  • 写回答

5条回答 默认 最新

  • icehomegre 2023-01-09 16:54
    关注

    您好,我对代码做了小小的修改,目前可以通过样例。

    #include<iostream>
    #include<vector>
    using namespace std ;
    long long e[10000005]={};
    unsigned long long a[10000005]={};
    unsigned long long b[10000005]={};//定义很大的数组要放在外面
    signed main(){
        int k;
        cin>>k;
        for(int i=0;i<k;i++){
            long long c=0,d=0;//c要赋初值
            int n,m;
            cin>>n>>m;
            for(int j=0;j<n;j++){
                cin>>a[j];
            }
            for(int j=0;j<m;j++){
                cin>>b[j];
            }
            int j=0,k=0;
            while(j<n&&k<m){//for改while(其实一样的),省一个变量l
                if(a[j]>=b[k]){
                    if(a[j]==b[k])c++;
                    if(k==m-1)d=c^d;
                    k++;
                }
                else if(a[j]<b[k]){//else
                    d=c^d;
                    c=0;
                    j++;
                }
            }
            e[i]=d;
        }
        for(int i=0;i<k;i++){
            printf("%lld\n",e[i]);//输出要%lld(其实e数组可以是int)
        }
        
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月17日
  • 已采纳回答 1月9日
  • 修改了问题 1月9日
  • 创建了问题 1月9日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题