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. uiaotumator ui測试 高速调试

    1. uiaotumator ui測试 Demo.java package uiautomatorDemo1; import java.io.File; import android.graphics ...

  2. Java内存区域与模拟内存区域异常

    我把Java的内存区域画了一张思维导图,以及各区域的主要功能. 模拟Java堆溢出 Java堆用于存储对象实例.仅仅要不断地创建对象而且保证GC ROOTS到对象之间有可达路径避免被回收机制清除.就能 ...

  3. Performing User-Managed Database-18.7、Performing Complete User-Managed Media Recovery

    18.7.Performing Complete User-Managed Media Recovery 完毕一致性备份,把数据库恢复到当前的scn是最好的结果.能够恢复整个数据库.恢复单个表空间.或 ...

  4. Spring boot Security Disable security

    When I use security.basic.enabled=false to disable security on a Spring Boot project that has the fo ...

  5. F - 概率(经典问题)

    Description Sometimes some mathematical results are hard to believe. One of the common problems is t ...

  6. 【Python】删除字符串的空白

    在程序中,额外的空白可能让人迷惑,对于程序员来说,'python'跟'python '看起来几乎一样,但是对于程序来说,可是千差万别 (lstrip)删除开头空白 >>> Langu ...

  7. 搭建局域网maven仓库

    第一步: 下载Nexus http://nexus.sonatype.org/downloads/下载最新版本 解压缩到任意目录,我的直接解压到了E盘---------->E:\nexus-2. ...

  8. DataTable行处理

    DataTable dt=new DataTable(); 新增行: DataRow addDR= mydatatable.NewRow();addDR["ID"] = " ...

  9. LeetCode Hash Table 3. Longest Substring Without Repeating Characters

    HashMap的应用可以提高查找的速度,键key,值value的使用拜托了传统数组的遍历查找方式,对于判断一个字符或者字符串是否已经存在的问题可以非常好的解决.而本题需要解决的问题就是判断新遍历到的字 ...

  10. Qt中的对象类型转换

    char * 与 const char *的转换 char *ch1="hello11"; const char *ch2="hello22"; ch2 = c ...