[Codeforces]848C - Goodbye Souvenir
题目大意:n个数字,m次操作,支持修改一个数字和查询一个区间内每种数字最大出现位置减最小出现位置的和。(n,m<=100,000)
做法:把每个数字表示成二维平面上的点,第一维是在数组中的位置,第二维是在数组中前一个相同数字的位置,权值为这两个位置的差,询问等同于求矩形和,修改时会影响自己和相邻的相同数字,每种开一个set维护即可。矩形和可以用cdq分治,不容易被卡空间。
代码:
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<vector>
- #include<cstdio>
- #include<queue>
- #include<map>
- #include<set>
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- #define MN 100000
- #define N 131072
- set<int> s[MN+];
- int a[MN+],ls[MN+],wn,qn,pn;
- long long ans[MN+],t[N*+];
- struct work{int t,a,b,c;}w[MN*+];
- struct P{int t,a,b,c,d;}p[MN*+];
- bool cmp(const P&a,const P&b){return a.a==b.a?a.t<b.t:a.a<b.a;}
- void add(int k,int x){for(k+=N;k;k>>=)t[k]+=x;}
- long long query(int l,int r)
- {
- long long res=;
- for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
- {
- if(~l&)res+=t[l+];
- if( r&)res+=t[r-];
- }
- return res;
- }
- void solve(int l,int r)
- {
- int mid=l+r>>,i;
- if(l<r)solve(l,mid),solve(mid+,r);
- for(pn=,i=l;i<=mid;++i)if(w[i].t<)p[++pn]=(P){,w[i].a,w[i].b,w[i].c,};
- for(;i<=r;++i)if(w[i].t>)p[++pn]=(P){,w[i].a-,w[i].a,w[i].b,w[i].c},
- p[++pn]=(P){,w[i].b,w[i].a,w[i].b,w[i].c};
- sort(p+,p+pn+,cmp);
- for(i=;i<=pn;++i)
- {
- if(p[i].t==)add(p[i].b,p[i].c);
- if(p[i].t==)ans[p[i].d]-=query(p[i].b,p[i].c);
- if(p[i].t==)ans[p[i].d]+=query(p[i].b,p[i].c);
- }
- for(i=;i<=pn;++i)if(p[i].t==)add(p[i].b,-p[i].c);
- }
- int main()
- {
- int n,m,i,t,x,y;
- n=read();m=read();
- for(i=;i<=n;s[a[i]].insert(ls[a[i]]=i),++i)
- if(ls[a[i]=read()])w[++wn]=(work){,i,ls[a[i]],i-ls[a[i]]};
- for(i=;i<=m;++i)
- {
- t=read();x=read();y=read();
- if(t==)
- {
- set<int>::iterator i=s[a[x]].find(x),j=i,k=i;++k;
- if(i!=s[a[x]].begin())
- {
- --j;w[++wn]=(work){,x,*j,*j-x};
- if(k!=s[a[x]].end())w[++wn]=(work){,*k,*j,*k-*j};
- }
- if(k!=s[a[x]].end())w[++wn]=(work){,*k,x,x-*k};
- s[a[x]].erase(i);
- s[a[x]=y].insert(x);
- i=j=k=s[y].find(x);++k;
- if(i!=s[y].begin())
- {
- --j;w[++wn]=(work){,x,*j,x-*j};
- if(k!=s[y].end())w[++wn]=(work){,*k,*j,*j-*k};
- }
- if(k!=s[y].end())w[++wn]=(work){,*k,x,*k-x};
- }
- else w[++wn]=(work){,x,y,++qn};
- }
- solve(,wn);
- for(i=;i<=qn;++i)printf("%I64d\n",ans[i]);
- }
[Codeforces]848C - Goodbye Souvenir的更多相关文章
- Codeforces 848C Goodbye Souvenir(CDQ 分治)
题面传送门 考虑记录每个点的前驱 \(pre_x\),显然答案为 \(\sum\limits_{i=l}^{r} i-pre_i (pre_i \geq l)\) 我们建立一个平面直角坐标系,\(x\ ...
- Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]
洛谷 Codeforces 这题我写了四种做法-- 思路 不管做法怎样,思路都是一样的. 好吧,其实不一样,有细微的差别. 第一种 考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献 ...
- [Codeforces]849E Goodbye Souvenir
又是一道比较新的模板题吧,即使是在Codeforces上小C还是贴了出来. Description 给定一个长度为n的序列a1~an,每个元素代表一种颜色.m次操作,每次操作为两种中的一种: 1 p ...
- Codeforces 848C (cdq分治)
Codeforces 848C Goodbye Souvenir Problem : 给一个长度为n的序列,有q个询问.一种询问是修改某个位置的数,另一种询问是询问一段区间,对于每一种值出现的最右端点 ...
- 【Codeforces 848C】Goodbye Souvenir
Codeforces 848 C 题意:给\(n\)个数,\(m\)个询问,每一个询问有以下类型: 1 p x:将第p位改成x. 2 l r:求出\([l,r]\)区间中每一个出现的数的最后一次出现位 ...
- CF848C:Goodbye Souvenir(CDQ分治)
Description 给定长度为$n$的数组, 定义数字$X$在$[l,r]$内的值为数字$X$在$[l,r]$内最后一次出现位置的下标减去第一次出现位置的下标给定$m$次询问, 每次询问有三个整数 ...
- codeforces 848c - two TVs
2017-08-22 15:42:44 writer:pprp 参考:http://blog.csdn.net/qq_37497322/article/details/77463376#comment ...
- 【Codeforces Round 431 (Div. 2) A B C D E五个题】
先给出比赛地址啦,感觉这场比赛思维考察非常灵活而美妙. A. Odds and Ends ·述大意: 输入n(n<=100)表示长度为n的序列,接下来输入这个序列.询问是否可以将序列划 ...
- Codeforces Goodbye 2018
Goodbye 2018 可能是我太菜考试的时候出不了$E$ 可能是我太菜考试的时候调不出$F$ 所以转化为手速场之后手速还上不去.jpg A 模拟题意... #include <cstdio& ...
随机推荐
- 冲刺NO.8
Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行,项目的基础部分如基本信息管理,信用信息管理等部分已相对比较完善. 问题困难 技术困难在短期内很难发生质的变化,而本项目由于选择了队员不太熟悉的 ...
- tableView//collectionView加载时的动画
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:( ...
- 项目Beta冲刺Day3
项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...
- 记一次jar包冲突
题记:永远不要在同一个项目中,引用不同版本的两个jar包,否则,这可能就是一个大坑. 在做网校项目的时候,帮助中心要使用lucene,所以就引入了lucene-5.5.1的包,删掉了原先存在于项目中的 ...
- 【基础知识】Flex-弹性布局原来如此简单!!
简言 布局的传统解决方案是基于盒状模型,依赖 display + position + float 方式来实现,灵活性较差.2009年,W3C提出了一种新的方案-Flex,Flex是Flexible ...
- bzoj千题计划220:bzoj3938: Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...
- axios封装
前言 作为出入vue的小萌新,我在写请求的时候,也是毫不犹豫写了ajax,结果肯定是不行的... Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2. ...
- Django rest framework源码分析(4)----版本
版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...
- Python内置函数(40)——dir
英文文档: dir([object]) Without arguments, return the list of names in the current local scope. With an ...
- docker注意事项
当你最后投入容器的怀抱,发现它能解决很多问题,而且还具有众多的优点: 第一:它是不可变的 – 操作系统,库版本,配置,文件夹和应用都是一样的.您可以使用通过相同QA测试的镜像,使产品具有相同的表现 ...