NOIP2012 借教室 Splay初探】的更多相关文章

终于把区间操作的Splay搞明白了…… Splay的大致框架是这样的: [代码中的Zig-Zig和Zig-Zag操作其实是可以优化的,实际只需要3次passDown和3次update] template <class T> struct SplayNode { typedef SplayNode<T> Node; Node* lch; Node* rch; Node* parent; T val; SplayNode(const T& _val,Node* _parent)…
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没…
NC16564 [NOIP2012]借教室 题目 题目描述 ​ 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. ​ 面对海量租借教室的信息,我们自然希望编程解决这个问题. ​ 我们需要处理接下来 \(n\) 天的借教室信息,其中第 \(i\) 天学校有 \(r_i\) 个教室可供租借.共有 \(m\) 份订单,每份订单用三个正整数描述,分别为 \(d_j, s_j, t_j\),表示某租…
描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室.我们假定,租借者对教室的大小.地点没有要求.即对于每…
题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定…
借教室 [题目描述] 在n天中每天有一个可以借出的教室数,有m个订单,每个订单从第l天到第r天要借用x个教室.问能否满足所有的订单,若不能,输出第一个不能满足的订单编号. 思路: 1.1 ≤ n,m ≤ 10^6,区间的整体修改可以用差分数组实现,每次修改的时间复杂度为O(1),查询的时间复杂度为O(n). 2.若从第一个订单到第m个订单向上枚举,每次都利用差分数组算一遍每天的订单数,时间为O(m*n):但从题目中“输出第一个不能满足的订单编号”可以得到启示:二分答案. 时间复杂度就成了O(nl…
题目大意: 有一个n个数的数列,m个操作,第i个操作使[li,ri]区间建di,问第几个操作使数列中出现负数. 思路: 暴力显然过不了,那么就可以优化了,不难想到线段树,显然需要良好的姿势,那么就差分. a[i]表示第i天比第i-1天多了多少房间,于是a的前缀和即为该天的房间数量.而a的维护显然为a[li]+=di,a[ri+1]-=di. 因为求最前的操作,于是我们可以二分答案.但如此常数比较大,又有冗余,可以来个栈一样的东西节省时间. 但是有大神想到了O(n+m)的算法.假设m个指令都可满足…
先二分一个答案x,然后通过差分来看有没有不满足的 #include<bits/stdc++.h> #define pa pair<int,int> #define lowb(x) ((x)&(-(x))) #define REP(i,n0,n) for(i=n0;i<=n;i++) #define PER(i,n0,n) for(i=n;i>=n0;i--) #define MAX(a,b) ((a>b)?a:b) #define MIN(a,b) ((a…
一看就是暴力 好吧,其实是线段树或差分+二分,这里用的是差分+二分的做法. 二分部分的代码,套个二分板子就行 ,right=m; while(left<right)//二分 { ; ; else right=mid; } 差分 bool check(int x)//差分,判断 { memset(f,,sizeof(f)); ;i<=x;i++) { f[l[i]]+=d[i]; f[r[i]+]-=d[i]; } ;i<=n;i++) { g[i]=g[i-]+f[i]; if(a[i]…
题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,INF=1e9+; ],rs[N<<],mn[N<<],laz[N&l…