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]电源插排的更多相关文章
- vijos1859[TJOI2014]电源插排
题意:小 M 的实验室有很多电源插排.这些插排的编号从 1 到 N,由左向右排成一排.每天早晨,这些插排都是没有被使用的.每当一个学生来到实验室,他就将自己的笔记本电源插到某一个未被使用的插排上.实验 ...
- [BZOJ 5155][Tjoi2014]电源插排
传送门 网上大部分题解都写得是动态开点线段树,然而像\(MiEcoku\)这么懒惰的显然不会去写线段树... \(\color{green}{solution}\) 我们考虑来点骚操作. 线段树维护的 ...
- TJOI2014
匹配 给出一个\(n(n\leq80)\)个点对\(n\)个点的带权二分图,求所有最大权匹配的交集. 先求出一个最大权匹配,然后枚举每一条匹配中的边,检验删除该边后是否还能形成最大权匹配.如果能则说明 ...
- bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)
5157: [Tjoi2014]上升子序列 题目:传送门 题解: 学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬) 离散化之后,用一个数组记录一下,直接树状数组做 吐槽:妈耶...一开始不 ...
- [TJOI2014]拼图
嘟嘟嘟 一眼看上去像状压dp,然后越想复杂度越不对劲,最后发现和爆搜差不多,索性就写爆搜了,复杂度\(O(\)能过\()\). 别忘了填拼图和回溯的时候只动拼图中是1的部分,不要把\(n * m\)的 ...
- [TJOI2014]Alice and Bob[拓扑排序+贪心]
题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...
- 【bzoj5157】[Tjoi2014]上升子序列 树状数组
题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献( ...
- [BZOJ 5158][Tjoi2014]Alice and Bob
传送门 \(\color{green}{solution}\) 贪心 /************************************************************** P ...
- 【[TJOI2014]上升子序列】
这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\( ...
随机推荐
- nginx rewrite arg 带问号的地址转发参数处理?Nginx重定向的参数问题
Nginx重定向的参数问题 在给某网站写rewrite重定向规则时,碰到了这个关于重定向的参数处理问题.默认的情况下,Nginx在进行rewrite后都会自动添加上旧地址中的参数部分,而这对于重定向到 ...
- 【Salvation】——人物角色动画实现
写在前面:这个角色动画主要使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现. 一.显示角色并实现镜像效果 1.显示贴图: create→cube→修改名称为player,位置归0 ...
- Linux 指令篇:系统设置--set
功能说明:设置shell. 语 法:set [+-abCdefhHklmnpPtuvx] 补充说明:set指令能设置所使用shell的执行方式,可依照不同的需求来做设置. 参 数: -a 标示已修改 ...
- centos 7 安装五笔输入法
centos 7 安装五笔输入法 [a@endv ~]$ yum search wubi 已加载插件:fastestmirror, langpacks Loading mirror speeds fr ...
- centos 安装 htop
centos-install-htop http://elearning.wsldp.com/pcmagazine/centos-install-htop/
- vue install 注册组件
1.myPlugin.js文件 let MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue. ...
- 性能指标 - OEE
work center 是指 执行制造作业的资源, 可以是 一个人, 一组人, 一台自动机器, 一组自动机器, 一个半自动机器, 一组半自动机器, 或者是 一个区域组成的生产资源 基本参数 Time ...
- 使用jquey的css()方法改变样式,
$("#tip").css("display","none"); $("#tip").css("display ...
- 连续调用scanf的问题总结
对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1.多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scan ...
- 利用DataSet部分功能实现网站登录
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...