因为人傻常数大写了一天的题目。

原题传送门

题目意思另一种表达:

定义特殊二元组\((x,z)\)。

1.\(x<z\)。

2.\(x\)与\(z\)要么都为奇数要么都为偶数。

(即\(x \ mod \ 2 = z \ mod \ 2\))

3.\(c_x=c_z\)

4.该二元组的分数为\((x+z)\times(a_x+a_z)\)

给定所有\(c_i\)与\(a_i\),求满足条件的二元组的分数和。

以上的\(x\),\(z\)在下文表述为\(id_x\),\(id_y\)。(\(y\)代替\(z\))


80分做法

以\(v[i][0]\)来存储颜色为\(i\)的所有偶数下标的\(num_i\)与\(a_i\)。\(v[i][1]\)来存储奇数下标。

有以下结论:

对于所有的\((x,y)\),\(v[i][j][x]\)与\(v[i][j][y]\)都两两为合法二元组。

然后枚举所有颜色\(i\),接着枚举\(x\),\(y\)暴力统计答案就可以了。

时间复杂度应该是\(O(n^2)\),不知道为啥有\(80pts\)(


\(80pts:\)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
#define MAXN (int)(1e5+233)
#define int long long
struct qwq
{
int a,c,id;
}e[MAXN];
vector<qwq> v[MAXN][2];
#define mod (10007)
signed main()
{
int n,m;
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++) scanf("%lld",&e[i].a);
for (int i=1;i<=n;i++) scanf("%lld",&e[i].c),e[i].id=i;
for (int i=1;i<=n;i++)
{
v[e[i].c][i%2].push_back(e[i]);
}
int ans=0;
for (int i=1;i<=m;i++)
{
for (int j=0;j<v[i][0].size();j++)
{
for (int k=j+1;k<v[i][0].size();k++)
{
ans+=((v[i][0][j].id+v[i][0][k].id)*(v[i][0][j].a+v[i][0][k].a))%mod;
ans%=mod;
}
}
for (int j=0;j<v[i][1].size();j++)
{
for (int k=j+1;k<v[i][1].size();k++)
{
ans+=((v[i][1][j].id+v[i][1][k].id)*(v[i][1][j].a+v[i][1][k].a))%mod;
ans%=mod;
}
}
}
printf("%lld\n",ans%mod);
return 0;
}

100分做法

\(80\)分做法中提到的\(v[i][j][]\)这样的一个数组,我们简写为\(s[]\),考虑每次往数组后面加一个数,这个数对答案的贡献。

拆式(题目中的贡献式)

\[(id_x+id_y)\times(a_x+a_y)
\]
\[(id_x \times a_x)+(id_x \times a_y)+(id_y \times a_x)+(id_y\times a_y)
\]

于是原式就拆为四个式子的和。

反思结论(\(x\),\(y\)指在统计数组中的下标)

对于所有的\((x,y)\),\(s[x]\)与\(s[y]\)都两两为合法二元组。

那么每在\(s[]\)末尾位置\(y\)多加入一个值,这个\(y\)就要与所有\(0 < x < y\)相匹配并累计贡献。(说简单点就和\(y\)之前的所有数匹配为合法二元组)

分别考虑拆式中四个式子

1.\((id_x \times a_x)\)

对于所有\(x\),答案加上\(id_x \times a_x\)。用\(sumul\)数组记录\(\sum_{x=1}^{y-1}id_x \times a_x\)的和,累计进答案贡献。

2.\((id_x \times a_y)\)

\(sumid\)记录\(\sum_{x=1}^{y-1}{id_x}\),答案贡献加上\(sumid \times a_y\)。

3.\((id_y \times a_x)\)

\(suma\)记录\(\sum_{x=1}^{y-1}{a_x}\),答案贡献加上\(suma \times id_y\)

4.\((id_y \times a_y)\)

我们知道在末尾位置\(y\)加一个数就增加了\((y-1)\)个合法二元组。那么也就是会增加\((y-1)\)个\((id_y \times a_y)\)。用一个\(sum\)数组来记录末尾下标\(y\)。

5.总结贡献

\(ans+=(sumul+sumid \times a_y +suma \times id_y +sum \times (id_y \times a_y))\)


\(100pts:\)

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
#define MAXN (int)(1e5+233) using namespace std; int a[MAXN],c[MAXN],suma[MAXN][2],sumid[MAXN][2],sumul[MAXN][2],sum[MAXN][2];
struct qwq {
int a,c,id;
}e[MAXN];
#define mod (10007)
signed main() { int n,m;
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++) scanf("%lld",&e[i].a);
for (int i=1;i<=n;i++) scanf("%lld",&e[i].c),e[i].id=i;
int ans=0;
for (int i=1;i<=n;i++)
{
ans+=sumul[e[i].c][i&1]+i*e[i].a*sum[e[i].c][i&1]+sumid[e[i].c][i&1]*e[i].a+suma[e[i].c][i&1]*i; sumul[e[i].c][i&1]+=i*e[i].a;//处理a_i*i前缀和 suma[e[i].c][i&1]+=e[i].a;//处理a_i前缀和 sumid[e[i].c][i&1]+=i;//处理number_i前缀和 sum[e[i].c][i&1]++;//处理(不存在的)数组末尾下标 ans%=mod;
}
printf("%lld\n",ans);
return 0;
}

【题解】Luogu P2671 【求和】的更多相关文章

  1. 洛谷 P2671 求和 解题报告

    P2671 求和 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\) .每个格子上都染了一种颜色\(color_i\)用\([1,m]\)当中的一个整数表示),并 ...

  2. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  3. 洛谷P2671 求和 [数论]

    题目传送门 求和 格式难调,题面就不放了. 分析: $ZYYS$的一道题. 很显然是大力推公式.我们分析一下题目,实际上限制条件就是:下标同奇偶且颜色相同的数,那么我们先拿这个公式$(x+z)*(nu ...

  4. Luogu 2671 求和 NOIP2015T3

    题目链接 题解 20pts $O(n^3)$枚举$x,y,z$,根据题目要求判断 40pts $O(n^2)$枚举$x,z$,需要满足$x,z$奇偶相同 20~40pts的代码我都没有写过...就不贴 ...

  5. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  6. 题解 P1630 【求和】

    题目 发现题解都不够优雅,就自己来一篇 ( 以下除[代码]处代码,其余均为现场手打,如有误请与本蒟蒻联系 ) [分析] 首先,看清楚了,题目是 \(\sum_{i=1}^ai^b\) 的余数 ,而不是 ...

  7. Luogu P1625 求和

    题意 给定两个整数 \(n,m\),求 \[\sum\limits_{i=1}^{n}\frac{1}{\prod\limits_{j=i}^{i+m-1}j} \] \(\texttt{Data R ...

  8. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  9. P2671 求和

    题目描述 一条狭长的纸带被均匀划分出了 nn 个格子,格子编号从 11 到 nn .每个格子上都染了一种颜色 color\_icolor_i 用 [1,m][1,m] 当中的一个整数表示),并且写了一 ...

  10. luogu 4427 求和

    bjoi 2018 求和 唯一一道可能切的题一个数组还没开long long就成0分了 题目大意: 一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k次方和,而且每次的k可能是不同的 此处 ...

随机推荐

  1. 正则爬取'豆瓣之乘风破浪的姐姐'的并存入excel文档

    import requests import re import pandas as pd def parse_page(url): headers = { 'User-Agent':'Mozilla ...

  2. 更多Linux实用命令

    更多实用命令 进程相关 当程序运行在系统上时,我们称之为进程(process).想监测这些进程,需要熟悉 ps/top 等命令的用法.ps 命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许 ...

  3. visio任意图形填充

    开发工具->操作->修剪->按住Shift键点击填充图形所有边 同时选中后->组合->开发工具->操作->连接 回到开始选项卡选择填充颜色 中途不要点击其他, ...

  4. jmeter性能测试学习1_配置oracl jdbc连接

    1.导入orcle驱动的jar包 2.添加配置元件选择 JDBC连接配置 3.添加取样器 JDBCrequest 4.添加观察树,运行 配好密码 OK

  5. 12.7 linux学习第十四天

    今天老刘开始讲第10章,主要讲Ahache服务和SELinux安全子系统 10.1 网站服务程序 1970年,作为互联网前身的ARPANET(阿帕网)已初具雏形,并开始向非军用部门开放,许多大学和商业 ...

  6. SpringMVC配置文件applicationContext.xml头信息

    applicationContext.xml头信息 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  7. Mysql_5.7编译部署

    自述 - 概述:数据库是"按照数据结构来组织.存储和管理数据的仓库".是一个长期存储在计算机内的.有组织的.可共享的.统一管理的大量数据的集合:本文主要介绍mysql_5.7的部署 ...

  8. 基于4g智能路由器的充电桩远程监测管理应用

    随着我国电动车保有量的持续增加,充电桩的需求也水涨船高,成为城市发展必备的基础设施之一.相较加油站,充电桩分布更广泛,部署场景更多样,与场景的融合程度也更深,诸如各类停车与充电二合一的站点.因此,对于 ...

  9. rules验证数值大于0

    [['mobile'],'number'],[['mobile'],'compare','compareValue' =>0,'operator' => '>']compare对比, ...

  10. DOC命令学习(一)

    DOC命令学习(一) 命令 切换目录命令(cd) cd /d E: 查看目录命令(dir) dir   #查看# 回显命令(echo) @echo offset d = %date:~0,10%set ...