原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计出奇迹 操作2:推平区间,珂朵莉树基本操作 操作3:排序区间,我就写了一个桶排 窝一开始头文件直接用bits出玄学ce toupper是把小写转大写,以防数据出锅 #pragma GCC optimize("O3") #include<cstdio> #include<c…
P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确的说是乱七八糟的.现在首要任务就是帮蒟蒻HansBug理理思维.假设HansBug的思维是一长串字符串(字符串中包含且仅包含26个字母),现在的你,有一张神奇的药方,上面依次包含了三种操作: 获取第x到第y个字符中字母k出现了多少次 将第x到第y个字符全部赋值为字母k 将第x到第y个字符按照A-Z的…
P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我吃素(shi)好了 Solution 考前练线段树 字母不多, 开26个线段树即可 操作一直接查询 操作二给定颜色全部涂色, 其他全部去色 操作三先记录此区间有什么颜色, 在分别赋值即可 Code #include<iostream> #include<cstdio> #include…
link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #include<vector> #include<stack> #include<algorithm> #include<set> #include<cctype> #include<cstring> using namespace std ; i…
题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 #include <set> #include <iostream> #define IT std::set<Node>::iterator int n,m,opt,l,r,c[26]; char ch; struct Node { int l,r,v; Node(cons…
传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用ODTODTODT排序操作可以直接上桶排感觉快到飞起. 不会ODTODTODT的点这儿 代码: #include<bits/stdc++.h> #define ri register int #define fi first #define se second using namespace st…
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //minamoto #include<iostream> #include<cstdio> #include<set> #define IT set<node>::iterator using std::set; int read(){ #define num ch-'0…
洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代码 代码: #include<iostream> #include<cstdio> #include<set> #include<algorithm> #include<cstring> #define Set set<Node>::it…
题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大的边少了,字典序一定会更小),并且不能多走边(因为多走的话串会变长,长度大反而亏),因此答案就是最大生成树上的路径. 因此使用LCT维护最大生成树即可.维护两点之间权值最小的边.加边时如果已经连通,则判断加的边与最小的边那个大,如果新加的边大则删掉原来最小的边,加入新边. 至于边长度的处理,可以新建…
题目链接:http://codeforces.com/contest/876/problem/F 题解:一道简单的思维题,知道最多一共有n*(n+1)/2种组合,不用直接找答案直接用总的组合数减去不符合的也行.找不符合的就简单了.找到一个位置i,他的最左边的位置就是a[i]在二进制下是0的最靠近i的位置,所以可以先用pos[j]记录第j位是0的位置.然后最右边的也是同理.这里还处理一下a[l]=a[r]的情况如果这个相同会出现重复考虑所以可以在第一遍找最左边位置的时候做一下处理最左边的位置起码大…