链接:https://ac.nowcoder.com/acm/contest/3005/H
来源:牛客网

大致题意:让我们针对每一个数,求这个数左区间和右区间颜色相同(也就是数字相同)得对数;
比如:左边3个“3'得颜色,右边2个‘3’得颜色,就有2*3=6对;
数据范围为5e5;所以可接受得复杂度为nlogn;
那么我们可以考虑线段树;
如何维护呢?
我们用两个vis去标记左边和右边各种颜色的个数;代码中visa标记的是右区间,visb标记的是左区间;
然后从左往右遍历一遍:
  在某一次操作中,我们对第K个数求值;那么我们需要先把右区间颜色k的减1;
这个时候假如左区间有这个K数,我们就需要将这个数包含的对数求出来,然后update,
这里有个细节,假如k-1==k,那么需要减掉的对数要减1;
因为k-1并没有在上次的操作中计算;
然后,我们就求K-1这个位置的颜色在右区间的个数,然后将这个数update;
在跑一遍线段树求出第K个数的query(l,r,1)即可;
 
 
 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+;
int visa[maxn];
int visb[maxn];
ll ans[maxn];
struct node
{
int val,l,r;
}a[maxn];
struct haa
{
int l;int r;
ll sum;
}tree[maxn<<];
void build(int l,int r,int root)
{
tree[root].l=l;tree[root].r=r;
tree[root].sum=;
if(l==r) return;
int mid=l+r>>;
build(l,mid,root<<);
build(mid+,r,root<<|);
}
void up(int root)
{
tree[root].sum=tree[root<<].sum+tree[root<<|].sum;
}
void update(int pos,int val,int root)
{
int L=tree[root].l;
int R=tree[root].r;
if(L==R){
tree[root].sum+=val;
return;
}
int mid=L+R>>;
if(pos<=mid) update(pos,val,root<<);
else update(pos,val,root<<|);
up(root);
}
ll query(int l,int r,int root)
{
int L=tree[root].l;
int R=tree[root].r;
if(l<=L&&r>=R){
return tree[root].sum;
}
ll ans=;
int mid=L+R>>;
if(l<=mid) ans+=query(l,r,root<<);
if(r>mid) ans+=query(l,r,root<<|);
return ans;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&a[i].val,&a[i].l,&a[i].r);
visa[a[i].val]++;
}
build(,maxn,);
ans[]=;
visa[a[].val]--; //右区间--
visb[a[].val]++; //左区间++;
for(int i=;i<=n;i++){
visa[a[i].val]--; //右区间--;
if(visb[a[i].val]){ //如果左区间包含这个数的话;
//我们就需要减掉与这个数相关的对数;
//但是左区间包含i-1这一项;而这一项在上次操作中没有出现;
//所以当两者相等的时候,tmp--;
int tmp=visb[a[i].val];
if(a[i-].val==a[i].val) tmp--;
update(a[i].val,-tmp,);
}
int tmp=visa[a[i-].val];
update(a[i-].val,tmp,);
ans[i]=query(a[i].l,a[i].r,);
visb[a[i].val]++;
}
for(int i=;i<=n;i++)
printf("%lld ",ans[i]);
printf("\n");
return ;
}

2020算法设计竞赛 H 坐火车的更多相关文章

  1. 2020算法设计竞赛 I、匹配星星

    链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 天上有n颗星星,每颗星星有二维坐标(xi,yi)(x_i, y_i)(xi​,yi​),还有一个 ...

  2. 2020算法设计竞赛 C 汉诺塔

    作者:珩月链接:https://ac.nowcoder.com/discuss/367149来源:牛客网 将木板按照Xi从小到大排序,将这时的Yi数列记为Zi数列,则问题变成将Zi划分为尽可能少的若干 ...

  3. 2020牛客寒假算法基础集训营4 H坐火车

    题目描述 牛牛是一名喜欢旅游的同学,在来到渡渡鸟王国时,坐上了颜色多样的火车. 牛牛同学在车上,车上有 n 个车厢,每一个车厢有一种颜色. 他想知道对于每一个正整数 $ x \in [1,\ n] $ ...

  4. 2020年算法设计竞赛 DP

    链接:https://ac.nowcoder.com/acm/contest/3002/I来源:牛客网https://ac.nowcoder.com/acm/contest/3002/I 题目描述 & ...

  5. 集训第四周(高效算法设计)H题 (贪心)

    Description   Most financial institutions had become insolvent during financial crisis and went bank ...

  6. 2020 年TI 杯大学生电子设计竞赛E题总结(放大器非线性失真研究装置)

    2020年TI杯大学生电子设计竞赛E题总结(放大器非线性失真研究装置) 摘要:E题的竞赛内容主要是参赛者自己搭建一个晶体管放大器,能够产生不失真.顶部失真.底部失真.双向失真和交越失真五种波形,并分别 ...

  7. 算法设计与分析 - 李春葆 - 第二版 - html v2

    1 .1 第 1 章─概论   1.1.1 练习题   1 . 下列关于算法的说法中正确的有( ).   Ⅰ Ⅱ Ⅲ Ⅳ .求解某一类问题的算法是唯一的   .算法必须在有限步操作之后停止   .算法 ...

  8. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)

    前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...

  9. 算法设计手冊(第2版)读书笔记, Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008

    The Algorithm Design Manual, 2ed 跳转至: 导航. 搜索 Springer - The Algorithm Design Manual, 2ed Steven S.Sk ...

随机推荐

  1. go 算法与数据结构

    数据结构 稀疏数组 package main import "fmt" /* 稀疏数组 案例:五子棋存盘与复盘 节省存储空间 */ type ValNode struct { ro ...

  2. centos tomcat解压版安装

    解压: tar -xzvf apache-tomcat-8.5.23.tar.gz -C /usr/local/java 配置Tomcat的环境变量: export CATALINA_HOME=/us ...

  3. PTA 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...

  4. Luogu1738 | 洛谷的文件夹 (Trie+STL)

    题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:\(/luogu/application ...

  5. pads无模命令

    W<n>………改变线宽,比如 30. 栅格(Grids) G<xx>………过孔和设计栅格设置.GD<xx>………显示栅格设置.GP………打开或关闭极性栅格.GP r ...

  6. BFS和队列

    深度优先搜索(DFS)和广度优先搜索(BFS)是基本的暴力技术,常用于解决图.树的遍历问题. 首先考虑算法思路.以老鼠走迷宫为例: (1):一只老鼠走迷宫.它在每个路口都选择先走右边,直到碰壁无法继续 ...

  7. @Autowired、@Resource、@Qualifier区别

    @Autowired 1.属于spring的注解,如果不想和Spring耦合的太紧,就不推荐使用. 2.默认情况下,要求依赖对象必须存在,不能为null.如果允许为空,那么设置属性值required为 ...

  8. Java(三)String类

    一.String类初始化方法 1.初始化一个空字符串 String str=new String();//这里调用了String的无参构造方法 2.初始化一个有值的字符串 String str1=&q ...

  9. youhua

  10. vConsole 让你在手机上也能轻松调试网页

    有时候为了想在手机真机上对网页进行 Debug,可手机上没有 F12,用 Chrome DevTools 连接手机操作又太过复杂.VConsole 的出现,正好解决了这一痛点! (下列内容照搬一下官方 ...