T1

当然不能枚举每个区间,于是我们考虑算贡献。

对于每个位置i,我们计算其作为区间内第一个出现ai的位置的区间总数,则有ans=sigma( i - last[i] ) * ( n - i + 1 ) ,n为区间长度,last[i]为上一个出现ai的位置。

(其实还有一种简单的递推思路,定义f[i]为前 i 个数的权值和,f[i] = fi[-1] + i - last[i] ,可是我太菜了,没想清楚以为是错的Orz)

这样我们解决了k=1的情况。

然后我们考虑k不等于1

如果我们复制第一段区间插在后面,定义第一段区间的权值和为C1,前两段为C2,则第二段对这两段的贡献delta=C2-C1,而且显然 第三段对第二、三两段的贡献也为delta,后面的同理。

这样我们解决了相邻复读区间的贡献。

对于不相邻的复读区间,由于跨一整个区间,则每个区间的权值都为tot,计算这些区间的总数即可。

代码:

#include <cstdio>
#include <map>
#include <iostream> #define int long long int using namespace std; const int mod=1e9+7; inline int read() {
int x=0,f=1;
char cr=getchar();
while (cr>'9' || cr<'0') {
if (cr=='-') f=-1;
cr=getchar();
}
while (cr>='0' && cr<='9') {
x=(x<<3)+(x<<1)+cr-'0';
cr=getchar();
}
return x*f;
} const int maxn=1000500; map<int,int> loc; int a[maxn],last[maxn]; inline int sigma(int k) {
int x=k,y=k+1;
if (x&1) return (y/2*x)%mod;
return (x/2*y)%mod;
}
signed main() {
int n=read(),k=read();
int tot=0;
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++) {
if (!loc[a[i]]) tot++;
last[i]=loc[a[i]],loc[a[i]]=i;
}
if (k==1) {
int ans=0;
for (int i=1;i<=n;i++) ans+=(i-last[i])*(n-i+1),ans%=mod;
printf("%lld",ans);
return 0;
}
else {
int cont1=0,cont2=0;
for (int i=1;i<=n;i++) cont1+=(i-last[i])*(n-i+1),cont1%=mod;
for (int i=n+1;i<=2*n;i++) a[i]=a[i-n],last[i]=loc[a[i]],loc[a[i]]=i;
for (int i=1;i<=2*n;i++) cont2+=(i-last[i])*(2*n-i+1),cont2%=mod;
int delt=cont2-cont1+mod;delt%=mod;
int ans=cont2;
ans+=(k-2)*(delt),ans%=mod;
ans+=(sigma(k-2)*n%mod*n%mod*tot%mod)%mod,ans%=mod;
printf("%lld",ans);
return 0;
}
}

  

【随缘更(gu)】牛客D4简要思路(没有题解)的更多相关文章

  1. 牛客网36-A,B题解

    A.Rabbit的字符串 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Rabbit得到了一 ...

  2. 牛客NOIP提高组(二)题解

    心路历程 预计得分:100 + 40 + 30 = 170 实际得分:100 + 30 + 0 = 130 T2有一个部分分的数组没开够RE了. T3好像是思路有点小问题.. 思路没问题,实现的时候一 ...

  3. 【牛客Wannafly挑战赛12】 题解

    传送门:https://www.nowcoder.com/acm/contest/79#question 说是比赛题解,其实我只会前三题: 后面的一定补 T1 题意,在一个长度为n的时间内,问如何选择 ...

  4. 牛客练习赛71 数学考试 题解(dp)

    题目链接 题目大意 要你求出有多少个长度为n的排列满足m个限制条件 第i个限制条件 p[i]表示前 p[i]个数不能是1-p[i]的排列 题目思路 这个感觉是dp但是不知道怎么dp 首先就是要明白如果 ...

  5. 牛客练习赛66 C公因子 题解(区间gcd)

    题目链接 题目大意 给你一个长为n的数组,给所有数组元素加上一个非负整数x,使得这个数组的所有元素的gcd最大 题目思路 这主要是设计到一个多个数gcd的性质 gcd(a,b,c,d.....)=gc ...

  6. 牛客练习赛69 火柴排队 题解(dp)

    题目链接 题目大意 给你一个长为n(n<=5e3)的数组a.随机使得k个元素增加d.要你求多大的概率使得,这些数组元素的相对大小不发生改变 输出 n 行每行一个整数,第 i 行的整数表示 k=i ...

  7. 10.6-10.7 牛客网NOIP模拟赛题解

    留个坑... upd:估计这个坑补不了了 如果还补不了就删了吧

  8. 牛客NOIP提高组(三)题解

    心路历程 预计得分:$30 + 0 + 0 = 30$ 实际得分:$0+0+0= 0$ T1算概率的时候没模爆long long了... A 我敢打赌这不是noip难度... 考虑算一个位置的概率,若 ...

  9. 牛客练习赛60 A—F题解(缺E题)

    本蒟蒻这次只过了三题 赛后学习了一下出题人巨佬的标码(码风比我好多了 贴的代码有些是仿出题人)现在将自己的理解写下来与大家分享 A这个题一分析就是每个数字都会与所有数字&一下 (a&a ...

随机推荐

  1. HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)

    HYStockChart, 股票图(包括K线图.趋势图.成交量.滚动.放大缩小等) https://www.helplib.com/GitHub/article_127980git 地址 http:/ ...

  2. 【代码总结】GD库中简单的验证码

    大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...

  3. ubuntu apache 通过端口新建多个站点

    cd /etc/apache2/sites-available 最近的虚拟机没绑定域名,所以呢,就先用域名加端口新建几个站点用着 1. vim /etc/apapche2/apapche2.conf ...

  4. Centos5.5+LAMP环境

    Note:如果网络正常,apache服务正常,仍然不能访问网页.需要检查linux 防火墙是否关闭. ( 先重新启动防火墙 service iptables start 然后输入配置防火墙的命令并查看 ...

  5. 【Fine学习笔记】Jmeter笔记

    熟悉几个专有名词: 1.测试计划是顺序执行的,一个性能测试必须有的三部分:测试计划.线程组.sampler(采样器)--核心 2.控制器(用来定义请求执行的):loop if else 3.timer ...

  6. bootstrap标记说明

    <span class="caret"> 这就是 一个倒三角

  7. tomcat配置限制ip和建立图片服务器

    1.配置限制ip访问 打开 tomcat里conf文件下的server.xml 在<Host name="localhost" appBase="webapps&q ...

  8. 虚拟机下修改ip配置

    // centos ip 配置vim /etc/sysconfig/network-scripts/ifcfg-eth0 // 虚拟机下删除里面的内容vim /etc/udev/rules.d/70- ...

  9. MySQL8.0 ROW_NUMBER、RANK、DENSE_RANK窗口函数 分组排序排名

    MySQL8.0 (ROW_NUMBER)窗口函数 排名 暂时理解函数意义,后面再进行优化,如果有关变量排序,查看这个大哥的 mysql的分组排序和变量赋值顺序 先查看一个例子: # 按照每科课程分数 ...

  10. centos初始化脚本

    centos初始化脚本 添加IP.主机名.挂载/dev/sdb1磁盘 #!/bin/bash # ip=$ hostname=$ if [ -z $ip ] || [ -z $hostname ]; ...