洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代码 代码: #include<iostream> #include<cstdio> #include<set> #include<algorithm> #include<cstring> #define Set set<Node>::it…
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\)意义下. 设\(a_i\)表示\(i\)号区间长度: 对于上行列车(\(0\rightarrow n\))设\(p_0\)表示出发时刻,\(p_i(i\ge1)\)表示在\(i\)站停靠时间: 对于下行列车(\(0\leftarrow n\))设\(-q_0\)表示到站时刻,\(q_i(i\ge1…
传送门 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…
题意简述 维护字符串,支持以下操作: 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…
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #include<cstdio> #include<set> #define IT set<node>::iterator using std::set; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<&…
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include<set> #include<iostream> #include<cstdio> #define ll long long #define IT set<node>::iterator using std::set; #define getc() (p1==p2&am…
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打……毕竟CCF那机子……) //minamoto #include<iostream> #include<cstdio> #include<set> #include<algorithm> #define IT set<node>::iterator…
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$easy$?维护下区间内01个数然后翻转就打$tag$,除了有点儿麻烦还是挺$easy$的鸭$QwQ$,顺便强调下顺序?就如果区间覆盖就可以直接把翻转删了,区间翻转的时候不用管覆盖,每次下放先覆盖后翻转,$over$ 说下操作五$QwQ$,就再维护几个东西$QwQ$ 就,维护下区间内最长的连续的1的个数,…
题目描述 分析 操作一.二.三为珂朵莉树的基本操作,操作四.五.六稍作转化即可 不会珂朵莉树请移步至这里 求和操作 把每一段区间分别取出,暴力相加 ll qh(ll l,ll r){ it2=Split(r+1),it1=Split(l); ll ans=0; for(it=it1;it!=it2;it++){ ans=(ans+(it->r-it->l+1)*it->val)%mod; } return ans; } 赋值操作 直接调用\(Assign\)函数将其推平即可 void A…