首页 > 其他分享 >AcWing 463. 求和

AcWing 463. 求和

时间:2023-09-26 11:01:38浏览次数:33  
标签:颜色 数字 格子 求和 纸带 463 int color AcWing

\(AcWing\) \(463\). 求和

一、题目描述

一条狭长的纸带被均匀划分出了 \(n\) 个格子,格子编号从 \(1\) 到 \(n\)。

每个格子上都染了一种颜色 \(color_i\)(用 \([1,m]\) 当中的一个整数表示),并且写了一个数字 \(number_i\)。

定义一种特殊的三元组:\((x,y,z)\),其中 \(x,y,z\)
都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

  • \(x,y,z\) 都是整数, \(x<y<z,y−x=z−y\)
  • \(color_x=color_z\)

满足上述条件的三元组的分数规定为 \((x+z)∗(number_x+number_z)\)。

整个纸带的分数规定为所有满足条件的三元组的分数的和。

这个分数可能会很大,你只要输出整个纸带的分数除以 \(10,007\) 所得的余数即可。

输入格式
第一行是用一个空格隔开的两个正整数 \(n\) 和 \(m\),\(n\) 代表纸带上格子的个数,\(m\) 代表纸带上颜色的种类数。

第二行有 \(n\) 个用空格隔开的正整数,第 \(i\) 个数字 \(number_i\) 代表纸带上编号为 \(i\) 的格子上面写的数字。

第三行有 \(n\) 个用空格隔开的正整数,第 \(i\) 个数字 \(color_i\) 代表纸带上编号为 \(i\) 的格子染的颜色。

输出格式
共一行,一个整数,表示所求的纸带分数除以 \(10,007\)所得的余数。

数据范围
\(1≤n,m≤10^5,1≤number_i≤10^5\),
\(1≤color_i≤m\)

输入样例

6 2
5 5 3 2 2 2
2 2 1 1 2 1

输出样例

82

二、暴力枚举

\(40\)分 \(O(n^2)\)

三元组:\((x, y, z)\)要求满足以下两个条件:

  • \(x,y,z\) 都是整数, \(x<y<z,y−x=z−y\)
  • \(color_x=color_z\) 那么:\(x+z=2y\)。由此可以枚举\(x\)和\(y\)的值,如果颜色相同,累加分值即可。

时间复杂度
\(O(n^2)\)

#include <bits/stdc++.h>
using namespace std;

const int N = 100010, mod = 10007;

int a[N], color[N];

int main() {
    int n, m; // 纸带上格子的个数,纸带上颜色的种类数
    cin >> n >> m;

    for (int i = 1; i <= n; i++) cin >> a[i];     // 纸带上编号为 i 的格子上面写的数字
    for (int i = 1; i <= n; i++) cin >> color[i]; // 纸带上编号为 i 的格子染的颜色

    int res = 0;
    for (int x = 1; x <= n; x++) {
        for (int y = x + 1; 2 * y - x <= n; y++) { // 因为y>=x+1,并且z<=n
            int z = 2 * y - x;
            if (color[x] == color[z]) // 如果color[x]=color[z]
                res = (res + (2 * y) % mod * (a[x] + a[z]) % mod) % mod;
        }
    }
    printf("%d\n", res);
    return 0;
}

三、优化

读题,我们发现完全可以暴力\(O(n^{3})\)

那这必然过不了

观察题目,对式一进行移项,发现\(x+z=2y\)

于是我们便可以枚举\(x,z\)或\(y\)

当然这个复杂度也是过不了的

做到这个地步,我们似乎基本没有用到颜色

于是我们便可以向颜色上靠,可以利用 分组 的思想,将同一颜色分成一组,又根据\(x+z=2y\)

可以 把相同颜色的分为奇偶两组

\(Q\):怎么得出最后答案呢?

我们可以对分数的计算:\((x+z)*(number_{x}+number_{z})\) 进行一定的处理(数学变形)

  • 设\(c[i]\)为第\(i\)个格子的颜色
  • \(cnt[c[i]][i\%2]\)为颜色为\(c[i]\)的两个奇偶分组中数字个数

设\(x_i\)为下标,\(w_i\)为值

\(ans=(x_1+x_2)(w_1+w_2)+(x_1+x_3)(w_1+w_3)+…+(x_1+x_n)(w_1+w_n) \\ \ \ \ \ \ \ \ \ \ +(x_2+x_3)(w_2+w_3)+(x_2+x_4)(w_2+w_4)+…+(x_2+x_n)(w_2+w_n)\\ \ \ \ \ \ \ \ \ \ +(x_3+x_4)(w_3+w_4)+…+(x_3+x_n)(w_3+w_n)\\ \ \ \ \ \ \ \ \ \ +… \\ \ \ \ \ \ \ \ \ \ +(x_{n−1}+x_n)(w_{n−1}+w_n)\)

将有关\(x_1\)的式子 提出来找规律

\((x_1+x_2)*(w_1+w_2) +(x_1+x_3)*(w_1+w_3)...+ (x_1+x_n)*(w_1+w_n)\)

注:共\(n-1\)项

乘出来
\(x_1 * w_1 + x_1 * w_2 +x_2 * w_1+x_2 * w_2+ \\ x_1 * w_1 + x_1 * w_3 +x_3 * w_1+x_3 * w_3+ \\ ... \\ +x_1 * w_1+ x_1*w_n+x_n*w_1+x_n*w_n\)

将有关\(x_1\)的式子提出来

\(x_1*w_1+x_1*w_2+...+x_1*w_1+x_1*w_n\)

\(=(n-1)*x_1*w_1+x_1*(w_2+w_3+...+w_n)\)

将这个式子
\(+x_1*w_1-x_1*w_1\)

\(\displaystyle \ \ \ \ \ \ (n-2)*x_1*w_1+x_1*(w_1+w_2+w_3+...+w_n) \\ = x_1*((n-2)*w_1+(w_1+w_2+w_3+...+w_n)) \\ = x_1*[(n-2)*w_1+\sum_{i=1}^nw_i]\)

显然\(\displaystyle \sum_{i=1}^nw_i\)可以预处理出来。
这个 \(n-2\)是什么呢?\(n\)应该是该分组中数字的总个数,这个也可以预处理出来~

\(Code\)

#include <bits/stdc++.h>
using namespace std;

const int N = 100010, mod = 10007;

int w[N]; // 第i个格子的数字
int c[N]; // 第i个格子的颜色
int s[N][2];
// s[i][0]:颜色为i、编号为偶数格子上数字的和
// s[i][1]:颜色为i、编号为奇数格子上数字的和

int cnt[N][2];
// cnt[i][0]:颜色为i、编号为偶数格子的个数
// cnt[i][1]:颜色为i、编号为奇数格子的个数

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> w[i]; // 第i个格子的数字
    // 预处理
    for (int i = 1; i <= n; i++) { // 遍历每个格子
        cin >> c[i];               // 格子颜色c[i]
        /*
        装入不同的组中,组划分是两个规则:
        ① 颜色必须相同
        ② 奇偶性必须相同
        所以,c[i]相同的放到同一个颜色组内,并且,在同一个颜色组内,奇偶数还必须相同。

        s[][]:随着i的不断向后遍历,s中记录了相同颜色,相同奇偶性的格子,数字的累加和
        cnt[][]:记录每个分组中的格子个数
        */
        s[c[i]][i % 2] = (s[c[i]][i % 2] + w[i]) % mod; // 累加分组内数字和
        cnt[c[i]][i % 2]++;                             // 维护分组内格子个数
    }

    int ans = 0;
    for (int i = 1; i <= n; i++) // 枚举每个格子
        /*
        Q:这个格子在哪个分组里呢?
        答:
        (1) c[i] : 按颜色划分
        (2) i % 2 : 按奇偶性划分

        Q:这个分组中格子的数量是多少呢?
        答: cnt[c[i]][i % 2]

        */
        ans = (ans + i * ((cnt[c[i]][i % 2] - 2) * w[i] % mod + s[c[i]][i % 2])) % mod;

    printf("%d\n", ans);
    return 0;
}

标签:颜色,数字,格子,求和,纸带,463,int,color,AcWing
From: https://www.cnblogs.com/littlehb/p/17729636.html

相关文章

  • 第九十八场周赛. AcWing 4949. 末尾连续0
    第九十八场周赛.AcWing4949.末尾连续0给定一个正整数\(m\),请你统计一共有多少个正整数\(n\)满足,\(n\)的阶乘的末尾连续\(0\)的数量恰好为\(m\)。输出满足条件的\(n\)的数量以及所有满足条件的\(n\)。例如,当\(m=1\)时,满足条件的正整数\(n\)共有......
  • 第九十八场周赛. AcWing 4948. 大乘积
    第九十八场周赛.AcWing4948.大乘积我们规定,如果一个非负整数\(a\)满足以下两个条件之一,则称\(a\)为美丽数:\(a=0\)\(a=10^x\),其中\(x\)为任意非负整数。给定\(n\)个非负整数\(a_1,a_2,…,a_n\),这其中有至少\(n−1\)个数是美丽数。请你计算并输出\(a_......
  • AcWing 896. 最长上升子序列 II
    题目给定一个长度为$N$的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数$N$。第二行包含$N$个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围$1≤N≤100000,−10^9≤数列中的数≤10^9$输入样例:73121856输出样例......
  • Codeforces463-E.Team Work-组合数、DP
    Codeforces463-E.TeamWork题意:求\[\sum_{i=1}^n\binom{n}{i}i^k\]其中\(1\leqn\leq10^9\),\(1\leqk\leq5000\)。题解:其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据\(k\)去递推了。首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函......
  • Acwing 周赛110 5046
    Acw5046思路dp,\(dp_i\)表示前i种药且吃第i种药使智商达到\(r_i\)的方案,根据题意可知\[dp_i=\sumdp_j,(r_j\in[l_i,r_i-1])\]先将各区间按右端点排序,求j的区间可用二分.代码//9.24intn,m,k;intf[N],s[N];//acw110structseg{ intl,r; booloperator<(c......
  • Acwing. 第122场周赛
    比赛链接A简单输出题目链接简单的模拟一下就好了,注意是多组样例就行。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;for(inti=1;i<=n;i++){cout<<i<<"";}cout<<endl;}intmain(){......
  • P6667 [清华集训2016] 如何优雅地求和 -Binomial Sum
    题面有一个多项式函数\(f(x)\),最高次幂为\(x^m\),定义变换\(Q\):\[Q(f,n,x)=\sum_{k=0}^{n}f(k)\binom{n}{k}x^k(1-x)^{n-k}\]现在给定函数\(f\)和\(n,x\),求\(Q(f,n,x)\bmod998244353\)。出于某种原因,函数\(f\)由点值形式给出,即给定\(a_0,a_1,⋯,a_m\)共\(m+1\)个......
  • post请求和get请求的区别
    post请求和get请求的区别(1)post请求更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存)(2)post请求发送的数据更大(get请求有url长度限制,http协议本身不限制,请求长度限制是由浏览器和web服务器决定和设......
  • 题解 P8670 [蓝桥杯 2018 国 B] 矩阵求和
    题目描述\[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)^2\]具体思路solution1显然可以每次枚举\(\gcd(i,j)\)的取值。\[\sum_{k=1}^nk^2\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=k]\]令\(i=\lfloor\frac{i}{k}\rfloor\),\(j=\lfloor\frac{j}{k}\rfloor\)。\[\sum......
  • 20230921-python的get请求和post请求区别
    1.。get请求  2。post请求   ......