【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))$。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 310000
 5 using namespace std;
 6 struct sgt{int lc,rc,sum;}a[M*60]={0}; int rt[M]={0},use=0;
 7 int col[M]={0};
 8 int query(int x,int l,int r,int ll,int rr){
 9     if(!x) return 0;
10     if(l<=ll&&rr<=r) return a[x].sum;
11     int mid=(ll+rr)>>1,sum=0;
12     if(l<=mid) sum=query(a[x].lc,l,r,ll,mid);
13     if(mid<r) sum+=query(a[x].rc,l,r,mid+1,rr);
14     return sum;
15 }
16 int updata(int x,int k,int ll,int rr,int zhi){
17     if(!x) x=++use; a[x].sum+=zhi;
18     int mid=(ll+rr)>>1; if(ll==rr) return x;
19     if(k<=mid) a[x].lc=updata(a[x].lc,k,ll,mid,zhi);
20     else a[x].rc=updata(a[x].rc,k,mid+1,rr,zhi);
21     return x;
22 }
23 int main(){
24     int n,m; scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;i++){
26         int x; scanf("%d",&x); col[i]=x;
27         rt[x]=updata(rt[x],i,1,n,1);
28     }
29     while(m--){
30         int op,l,r,x; scanf("%d",&op);
31         if(op==1){
32             scanf("%d%d%d",&l,&r,&x);
33             printf("%d\n",query(rt[x],l,r,1,n));
34         }else{
35             scanf("%d",&x);
36             rt[col[x]]=updata(rt[col[x]],x,1,n,-1);
37             rt[col[x+1]]=updata(rt[col[x+1]],x+1,1,n,-1);
38             rt[col[x]]=updata(rt[col[x]],x+1,1,n,1);
39             rt[col[x+1]]=updata(rt[col[x+1]],x,1,n,1);
40             swap(col[x],col[x+1]);
41         }
42     }
43 }
时间: 2024-11-03 12:58:52

【mNOIP模拟赛Day 1】 T2 数颜色的相关文章

洛谷mNOIP模拟赛Day1-数颜色

传送门 题目大意: 给定一个序列,维护每个数字在[L,R]出现的次数以及交换a[x]和a[x+1]的操作 一开始想的分桶法,感觉复杂度还可以吧,常数有点大,于是死得很惨(65分) 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 #include<

洛谷mNOIP模拟赛Day1-斐波那契

题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子.我们假定, 在整个过程中兔子不会出现任何意外. 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代.如果某两对兔子是同时出生的,那么小 C 会将父

洛谷mNOIP模拟赛Day2-将军令

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前

【2019.10.25 OI-Killer的模拟赛】3.鸡数

题目链接 题意: 定义“鸡数”指从高位到低位单调不减的数.求$[a,b]$之间有多少个“鸡数”.$t$组询问. $1\le t\le 10^5,\; 1\le a\le b\le 2^{31}-1$ 分析: 数位DP.设$f[i][j]$表示长度为$i$,最高位是$j$的“鸡数”个数,那么$$f[i][j]=\sum\limits^9_{k=j}f[i-1][k]$$ 且$$f[1][i]=1\;(1\le i\le 9)$$ 那么对于一个长度为$l$的$n$且由低到高位写成$s_{1\dots

【洛谷mNOIP模拟赛Day1】T1 斐波那契

题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其父亲必为$x-Fk$($F$为斐波那契数列,且$F_{k}$为不大于$x$的最大数字),举个例子:$7-5=2$,$11-8=3$,对于点$x$和点$y$,我们分别求出其所有直系祖宗,然后扫一遍即可. 由于斐波那契数列为指数级增长,故向上跳的复杂度为一个$log$级别,时间复杂度为$O(m*log(

洛谷mNOIP模拟赛Day1-分组

传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画"敌对关系",如果a和b产生矛盾,就把a和b的镜像(b')连接 ,b和a'连接,然后判断自己是不是和自己的镜像连接了 打上时间戳避免清零卡常 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4

洛谷mNOIP模拟赛Day2-入阵曲

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整个世界都焕然一新.这世界上怎么会有这么多奇妙的东西?曾经自己觉得难以 解决的问题,被一个又一个算法轻松解决. 小 F 当时暗自觉得,与自己的幼稚相比起来,还有好多要学习的呢. 一年过

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

2018/5/24模拟赛总结

shzr带病AK虐爆全场... T1n皇后: 这题没啥好说的... T2有重复元素的排列问题: [问题描述] 设R={ r1, r2 , -, rn}是要进行排列的n个元素.其中元素r1, r2 , -, rn可能相同.试设计一个算法,列出R的所有不同排列. [编程任务] 给定n 以及待排列的n 个元素.计算出这n 个元素的所有不同排列. [输入格式] 由perm.in输入数据.文件的第1 行是元素个数n,1≤n≤500.接下来的1 行是待排列的n个元素. [输出格式] 计算出的n个元素的所有不