随笔分类 - 数据结构
摘要:/*暴力30分*/ #include #include #include #include #define maxn 100010 using namespace std; int n,l=0x7fffffff,r=-0x7fffffff; int s,ans1[maxn*5],ans2[maxn*5],h[maxn]; struct node { int li,ri,hi; }p[ma...
阅读全文
摘要:/* 不要思维定视 盯着线段树维护l r 的ans不放 显然没法区间合并 换一种思路 如果打暴力的话 O(nm) 每次询问 扫一遍之前所有的修改 有交点则说明种数++ 接下来考虑如何优化 我们把每个区间看做(l,r)的坐标内的点 然后查询区间L=l 所以l轴的[r+1,n] +r 轴的[1,l-1] 恰好不重复且覆盖了所有多出来的点 */ #include #include #includ...
阅读全文
摘要:/*先贴个n*n的*/ #include #include #include #define maxn 1000010 using namespace std; int n,k,h[maxn],f[maxn],Q; int main() { scanf("%d",&n); for(int i=1;i=h[j])f[i]=min(f[i],f[j]+1); ...
阅读全文
摘要:/* 开始以为是二分...后来发现丫不单调... */ #include #include #include #define maxn 1000010 using namespace std; int n,l,r,ans,tmin[maxn],tmax[maxn],a[maxn]; int qmin[maxn],qmax[maxn],headmin,tailmin,headmax,tailma...
阅读全文
摘要:/* 裸地单调队列.. 第一次写 写的好丑.... */ #include #include #include #define maxn 1000010 using namespace std; int n,k,x,a[maxn],t[maxn],q[maxn],head=1,tail; int init() { int f=1,x=0;char s=getchar(); wh...
阅读全文
摘要:1.对于一个整数数组,要求资持单点修改,查询区间l r中的max(ai-aj)(l<=j<i<=r)
阅读全文
摘要:/* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串一向很恶心、、 数据括号有问题。。。。 */ #include #include #include #define maxn 255 #define mod 10007 using namespa...
阅读全文
摘要:/* 之前一直不重视链表 (好吧说实话主要是看着板子都是指针就怂了T.T) 这道题比较基础 应用了链表的思想 数组模拟指针 遇到的问题就是跑着跑着光标跳到前面或者跳到后面 我们用next储存每个点下一个点在哪 这样我们不仅能往开头和结尾插入 中间任意一个地方都ok、 这题数据范围题目描述小了 0.0 */ #include #include #include #define maxn 10001...
阅读全文
摘要:#include #include #include #define maxn 30010 using namespace std; int n,m,num; struct node { int l,r,lc,rc,sum,fa;//sum是还有几个没出队的 }t[maxn*2+1000]; void Build(int ll,int rr) { int k=++num; ...
阅读全文
摘要:#include #include #include #define maxn 100010 using namespace std; int n,m,num,a[maxn],tmp[maxn]; char s[100]; struct node { int l,r; int lc,rc; int s[7],bj; }t[maxn*2+100]; int init() {...
阅读全文
摘要:#include #include #include #include #define ll long long using namespace std; ll n,num,ans,hou[10000000],f[10000000],c[10000000],size; struct node { ll l,r,data; }t[10000000]; void Hou(ll p) { ...
阅读全文
摘要:#include #include #include #include #define maxn 100010 using namespace std; int n,m,num; struct node { int lc,rc; int l,r; int sum,bj; }t[maxn*2+100]; void Build(int ll,int rr) { int...
阅读全文
摘要:/* 线段树开到*4 *4 *4 *4 ! 维护 4个值 区间最大值 区间最小值 从左往右跑最大收益 从右往左跑最大收益 */ #include #include #include #define maxn 200010 #define inf 0x7fffffff using namespace std; int n,m,num,a[maxn]; struct node { int ...
阅读全文
摘要:/* 差分序列 b[i]=a[i]-a[i-1] 支持多次区间+ / - 最后输出原序列 区间+ 只需要修改 b[l] b[r+1] */ #include #include #define maxn 200010 using namespace std; int n,a[maxn],b[maxn],m; int init() { int x=0; int f=0; ...
阅读全文
摘要:/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还需不需要处理下去 注意用longlong 还有就是数组开大 */ #include #include #include #include #define LL long long #defin...
阅读全文
摘要:/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans[mid+1][r])mid=(l+r)/2 but 数太大装不下 所以改一个g数组出来就好了 接下来考虑 g[i][j]由谁转移来(不漏下就好 因为是去min 可以重复 同理gcd也可以 其他的...
阅读全文
摘要:/* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否符合条件 如果符合 就入栈 否则的话弹出栈顶元素 接着比较 这样在过程中不断更新最大的ans */ #include #include #include #include #include ...
阅读全文
摘要:#include #include #include #define maxn 100010 #define maxm 200020 #define maxx 10010 using namespace std; int n,m,a[maxn],num; struct node { int lc,rc; int l,r; int sum; }tree[maxm]; vo...
阅读全文

浙公网安备 33010602011771号