NOIP 模拟 9 数颜色
题解
一道裸的数据结构题
正解是排序 \(+\) 二分,但是这怎么能有动态开点线段树好写呢?
于是我就打了暴力,骗了五十分。
对于每种颜色,我们在下标上开一颗线段树,对于交换若颜色相同则跳过,否则直接修改两种颜色的线段树。
跟正解一样是 \(\mathcal O(nlogn)\),但常数巨大,慢三倍还多
Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
    inline int read() {
        ri x=0,f=1;char ch=gc();
        while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        return x*f;
    }
}
using IO::read;
namespace nanfeng{
    #define cmax(x,y) ((x)>(y)?(x):(y))
    #define cmin(x,y) ((x)>(y)?(y):(x))
    #define FI FILE *IN
    #define FO FILE *OUT
    static const int N=3e5+7;
    int a[N],n,m;
    struct Seg{
        #define ls(x) T[x].l
        #define rs(x) T[x].r
        #define sum(x) T[x].sum
        struct Segmenttree{int l,r,sum;}T[N<<5];
        int rt[N],tot;
        inline void up(int x) {
            int l=ls(x),r=rs(x);
            sum(x)=sum(l)+sum(r);
        }
        void update(int &x,int l,int r,int p,int w) {
            if (!x) x=p(tot);
            if (l==r) {sum(x)+=w;return;}
            int mid((l+r)>>1);
            if (p<=mid) update(ls(x),l,mid,p,w);
            else update(rs(x),mid+1,r,p,w);
            up(x);
        }
        int query(int x,int l,int r,int lt,int rt) {
            if (!x) return 0;
            if (l<=lt&&rt<=r) return sum(x);
            int mid((lt+rt)>>1),res=0;
            if (l<=mid) res+=query(ls(x),l,r,lt,mid);
            if (r>mid) res+=query(rs(x),l,r,mid+1,rt);
            return res;
        }
    }T;
    inline int main() {
        // FI=freopen("nanfeng.in","r",stdin);
        // FO=freopen("nanfeng.out","w",stdout);
        n=read(),m=read();
        for (ri i(1);i<=n;p(i)) {
            int c=read();a[i]=c;
            T.update(T.rt[c],1,n,i,1);
        }
        for (ri i(1);i<=m;p(i)) {
            int t=read();
            if (t==1) {
                int l=read(),r=read(),c=read();
                printf("%d\n",T.query(T.rt[c],l,r,1,n));
            } else {
                int x=read();
                if (a[x]==a[x+1]) continue;
                T.update(T.rt[a[x]],1,n,x,-1);
                T.update(T.rt[a[x]],1,n,x+1,1);
                T.update(T.rt[a[x+1]],1,n,x+1,-1);
                T.update(T.rt[a[x+1]],1,n,x,1);
                swap(a[x],a[x+1]);
            }
        }
        return 0;
    }
}
int main() {return nanfeng::main();}
NOIP 模拟 9 数颜色的更多相关文章
- noip模拟赛 数颜色
		分析:高级数据结构学傻了.....一眼看上去觉得是莫队,发现带修改,于是分块,由于写的常数很大,只有70分. 正解很简单,记录下颜色为c的每只兔子的位置,每次二分找这个区间有多少只这种颜色的兔子就可以 ... 
- 2018.07.08 NOIP模拟 好数(线段树)
		好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所 ... 
- 8.23考试总结(NOIP模拟46)[数数·数树·鼠树·ckw的树]
		T1 数数 解题思路 大概是一个签到题的感觉...(但是 pyt 并没有签上) 第一题当然可以找规律,但是咱们还是老老实实搞正解吧... 先从小到大拍个序,这样可以保证 \(a_l<a_r\) ... 
- 2018.10.09 NOIP模拟 好数(双向搜索)
		传送门 直接双向搜索出两边可行解,然后把两边的可行解合并起来得出答案就行了. 注意合并的时候可以利用排序和单调性优化时间复杂度. 直接枚举合并是O(siza∗sizb)O(siza*sizb)O(si ... 
- CH Round #58 - OrzCC杯noip模拟赛day2
		A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ... 
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
		[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ... 
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
		2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ... 
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
		164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ... 
- noip模拟9[斐波那契·数颜色·分组](洛谷模拟测试)
		这次考试还是挺好的 毕竟第一题被我给A了,也怪这题太简单,规律一眼就看出来了,但是除了第一题,剩下的我只有30pts,还是菜 第二题不知道为啥我就直接干到树套树了,线段树套上一个权值线段树,然后我发现 ... 
随机推荐
- 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建
			Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ... 
- 「AGC025D」 Choosing Points
			「AGC025D」 Choosing Points 神仙构造题. 首先你会尝试暴力做,先随便选一个点,然后把当前能选得全选上,然后你发现这样样例都过不了. 然后我们可以这样考虑:你把距离为 \(\sq ... 
- L inux系统安全及应用---暴力破解密码
			系统安全及应用一.开关机安全控制① 调整BIOS引导设置② GRUB限制二.终端登录安全控制① 限制root只在安全终端登录② 禁止普通用户登录举例三.系统弱口令检测① Joth the Ripper ... 
- C语言:位运算符总结
			位运算符:1.指对操作数以二进制位( bit)为单位进行的数据处理2.每一个二进制位只存放0或13. 取反:~ 按位反 ~ 0变1 1变0 ~1=0 ~0=14.异或: ^ 相同为0,不相同为1 1 ... 
- C语言:int -32768-32767
			c语言中int的表示范围是-32768~32767!这得从二进制的原码说起:如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767最小为111111111 ... 
- DEV -C++源码中的中文复制粘贴乱码解决方案
			右击源代码用记事本打开,再复制,再粘贴,就没有乱码了 
- [刘阳Java]_第一个Java程序_第7讲
			1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ... 
- Day8 方法详解及递归思想.
			何为方法 Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则: 方法的本意是功能块,就是实 ... 
- OpenFaaS实战之一:部署
			欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- SSM框架,在Html界面利用ajax,json,jQuery实现省市区下拉框联动
			1.先生成省市区表格 2.建立实体类 3.在html画出下拉框 <select id="province"> <option value="" ... 
