【mNOIP模拟赛Day 1】 T2 数颜色
题目传送门:https://www.luogu.org/problemnew/show/P3939
题外话:写完这题后本地跑了下极限数据,用时1.5s,于是马上用fread+fwrite优化至0.3s,交至OJ,跑了600+ms,好奇地去掉fread和fwrite,居然只跑了700+ms(总感觉哪里不太对劲)。
此题有一个性质:对于一个点i,其有且只有一只兔子,且该兔子的颜色是唯一的。考虑到数据范围较小(兔子数量和颜色数量均$\leq 3*10^{5}$),我们可以对所有颜色开一棵线段树,维护该区间内有多少只兔子的颜色符合该线段树要求。更新答案时,先将两只兔子分别从两棵线段树中删去,然后再插回线段树中。由于线段树数量较多,若使用非动态开点线段树,其空间复杂度为$O(n \times max(c_{i}))$,显然MLE。故必须采用动态开点线段树,空间复杂度降低至$O((n+m)\times log(n))$。该做法时间复杂度为$O((n+m)\times log(n))$。
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 310000
using namespace std;
struct sgt{int lc,rc,sum;}a[M*]={}; int rt[M]={},use=;
int col[M]={};
int query(int x,int l,int r,int ll,int rr){
if(!x) return ;
if(l<=ll&&rr<=r) return a[x].sum;
int mid=(ll+rr)>>,sum=;
if(l<=mid) sum=query(a[x].lc,l,r,ll,mid);
if(mid<r) sum+=query(a[x].rc,l,r,mid+,rr);
return sum;
}
int updata(int x,int k,int ll,int rr,int zhi){
if(!x) x=++use; a[x].sum+=zhi;
int mid=(ll+rr)>>; if(ll==rr) return x;
if(k<=mid) a[x].lc=updata(a[x].lc,k,ll,mid,zhi);
else a[x].rc=updata(a[x].rc,k,mid+,rr,zhi);
return x;
}
int main(){
int n,m; scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int x; scanf("%d",&x); col[i]=x;
rt[x]=updata(rt[x],i,,n,);
}
while(m--){
int op,l,r,x; scanf("%d",&op);
if(op==){
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",query(rt[x],l,r,,n));
}else{
scanf("%d",&x);
rt[col[x]]=updata(rt[col[x]],x,,n,-);
rt[col[x+]]=updata(rt[col[x+]],x+,,n,-);
rt[col[x]]=updata(rt[col[x]],x+,,n,);
rt[col[x+]]=updata(rt[col[x+]],x,,n,);
swap(col[x],col[x+]);
}
}
}
【mNOIP模拟赛Day 1】 T2 数颜色的更多相关文章
- 洛谷mNOIP模拟赛Day1-数颜色
传送门 题目大意: 给定一个序列,维护每个数字在[L,R]出现的次数以及交换a[x]和a[x+1]的操作 一开始想的分桶法,感觉复杂度还可以吧,常数有点大,于是死得很惨(65分) #include&l ...
- 洛谷mNOIP模拟赛Day1-斐波那契
题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...
- 洛谷mNOIP模拟赛Day2-将军令
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...
- 模拟赛DAY 2 T2不老梦
[题目背景] 于万人中万幸得以相逢,刹那间澈净明通. 成为我所向披靡的勇气和惶恐,裂山海,堕苍穹. 爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中. 韶华宛转吟诵,苍凉的光荣,急景凋年深情难共. ——银临 ...
- 洛谷mNOIP模拟赛Day2-星空
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. ...
- 洛谷mNOIP模拟赛Day1-分组
传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画" ...
- 洛谷mNOIP模拟赛Day2-入阵曲
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...
- 【洛谷mNOIP模拟赛Day1】T1 斐波那契
题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...
- NOIP模拟赛(by hzwer) T2 小奇的序列
[题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...
随机推荐
- scrapy官方安装方法
安装依赖 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libss ...
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- RESTful架构概念
本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...
- spss-非参数检验-K多个独立样本检验( Kruskal-Wallis检验)案例解析
今天和大家一起探讨和分下一下SPSS-非参数检验--K个独立样本检验 ( Kruskal-Wallis检验). 还是以SPSS教程为例: 假设:HO: 不同地区的儿童,身高分布是相同的 H1: 不 ...
- Winfrom 嵌入word、excel实现源码
效果图: winform中嵌入word的方法有多种:调用API,使用webBroser或使用DSOFRAMER控件: API过于繁琐: webbroser读取小文件还行,大文件就太痛苦了: 所以还是选 ...
- hdu 5007
http://acm.hdu.edu.cn/showproblem.php?pid=5007 字符串处理 暴力 #include <cstdio> #include <cstdlib ...
- linux系统编程之进程(七):system()函数使用
一,system()理解 功能:system()函数调用"/bin/sh -c command"执行特定的命令,阻塞当前进程直到command命令执行完毕 原型: int syst ...
- 设计模式总结(《Head First设计模式》学习总结)
写在前面: 学习过程中不仅要熟练掌握技能,理论的消化吸收也必不可少.虽然个人更倾向于学习技术类的东西(短时间的精力投入很快就能看到成效...),但看了很多前辈的经验总结后才知道理论性的东西是绝对不能忽 ...
- CS中窗体的基类(BaseForm)注意点
窗体基类最好新建一个窗体(BaseForm) 1.这样能够保证在VS中保证他的派生窗口也能够可视化. 2.如果基类直接是一个cs类文件,对于处理派生窗口就很复杂,比如按钮权限之类的操作; 如果直接继承 ...
- C#——调用C++的DLL 数据类型转换
/C++中的DLL函数原型为 //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...