传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();} while(isdigit(ch))an…
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小\(Q\)发现统计一张报表实际上是维护一个非负整数数列,并且进行一些查询操作. 在最开始的时候,有一个长度为N的整数序列,并且有以下三种操作: \(INSERT\) \(i\) \(k\):在原数列的第i个元素后面添加一个新元素\(k\):如果原数列的第\(i\)个元素已经添加了若干元素,则…
题目链接 主要思路 /* 对于询问1,用堆代替multiset/Splay 对于询问2,multiset 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一个位置,而不是这个元素!这个值会全部都删掉 */ #include<set> #include<cstdio> #include<cctype> #include<algorithm> const int N=5e5+5,M=N*3,INF=1e9; int n,q,st[N],ed[N]…
题目链接 主要思路 /* 其实只需要multiset即可 对于询问1,删除.插入差值,输出最小元素 对于询问2,插入后用前驱后继更新 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一个位置,而不是这个元素!这个值会全部都删掉 不开O2慢成狗 开了也不是很快 */ #include<set> #include<cstdio> #include<cctype> #include<algorithm> const int N=5e5+5,M=N*…
BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以我们只需维护每一段的开头和末尾两个数,这样更新相邻差值时只需考虑插入数与原末尾和下一段的开头两个数的差值就好. 而维护这个差值,只开一个\(\mathtt{multiset}\)就好(其中是所有相邻差值).当插入一个数时,先将原本的末尾和后一段开头的差值从\(\mathtt{multiset}\)里…
题目链接 附纯SplayTLE代码及主要思路: /* 可以看做序列有n段,Insert是每次在每一段最后插入一个元素 只有插入,没有删除,所以插入一个元素对于询问1影响的只有该元素与前边一个元素(同段).下一段的开头元素 故只需删掉该段最后元素与下一段开头元素的差,再加入新元素与下一段开头的差即可 -> 记录差值 对于询问2,将值在平衡树中插入,能有影响的就是相邻两个值了(最小值只可能从中产生) -> 记录值 所以对于每一段只需记录开头与结尾元素,剩下的就是插入删除了 询问2中相邻两个值是前驱…
沿用了学长的$multiset$ 然后这道题可以看到我的程序中有两行注释,它在我看来和他们下面的代码没区别,但是我们发现,C++会先调用后面的参数,所以$--it$会被先执行 ... ... ... 维护两个数组,$a[]$和$b[]$表示每一段开头的元素和结尾的元素. 在更新相邻差值的时候,只用考虑新插入的值和原结尾的差以及和下一段开头的差就好了. 维护两个$multiset<int>ele,del$ 表示全部元素和表示全部差值 . 插入新元素的时候,我们把他在$ele$中找到前驱后继分别作…
传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans&l…
传送门 上升看成完全背包. 下降看成01背包. 注意边界转移就行了. 代码: #include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return an…
传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示当前在第iii个位置,已经匹配到了第jjj个位置,已经使用了kkk段,当前这个字符没用用/用了. 然后分情况简单转移一下就行了. 注意可以滚动数组优化空间. 代码: #include<bits/stdc++.h> using namespace std; const int mod=1e9+7,N…