正题

题目链接:https://www.luogu.com.cn/problem/P6477
话说这是luogu的冥间数据


题目大意

nnn个数的序列,f(l,r)f(l,r)f(l,r)表示l∼rl\sim rl∼r有多少个不同的数字。

求∑l=1n∑r=ln(f(l,r))2\sum_{l=1}^n\sum_{r=l}^n(f(l,r))^2l=1∑n​r=l∑n​(f(l,r))2


解题思路

考虑多一个数字会多出2n+12n+12n+1(n表示原来数字个数)。

线段树维护f(1∼i−1,i)f(1\sim i-1,i)f(1∼i−1,i)的和,然后每个数字能影响的范围是i到上一个和它相同的数字的后一个位置处,我们修改这部分的数据然后每次统计答案即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define lowbit(x) (x&-x)
#define siz(x) (t[x].r-t[x].l+1)
#define k(x) (((x)>XJQ)?((x)-XJQ):(x))
#define ll long long
using namespace std;
const ll N=1e6+10,XJQ=1e9+7;
ll n,ans,answer;
ll a[N],b[N],last[N],v[N];
ll read() {ll x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
struct Seq_Tree{struct Tree_node{ll l,r,val,lazy;}t[N*4];void Build(ll x,ll l,ll r){t[x].l=l;t[x].r=r;if(l==r)return;ll mid=(l+r)>>1;Build(x*2,l,mid);Build(x*2+1,mid+1,r);return;}void DownData(ll x){if(!t[x].lazy)return;(t[x*2].lazy+=t[x].lazy)%=XJQ;(t[x*2+1].lazy+=t[x].lazy)%=XJQ;(t[x*2].val+=t[x].lazy*siz(x*2))%=XJQ;(t[x*2+1].val+=t[x].lazy*siz(x*2+1))%=XJQ;t[x].lazy=0;return;}void Change(ll x,ll l,ll r,ll val){if(t[x].l==l&&t[x].r==r){(t[x].lazy+=val)%=XJQ;(t[x].val+=val*siz(x))%=XJQ;return;}DownData(x);ll mid=(t[x].l+t[x].r)>>1;if(r<=mid) Change(x*2,l,r,val);else if(l>mid) Change(x*2+1,l,r,val);else Change(x*2,l,mid,val),Change(x*2+1,mid+1,r,val);t[x].val=(t[x*2].val+t[x*2+1].val)%XJQ;return;}ll Ask(ll x,ll l,ll r){if(t[x].l==l&&t[x].r==r)return t[x].val;DownData(x);ll mid=(t[x].l+t[x].r)>>1;if(r<=mid) return Ask(x*2,l,r);if(l>mid) return Ask(x*2+1,l,r);return (Ask(x*2,l,mid)+Ask(x*2+1,mid+1,r))%XJQ;}
}T;
int main()
{n=read();for(ll i=1;i<=n;i++)a[i]=b[i]=read();sort(b+1,b+1+n);ll m=unique(b+1,b+1+n)-b-1;for(ll i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+m,a[i])-b;last[i]=v[a[i]];v[a[i]]=i;}T.Build(1,1,n);T.Change(1,1,1,1);ans=answer=1;for(ll i=2;i<=n;i++){(ans+=2*T.Ask(1,last[i]+1,i)+i-last[i])%=XJQ;T.Change(1,last[i]+1,i,1);(answer+=ans)%=XJQ;}printf("%lld",answer);
}

P6477-[NOI Online #2 提高组]子序列问题【线段树】相关推荐

  1. P7470 [NOI Online 2021 提高组] 岛屿探险

    题目链接:P7470 [NOI Online 2021 提高组] 岛屿探险 以前都没有真正把cdqcdqcdq搞懂过,趁这次比赛花时间学了一下 SolutionSolutionSolution 对于m ...

  2. NOI Online #2 提高组 第一题:涂色游戏

    NOI Online #2 提高组 第一题:涂色游戏 前言 题目 解析 代码 前言 呦呵,这道题我竟然爆零了 而且我的暴力dfs死循环了!\bold{\Large\xcancel\text{而且我的暴 ...

  3. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

    problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi​. 如果到 iii 时,栈顶已经为 pip_ipi​ ...

  4. 题解 P6476 【[NOI Online #2 提高组]涂色游戏】

    你有 102010^{20}1020 个格子,它们从 00 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色: 编号是 p1p_1p1​ 倍数的格子(包括 00 号格子,下同)染成红色. ...

  5. luogu P6476 [NOI Online 2 提高组]涂色游戏color

    题面传送门 考虑一下,其实只要管一个两个倍数点到另一个两个倍数点就好了. 设p1<p2p_1<p_2p1​<p2​ 贪心一下,发现两个倍数点都赋值p2p_2p2​就是最优的. 对于任 ...

  6. 【数论gcd】P6476 [NOI Online #2 提高组]涂色游戏(luogu)

    思路: gcd缩范围然后模拟p1红p2蓝设p1<p2否则换过来,然后从1开始,过k−1个倍数之后他是否还在范围内,如果在范围内,就有k个蓝色相连,然后按照题目输出 CodeCodeCode: # ...

  7. 【NOI Online 2022 提高组 B】【洛谷 P8252】讨论 题解

    一口气写了 2700 多字,然而代码只有 1500 B( Description 传送门 Solution 显然,我们所要做的事,就是构造出一对 ( i , j ) (i,j) (i,j),使得编号为 ...

  8. [NOI Online #3 提高组] 水壶

    水壶 题目地址 题目描述: 有 n 个容量无穷大的水壶,它们从 1∼n 编号,初始时 i 号水壶中装有 Ai 单位的水. 你可以进行不超过 k 次操作,每次操作需要选择一个满足 1≤x≤n−1 的编号 ...

  9. 2019.1.21【NOIP提高组】模拟B组 JZOJ 4208 线段树什么的最讨厌了

    DescribeDescribeDescribe 给定buildtreebuildtreebuildtree函数 void buildtree(int k,int l,int r) {if(l==r) ...

最新文章

  1. java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. Error when loading the SDK:
  3. mac 下launchpad超级慢的问题
  4. 广播电视加速技术迭代,用新技术拥抱行业转型
  5. IIS安装与MVC程序部署
  6. word List 15
  7. update和delete操作忘加where条件导致全表更新的处理方法
  8. linux 命令行下导出查询的数据
  9. 用命令行批处理bat,设置代理服务器、DNS、网关、WINS等
  10. poj1860Currency Exchange(bell_fordmoban)
  11. 代码管理学:安排新员工看代码,因为主管不会管理,不负责任
  12. 常见的python算法题_python笔试常见题
  13. 万能五笔-98五笔方案
  14. 河南2002年计算机比赛,河南省体育局竞技体育管理信息系统(TYMIS2003)
  15. python 拟合圆_OpenCV曲线拟合与圆拟合
  16. 计算机表格简单教程视频教程,电脑如何制作表格步骤 教你制作简单的excel表格...
  17. 杭州自己缴纳社保五险条件
  18. P语言: 为异步、容错和不确定性而生的编程语言
  19. L1正则化与L2正则化详解
  20. 拿两千块钱的薪水要有一万块钱的范儿--蜗居编剧

热门文章

  1. python爬虫登录有验证码_大神教你用Python爬虫模拟登录带验证码网站
  2. html 存储登录状态,Vue中保存用户登录状态实例代码
  3. php如何将页面嵌入在另一盒子里,如何将一个盒子在显示在浏览器的正中间_html/css_WEB-ITnose...
  4. mysql pmod项目_内置函数 - 数学函数 - 《Apache Doris 文档(201812)》 - 书栈网 · BookStack...
  5. liunx+java+jar+运行_Linux后台运行java的jar包
  6. matlab仿真习题,(MATlab仿真部分习题答案.doc
  7. java 云架构_java版Spring Cloud云架构代码结构构建
  8. MVC三层架构(详解)
  9. leetcode1047. 删除字符串中的所有相邻重复项
  10. leetcode459. 重复的子字符串(KMP)