P3968 [TJOI2014]电源插排

线段树维护最长空区间及左端点位置,这个和$nlongn$的动态最大子序和差不多,就不多解释了

$n$较大哈希优化空间

My complete code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
typedef long long LL;
const LL maxn=3000000;
const LL hs=299987;
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
struct node{
LL son[2],lx,rx,mx,mxi,col;
}tree[maxn];
LL n,q,nod=1,root=1;
LL que[300000][2];
inline LL Get(LL x){
LL u=x%hs+1;
while(que[u][0]&&que[u][0]!=x)
u=(u+1)%n;
return u;
}
inline void Update(node &now,node son0,node son1,LL l,LL r,LL mid){
if(!son0.col)
son0.lx=son0.rx=son0.mx=(mid-l+1);
if(!son1.col)
son1.lx=son1.rx=son1.mx=(r-mid);
if(son0.mx>son1.mx)
now.mx=son0.mx,now.mxi=son0.mxi;
else
now.mx=son1.mx,now.mxi=son1.mxi;
if(son0.rx+son1.lx>now.mx||(son0.rx+son1.lx==now.mx&&mid-son0.rx+1>now.mxi))
now.mx=son0.rx+son1.lx,
now.mxi=mid-son0.rx+1;
now.lx=son0.lx,now.rx=son1.rx;
if(!son0.col)
now.lx+=son1.lx;
if(!son1.col)
now.rx+=son0.rx;
now.col=son0.col+son1.col;
}
void Change(LL &now,LL l,LL r,LL x,LL c){
if(!now)
now=++nod;
if(l==r){
tree[now].col=c;
tree[now].lx=tree[now].rx=tree[now].mx=!c;
if(!c)
tree[now].mxi=l;
return;
}
LL mid=(l+r)>>1;
x<=mid?Change(tree[now].son[0],l,mid,x,c):Change(tree[now].son[1],mid+1,r,x,c);
Update(tree[now],tree[tree[now].son[0]],tree[tree[now].son[1]],l,r,mid);
}
LL Query(LL now,LL l,LL r,LL lt,LL rt){
if(!now)
return 0;
if(lt<=l&&rt>=r)
return tree[now].col;
LL mid=(l+r)>>1;
LL sum=0;
if(lt<=mid)
sum+=Query(tree[now].son[0],l,mid,lt,rt);
if(rt>mid)
sum+=Query(tree[now].son[1],mid+1,r,lt,rt);
return sum;
}
int main(){
n=Read(),q=Read();
tree[root].mx=n,
tree[root].mxi=1;
while(q--){
LL op=Read();
if(!op){
LL l=Read(),r=Read();
printf("%lld\n",Query(root,1,n,l,r));
}else{
LL x=Get(op);
if(que[x][1]){
Change(root,1,n,que[x][1],0);
que[x][1]=0;
}else{
que[x][0]=op;
LL now=(tree[1].mxi*2+tree[1].mx)>>1;
Change(root,1,n,now,1);
que[x][1]=now;
}
}
}
return 0;
}

  

P3968 [TJOI2014]电源插排的更多相关文章

  1. vijos1859[TJOI2014]电源插排

    题意:小 M 的实验室有很多电源插排.这些插排的编号从 1 到 N,由左向右排成一排.每天早晨,这些插排都是没有被使用的.每当一个学生来到实验室,他就将自己的笔记本电源插到某一个未被使用的插排上.实验 ...

  2. [BZOJ 5155][Tjoi2014]电源插排

    传送门 网上大部分题解都写得是动态开点线段树,然而像\(MiEcoku\)这么懒惰的显然不会去写线段树... \(\color{green}{solution}\) 我们考虑来点骚操作. 线段树维护的 ...

  3. TJOI2014

    匹配 给出一个\(n(n\leq80)\)个点对\(n\)个点的带权二分图,求所有最大权匹配的交集. 先求出一个最大权匹配,然后枚举每一条匹配中的边,检验删除该边后是否还能形成最大权匹配.如果能则说明 ...

  4. bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)

    5157: [Tjoi2014]上升子序列 题目:传送门 题解: 学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬) 离散化之后,用一个数组记录一下,直接树状数组做 吐槽:妈耶...一开始不 ...

  5. [TJOI2014]拼图

    嘟嘟嘟 一眼看上去像状压dp,然后越想复杂度越不对劲,最后发现和爆搜差不多,索性就写爆搜了,复杂度\(O(\)能过\()\). 别忘了填拼图和回溯的时候只动拼图中是1的部分,不要把\(n * m\)的 ...

  6. [TJOI2014]Alice and Bob[拓扑排序+贪心]

    题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...

  7. 【bzoj5157】[Tjoi2014]上升子序列 树状数组

    题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献( ...

  8. [BZOJ 5158][Tjoi2014]Alice and Bob

    传送门 \(\color{green}{solution}\) 贪心 /************************************************************** P ...

  9. 【[TJOI2014]上升子序列】

    这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\( ...

随机推荐

  1. 有关javaScript面向对象和原型笔记

    javaScript是一种比較特殊的语言,ECMAScript中没有类的概念.跟其它面向对象的语言有一定的差别.它的对象也与基于类的语言中的对象有所不同,严格来说,javascript对象是一组没有特 ...

  2. 【前端GUI】—— 网站美工必须掌握的PS知识点&思维导图

    前言:前端离不开与设计的沟通,有时候还需要自己上手改动甚至设计网页,所以这里简单梳理一下近期学习的“网站美工”相关知识及练习.(工作用不上的时候,自己玩儿着也蛮有意思的,哈哈(*゚∀゚*)~) 一.P ...

  3. Linux下的定时任务Crontab

    通过crontab -e写入定时任务的指令,一行为一项任务. 任务模式是时间克龙表达式+命令形式. 如: 2 0,6,12,18 * * * perl /root/restarttomcat.pl p ...

  4. BZOJ 4128 Matrix BSGS+矩阵求逆

    题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...

  5. 聚合数据Android SDK 12306火车票查询订票演示示例

    1.聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据. 2.下载聚合数据SDK,将开发包里的juhe_sdk_ ...

  6. POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15574   Accepted: 671 ...

  7. UDP通信注意事项

    今天调试UDP,笔记本上面可以实现但台式机上面竟然无法通信,后来找了半天,原来是权限问题.必须将用户权限设置为最低才行. 在运行里面输入UAC (user access control )用户权限设置 ...

  8. DML过程中记录错误日志

    当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火.10g R2之后有个新功能.将插入过程中失败的记录插入到还有一张表中. SQL> drop table test purge; ...

  9. 高阶函数:sorted

    排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的 ...

  10. Linux系统rootpassword改动

    重新启动系统. 进入系统引导界面: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzMzOTg1MQ==/font/5a6L5L2T/fontsi ...