校内测试 ------T3

对于这个题,首先想到的应该就是暴力枚举了吧,看看数据范围,60就是白送的啦!(但是我也不知道怎么才20分qwq)

思路分析:

这个题要你求所有套餐的总价值,先看一眼产生套餐的条件:

让我们对x+y=z-2y这个式子进行化简:

x+y=z-2y   =>   x+3y=z   =>   z-x=3y

产生的价值为:

我们可以注意到y对产生的价值的贡献为0(就是说跟y没什么关系),所以上面的式子其实我们知不知道y也就无所谓了,知道了也没什么用,还不如不知道qwq。

化简之后,我们可以重新来定义一下产生套餐的条件了:

x<z且(z-x)%3=0且

所以暴力的同学就不用开三重循环啦,两重就够了qwq。

之前的悲惨代码qwq,跑得超慢,差不多7s:

#include<iostream>
#include<cstdio>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
int n,m,ans;
const int mod=;
int a[],b[];
int main()
{
n=read();m=read();
for(int i=;i<=n;i++) b[i]=read()%mod;
for(int i=;i<=n;i++) a[i]=read();
for(int x=;x<=n;x++)
{
for(int z=x;z<=n;z+=)
{
if(z==x) continue;
if(a[z]==a[x])
ans+=(x+z)*(b[x]-b[z])%mod;
}
}
cout<<(ans+mod)%mod;
return ;
}

然后,rqy神仙讲了一个O(n)的算法,直接从降到了!!!不愧是大佬,在这里%一下。

讲下rqy的思路:

跟上面不同的是,我们套餐的价格不再是按照上面的公式求了,而是把它展开:

(x+z)*(bx-bz)=xbx-xbz+zbx-zbz

 我们从1~n枚举每一个z,那么对于z前面的所有下标相差3的整数倍且与z同种的x都可以与z产生一个套餐,那么ans都要加一下上面的那个公式;

我们先假设我们枚举到的这个z它的前面有3个符合条件的x,分别记为x1,x2,x3

x1与z产生的套餐的价值为:(x1+z)*(bx1-bz)=x1bx1-x1bz+zbx1-zbz

x2与z产生的套餐的价值为:(x2+z)*(bx2-bz)=x2bx2-x2bz+zbx2-zbz

x3与z产生的套餐的价值为:(x3+z)*(bx3-bz)=x3bx3-x3bz+zbx3-zbz

那么对于当前这个z,它能产生的价值就是:(x1bx1-x1bz+zbx1-zbz)+(x2bx2-x2bz+zbx2-zbz)+(x3bx3-x3bz+zbx3-zbz);

我们将它进行合并同类项,得到:(x1bx1+x2bx2+x3bx3)-bz(x1+x2+x3)+z(bx1+bx2+bx3)-zbz*3;

我们可以将这个式子进行推广,假设z前面有n的符合条件的x,那么当前这个z能产生的总价值就是:

(x1bx1+x2bx2+x3bx3+……+xnbxn)-bz(x1+x2+x3+……xn)+z(bx1+bx2+bx3+……+bxn)-zbz*n;

=∑(xbx)-bz*∑(x)+z*(∑bx)-zbz*∑1  (∑1就是符合条件的x的个数)

这个公式就是这个O(n)算法的核心!!!

所以对于当前z,我们只要求出它前面的∑(xbx),∑(x),∑bx,∑1,那么z产生的总价值我们就可以O(1)算出,再加上我们枚举的范围是1~n,所以这个算法的复杂度为O(n)!

但是,怎么求那上面的那几个∑呢?

问得好!我们开数组来分别存上面的几个∑的值,注意这几个数组的下标都是种类:

sx[100005]       //表示前面x下标的总和;∑(x)

sbx[100005]     //表示前面x的美味值的总和;∑bx

sxbx[100005]   //表示前面x的下标乘美味值的总和;∑(xbx)

s[100005]        //表示前面x的个数;∑1

首先我们要解决x和z下标差3的倍数的问题,这个好弄,将mod(3)=0的存为一类,mod(3)=1的存为一类,mod(3)=2的存为一类,那么对于每一类它们的下标相差一定是3的倍数;

然后我们要解决x和z要属于同一种的问题,这就要用到了我们之前把数组的下标定位种类的原理了:

我们将每一种类的桶的∑都存在了数组里面,所以我们只要找和z种类相同的就行了,ans更新如下:

            ans=(ans+sxbx[a[z]])%mod;
ans=(ans-z%mod*b[z]%mod*s[a[z]]%mod)%mod; //这里多mod几遍,可能会爆int
ans=(ans+z*sbx[a[z]]%mod)%mod;
ans=(ans-b[z]*sx[a[z]]%mod)%mod;

更新完ans之后,对于以后的Z,当前的z也有可能成为x,所以我们要让z更新一下和z属于同一种的∑:

            sxbx[a[z]]=(sxbx[a[z]]+z*b[z]%mod)%mod;
s[a[z]]=(s[a[z]]+)%mod;
sbx[a[z]]=(sbx[a[z]]+b[z])%mod;
sx[a[z]]=(sx[a[z]]+z)%mod;

到这里,就做完了,完整代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int a[],b[],sxbx[],sx[],sbx[],s[];
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
int n,m;
long long ans;
const int mod=;
int main()
{
n=read();
m=read();
for(int i=;i<=n;i++) b[i]=read()%mod; //种类a,美味值b
for(int i=;i<=n;i++) a[i]=read();
ans=;
for(int c=;c<=;c++) //一共三类:mod(3)=1 / 2 / 3
{
memset(sxbx,,sizeof(sxbx)); //千万不要忘了清零,防止对其他类的影响
memset(s,,sizeof(s));
memset(sbx,,sizeof(sbx));
memset(sx,,sizeof(sx));
for(int z=c;z<=n;z+=) //解决下标差3的倍数的问题
{
ans=(ans+sxbx[a[z]])%mod; //更新ans值,注意要和z同种
ans=(ans-z%mod*b[z]%mod*s[a[z]]%mod)%mod; //这里多mod几遍,可能会爆int
ans=(ans+z*sbx[a[z]]%mod)%mod;
ans=(ans-b[z]*sx[a[z]]%mod)%mod;
sxbx[a[z]]=(sxbx[a[z]]+z*b[z]%mod)%mod; //加上z的贡献,注意要和z同种
s[a[z]]=(s[a[z]]+)%mod;
sbx[a[z]]=(sbx[a[z]]+b[z])%mod;
sx[a[z]]=(sx[a[z]]+z)%mod;
}
}
cout<<(ans+mod)%mod; //防止答案为负数
return ;
}

考试有很多大佬比如ybr大佬没有发挥好,才让本蒟蒻rank 6的qwq。

T2695 桶哥的问题——吃桶 题解的更多相关文章

  1. T2695 桶哥的问题——吃桶

    ~~~~~我~是~真的~忍不了~这个~取模~的~锅~了~~~~~ T2695 桶哥的问题——吃桶 前传 1.T2686 桶哥的问题——买桶 这题真的hin简单,真的 2.T2691 桶哥的问题——送桶 ...

  2. 【桶哥的问题——吃桶-简化版】【洛谷p2671】求和

    求和=>[链接] 题目相较起_rqy出的要简单很多,来自noip普及组2015 化简这个式子:x+z=2y,故x与z mod 2同余,因此和桶哥的问题——吃桶一样的思路就可以做出来啦qwq: # ...

  3. 校内题目T2695 桶哥的问题——吃桶

    同T2一样外校蒟蒻可能没看过: 题目描述: 题目背景 @桶哥 桶哥的桶没有送完. 题目描述 桶哥的桶没有送完,他还有n个桶.他决定把这些桶吃掉.他的每一个桶两个属性:种类aia_iai​和美味值bib ...

  4. 【洛谷T2695 桶哥的问题——吃桶】

    这是我们团队的一个题目(就是一个_rqy说很好写的题QwQ) 题目背景 @桶哥 这个题目的思路很玄学(性感_rqy在线讲解) 60 Pts 对于前面的六十分,好像很好拿,单纯的打一个模拟 唯一需要注意 ...

  5. 校内题目T2691 桶哥的问题——送桶

    这是一道校内题目,但迷路的蒟蒻们同样被欢迎来此学习QWQ 题目描述: 题目背景 @桶哥本校——皎月pks大佬OrzOrz 买完了桶,桶哥要去送桶. 题目描述 桶哥买了nn个桶, 他要将这些桶送去nn个 ...

  6. T2695 桶哥的问题——送桶 题解

    校内测试 ------T2 看完这个题,就觉得和贪心那一块的任务调度很像,于是思路就是贪心啦! 蒟蒻的我,也就只能想到用贪心了,但是不知道怎么用qwq 这是我考试当时的思路,数据水骗了80分qwq: ...

  7. T2691 桶哥的问题——送桶

    这个题其实不难,就是按照结束时候的顺序从大到小走一遍,能送的就送,如果区间不重合就更新一下 代码: #include<iostream> #include<cstdio> #i ...

  8. 洛谷 T2691 桶哥的问题——送桶

    嗯... 题目链接:https://www.luogu.org/problem/T2691 这道题有一点贪心的思想吧...并且思路与题目是倒着来的(貌似这种思路已经很常见的... 先举个栗子: 引出思 ...

  9. 【校内test】桶哥的问题

    (以上题目出自_rqy两年前) #A:桶哥的问题——买桶[链接] [题目描述] 桶哥要买一些全家桶.他有a元钱,而每个桶要花b元钱.他能不能买到c个桶? [输入格式] 一行三个整数a, b, c [输 ...

随机推荐

  1. easyui datagrid 合并相同行

    $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return jq.each(function () ...

  2. Ansible 自动化工具入门

    Ansible 配置 Ansible 简单管理 下面的小实验,我们将采用以下的IP地址规划,请自行配置好. [实验环境] [状态] [主机列表] [python版本] 控制机 192.168.1.10 ...

  3. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  4. TCP协议探究(二):超时与重试

    1 概述 TCP提供可靠的运输层. 可靠性保证之一:确认从另一端收到的数据. 但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题. 如果当定时器溢出时还没有收到确认,它就重传该 ...

  5. Unsupported major.minor version 52.0错误和 jdbc odbc

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...

  6. 怎么处理sqlserver2017部署在winowsDocker上时区无法修改成功的方式,并且可以多创建新的容器调用简单的方式直接使用!

    在创建该容器的时候我们执行的语句中添加了一个 从图中所看到的内容,上海时区,按照正常流程一般都是可疑正常执行的,但最后事情并不是我们所想的那么简单. 我们进入对应的容器里面 ,执行语句之后查找对应的文 ...

  7. 客户端相关知识学习(十)之app给h5传递数据

    方法一: app可以把参数传到h5的链接里,用类似?xx=xx&xx=xx的形式拼接,js解析参数即可. 方法二: 情况一:app调用h5 原生app都可以对js的function进行触发,前 ...

  8. Subplots

    数据读取: Subplotting 先展示下我们在画一张图时的步骤 生成一个matplotlib Figure对象 生成一个matplotlib AxesSubplot 对象,然后将其赋值给Figur ...

  9. JavaScript-->基础类型和引用类型的区别

    先了解一下数组的基础知识:附代码(数组属于引用类型的对象) <!DOCTYPE html> <html lang="en"> <head> &l ...

  10. mycat sql timeout 问题解决

    发现程序中有个批量update语句需要update 16000多条数据导致超时 2019-11-06 10:35:28.312 pool-9-thread-24 ERROR com.hp.nova.c ...