18 条题解

  • 15
    @ 2023-6-4 8:32:27

    使用线段树,转化为区间求和问题

    #include <bits/stdc++.h>
    #define l(x) tree[x].l
    #define r(x) tree[x].r
    #define sum(x) tree[x].sum
    #define add(x) tree[x].add
    using namespace std;
    struct SegmentTree {
        int l, r; //区间左右端点 
        long long sum, add; //sum 区间和  add 延迟标记 
    } tree[400010];
    int a[100010], n = 1, m = 2;
    void build (int p, int l, int r) {
        l(p) = l, r(p) = r;
        if(l == r) {sum(p) = a[l]; return;}
        int mid = l + r >> 1;
        build(p * 2, l, mid);
        build(p * 2 + 1, mid + 1, r);
        sum(p) = sum(p * 2) + sum(p * 2 + 1);
    }
    void spread(int p) {
        if(add(p)) { //节点p有标记 
            sum(p * 2) += add(p) * (r(p * 2) - l(p * 2) + 1); //更新左子节点信息 
            sum(p * 2 + 1) += add(p) * (r(p * 2 + 1) - l(p * 2 + 1) + 1); //更新右子节点
            add(p * 2) += add(p); //给左子节点打延迟标记 
            add(p * 2 + 1) += add(p); //给右子节点打延迟标记 
            add(p) = 0; //清除p的标记 
        }
    }
    void change(int p, int l, int r, int d) {
        if(l <= l(p) && r >= r(p)) { //完全覆盖 
            sum(p) += (long long) d * (r(p) - l(p) + 1); //更新节点信息 
            add(p) += d; //给节点打延迟标记 
            return;
        }
        spread(p); //下传延迟标记 
        int mid = l(p) + r(p) >> 1;
        if(l <= mid) change(p * 2, l, r, d);
        if(r > mid) change(p * 2 + 1, l, r, d);
        sum(p) = sum(p * 2) + sum(p * 2 + 1);
    }
    long long ask(int p, int l, int r) {
        if(l <= l(p) && r >= r(p)) return sum(p);
        spread(p);
        int mid = l(p) + r(p) >> 1;
        long long val = 0;
        if(l <= mid) val += ask(p * 2, l, r);
        if(r > mid) val += ask(p * 2 + 1, l, r);
        return val;
    }
    int main() {
        a[1] = 0;
        build(1, 1, n);
        while(m--) { 
            int d = 0;
            scanf("%d", &d);
            change(1, 1, 1, d);
        }
        printf("%lld\n", ask(1, 1, 1));
        return 0;
    }
    

    树状数组

    思路一样,区间求和

    #include<bits/stdc++.h>
    using namespace std;
    const int SIZE = 100010;
    int a[SIZE], n = 1, m = 2;
    long long c[2][SIZE], sum[SIZE];
     
    long long ask(int k, int x) {
        long long ans = 0;
        for(; x ; x -= x & -x) ans += c[k][x];
        return ans;
    }
     
    void add(int k,int x,int y) {
        for(; x <= n; x += x & -x) c[k][x] += y;
    }
     
    int main() {
        a[1] = 0;
        while(m--) {
            int d = 0;
            scanf("%d", &d);
            add(0, 1, d);
            add(0, 2, -d);
            add(1, 1, d);
            add(1, 2, -2 * d);
        }
        long long ans = sum[1] + 2 * ask(0, 1) - ask(1, 1);
        ans -= sum[0] + 1 * ask(0, 0) - ask(1, 0);
        printf("%lld\n", ans);
        return 0;
    }
    

    分块

    思路一样,区间求和

    #include<bits/stdc++.h>
    using namespace std;
    long long a[50000010], sum[50000010], add[50000010];
    int L[50000010], R[50000010];
    int pos[50000010];
    int n = 1, m = 2, t;
     
    void change(int l, int r, long long d) {
        int p = pos[l], q = pos[r];
        if (p == q) {
            for (int i = l; i <= r; i++) a[i] += d;
            sum[p] += d*(r - l + 1);
        }
        else {
            for (int i = p + 1; i <= q - 1; i++) add[i] += d;
            for (int i = l; i <= R[p]; i++) a[i] += d;
            sum[p] += d*(R[p] - l + 1);
            for (int i = L[q]; i <= r; i++) a[i] += d;
            sum[q] += d*(r - L[q] + 1);
        }
    }
     
    long long ask(int l, int r) {
        int p = pos[l], q = pos[r];
        long long ans = 0;
        if (p == q) {
            for (int i = l; i <= r; i++) ans += a[i];
            ans += add[p] * (r - l + 1);
        }
        else {
            for (int i = p + 1; i <= q - 1; i++)
                ans += sum[i] + add[i] * (R[i] - L[i] + 1);
            for (int i = l; i <= R[p]; i++) ans += a[i];
            ans += add[p] * (R[p] - l + 1);
            for (int i = L[q]; i <= r; i++) ans += a[i];
            ans += add[q] * (r - L[q] + 1);
        }
        return ans;
    }
     
    int main() {
        a[1] = 0;
        t = sqrt(n*1.0);
        for (int i = 1; i <= t; i++) {
            L[i] = (i - 1)*sqrt(n*1.0) + 1;
            R[i] = i*sqrt(n*1.0);
        }
        if (R[t] < n) t++, L[t] = R[t - 1] + 1, R[t] = n;
        for (int i = 1; i <= t; i++)
            for (int j = L[i]; j <= R[i]; j++) {
                pos[j] = i;
                sum[i] += a[j];
            }
        while (m--) {
            int d;
            scanf("%d", &d);
            change(1, 1, d);
        }
        printf("%lld\n", ask(1, 1));
    }
    

    这样我们就完美的解决掉了这道难题

    • @ 2023-6-11 1:57:12

      感觉不如可持久化动态仙人掌的直径问题

    • @ 2023-7-18 16:56:29

      @ 你更6,为了加载你的评论,我浏览器崩了

    • @ 2023-8-7 18:21:54

      ?

    • @ 2023-10-5 21:18:58

      针不戳@

    • @ 2023-11-19 15:05:45
      #include <bits/stdc++.h> 
      using namespace std;
      int main()
      {
          long long a,b;
          cin>>a>>b;
          cout<<a+b;
          return 0;
      }
      
    • @ 2024-1-20 10:09:15

      其实用Python两排就可以解决

    • @ 2024-3-16 18:27:04

      @可以看下二楼我的python解法😄

    • @ 2024-6-8 22:20:04

      不是哥们

  • 4
    @ 2024-4-5 19:13:55

    这道题只要开个long long 就行了,不然就死的很惨

    #include<iostream>
    using namespace std;
     int main(){
         long long a,b;
         cin>>a>>b;
         cout<<a+b;
         return 0;
     }
    
    • 4
      @ 2023-7-29 11:38:31

      Python

      a,b = map(int,input().split());
      print(a+b)
      
      • 3
        @ 2023-10-5 21:28:53

        这什么gui题!

        写的是:

        提示

        对于100%的数据,输入的整数在int的范围内。

        实际是:

        #include <bits/stdc++.h>
        int main(){
        	int n, m;
        	scanf("%d%d", &n, &m);
        	printf("%d", n + m);
        	return 0;
        }
        

        AC:5,WA:5......

        #include <bits/stdc++.h>
        int main(){
        	long long n, m;
        	scanf("%lld%lld", &n, &m);
        	printf("%lld", n + m);
        	return 0;
        }
        

        AC:10

        Tom老师,改改提示!

        • @ 2023-10-6 18:15:35

          ta没错的 2个刚好int范围内的数相加, 结果可能会大于int的范围啊

      • 3
        @ 2023-8-9 21:06:09

        挑战全网最短

        #include<bits/stdc++.h>
        using namespace std;int main(){
            long long a,b;cin>>a>>b;cout<<a+b;
        }
        
        • @ 2023-8-14 22:26:39

          省流:不换行

        • @ 2023-8-15 14:07:28

          @

          #include<bits/stdc++.h>
          int main(){long long a,b;std::cin>>a>>b;std::cout<<a+b;}
          
      • 3
        @ 2023-7-24 20:25:08

        日常整活

        #include <iostream>
        int a,b,c;
        int main(){
        	while(std::cin>>a>>b)
        	  std::cout<<(c++?"\n":"")<<a+b;}
        
        • 3
          @ 2023-5-31 21:32:42

          A + B问题(经典)

          我来交作业写题解

          思路:

          输入两个数,用cin。要再输出两个数的和,为了不占过多的内存,直接在输出(cout)里写上表达式就行。

          
          #include <iostream>
          using namespace std;    //导入库
          int main() {
          	long long a, b;    //怕数字太大,所以用long long
          	cin >> a >> b;     //输入两个数
          	cout << a + b << endl;    //输出数字和
          	return 0;    //程序结束
          }
          
          

          • 1
            @ 2024-6-16 11:56:04

            AC代码.

            #include <bits/stdc++.h>//hetao2193769
            using namespace std;
            int main()
            {
                long long a,b;//定义两个变量:a,b
                cin>>a>>b;//输入
                cout<<a+b;//输出
                //这里注意,a和b都是int类型,但是相加可能会超过int范围.所以定义long long.
                //如果定义a和b都是int类型只能拿50分.
                return 0;
            }
            
            • 1
              @ 2023-6-30 21:16:39

              题解

              #include <iostream>using namespace std;main(){long long i,j;cin>>i>>j;cout<<i+j;}
              
              • 1
                @ 2023-5-24 16:24:52

                解析:

                输入两个整数a,ba, b,输出a+ba + b的结果,其中a,ba, b都在int的范围内。

                参考答案:

                #include <iostream>
                using namespace std;
                int main()
                {
                    long long a, b;
                    cin >> a >> b;
                    cout << a + b;
                    return 0;
                }
                

                易错点:

                1. 按照题面要求,输入的a,ba, b都在int的范围内,但a+ba + b的结果存在超过int范围的可能,所以变量a,ba, b都需要定义为long long类型
                • 0
                  @ 2024-5-26 20:03:30

                  题解 c++

                  #include <bits/stdc++.h> //hetao4040809
                  using namespace std;
                  long long a,b; //这里得用long long
                  int main()
                  {
                      cin>>a>>b;
                      cout<<a+b;
                      return 0;
                  }
                  
                  • 0
                    @ 2024-5-24 17:05:15
                    #include <iostream>
                    #include <iomanip>
                    using namespace std;
                    int main()
                    { 
                        long long a,b;
                        cin >> a >> b;
                        cout << a + b;
                        return 0;
                    }
                    
                    • 0
                      @ 2024-5-1 19:09:48

                      这是一个题解

                      #include <iostream>
                      using namespace std;
                      int main()
                      {
                          long long a,b;
                          cin>>a>>b;
                          cout<<a+b;
                                                                                                                                                                                           不许抄题解!
                          return 0;
                      
                      }
                      
                      • 0
                        @ 2024-4-12 20:29:00
                        #include<bits/stdc++.h>
                        int main(){long long a,b;std::cin>>a>>b;std::cout<<a+b;}
                        
                        • 0
                          @ 2023-8-8 16:27:16

                          我是数学小天才

                          这道题直接把A和B相加的结果输出即可,因此可得出:

                          c=a+b;
                          cout<<c;
                          

                          补齐必需内容就可以辣

                          上代码

                          #include <bits/stdc++.h>
                          using namespace std:
                          int main()
                          {
                              int a,b,c;
                              cin>>a>>b;
                              c=a+b;
                              cout<<c;
                              return 0;
                          }
                          

                          于是,这道题被解决了,点个赞叭

                          • @ 2023-8-11 20:27:42

                            @

                            第一: using namespace std后面的;你写成了:

                            第二: 要用long long,int会超范围,下次记得细心些

                        • 0
                          @ 2023-6-3 16:40:28
                          #include<iostream>
                          using namespace std;
                          int main()
                          {
                              long long a,b;
                              cin>>a>>b;
                              cout<<a+b;
                              return 0;
                          }
                          
                          • 0
                            @ 2023-5-26 21:53:14

                            思路:

                            先看提示,这题用int有可能超出存储范围,所以用long long,然后获取值,再求和,最后输出


                            #include <iostream>
                            using namespace std;
                            
                            int main()
                            {
                                long long a,b;
                                cin >> a >> b;
                                cout << a + b;
                                return 0;
                            }
                            
                            • -3
                              @ 2023-7-6 21:38:12
                              #include <iostream>
                              using namespace std;
                              int main()
                              {
                                  long long a,b;
                                  cin >> a >> b; 
                                  cout << a + b; 
                                  return 0;
                              }
                              
                              • 1

                              信息

                              ID
                              116
                              时间
                              1000ms
                              内存
                              256MiB
                              难度
                              8
                              标签
                              递交数
                              24873
                              已通过
                              3274
                              上传者