线段树,延迟标记。

记录一下每个节点代表的区间的最小值,以及左右端点是否为最小值,记录区间被下压几次作为延迟标记,再记录一下这个区间中有多少个最小值的连通块。

$n$最大有$1$亿,可以开动态线段树避免离散化。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar();
x = ;
while(!isdigit(c)) c = getchar();
while(isdigit(c))
{
x = x * + c - '';
c = getchar();
}
} struct X
{
int L,R;
int Lson,Rson;
int Min;
bool A,B;
int ans;
int flag;
}s[];
int n,m,sz; int add(int ll,int rr)
{
s[sz].L=ll; s[sz].R=rr;
s[sz].Lson=s[sz].Rson=-;
s[sz].Min=;
s[sz].A=s[sz].B=;
s[sz].ans=;
s[sz].flag=;
sz++;
return sz-;
} void pushDown(int rt)
{
int m=(s[rt].L+s[rt].R)/;
if(s[rt].Lson==-) s[rt].Lson=add(s[rt].L,m);
if(s[rt].Rson==-) s[rt].Rson=add(m+,s[rt].R); if(s[rt].flag==) return; s[s[rt].Lson].flag+=s[rt].flag;
s[s[rt].Lson].Min+=s[rt].flag; s[s[rt].Rson].flag+=s[rt].flag;
s[s[rt].Rson].Min+=s[rt].flag; s[rt].flag=;
} void pushUp(int rt)
{
if(s[s[rt].Lson].Min==s[s[rt].Rson].Min)
{
s[rt].Min=s[s[rt].Lson].Min; s[rt].A=s[s[rt].Lson].A;
s[rt].B=s[s[rt].Rson].B; s[rt].ans=s[s[rt].Lson].ans+s[s[rt].Rson].ans; if(s[s[rt].Lson].B!=&&s[s[rt].Rson].A!=) s[rt].ans--;
} else if(s[s[rt].Lson].Min<s[s[rt].Rson].Min)
{
s[rt].Min=s[s[rt].Lson].Min;
s[rt].A=s[s[rt].Lson].A;
s[rt].B=;
s[rt].ans=s[s[rt].Lson].ans;
} else
{
s[rt].Min=s[s[rt].Rson].Min;
s[rt].B=s[s[rt].Rson].B;
s[rt].A=;
s[rt].ans=s[s[rt].Rson].ans;
}
} void update(int x,int L,int R,int rt)
{
if(L<=s[rt].L&&s[rt].R<=R)
{
s[rt].flag+=x;
s[rt].Min+=x;
return ;
} pushDown(rt); int m=(s[rt].L+s[rt].R)/; if(L<=m) update(x,L,R,s[rt].Lson);
if(R>m) update(x,L,R,s[rt].Rson); pushUp(rt);
} int main()
{
int T; scanf("%d",&T); int cas=;
while(T--)
{
scanf("%d%d",&n,&m);
printf("Case #%d:\n",cas++); sz=; add(,n); for(int i=;i<=m;i++)
{
char op[]; int L,R;
scanf("%s%d%d",op,&L,&R); L++; R++; if(op[]=='p') update(,L,R,);
else update(-,L,R,); if(s[].Min==) printf("%d\n",s[].ans);
else printf("0\n");
}
}
return ;
}

最新文章

  1. Java-Android【1】-控制手机震动
  2. ios开发证书
  3. FC400A与400B的区别
  4. 《CoffeeScript应用开发》学习:第二章 编写第一个CoffeeScript应用程序
  5. MySQL2:四种MySQL存储引擎
  6. JavaScript Patterns 6.2 Expected Outcome When Using Classical Inheritance
  7. android-GridView控件的使用
  8. Exception in thread &quot;http-apr-8080-exec-2&quot;
  9. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法
  10. 变形--矩阵 matrix()
  11. TFS扩展开发中遇到的坑
  12. SignalR的实时高频通讯
  13. python实现图片批量剪裁的程序
  14. 2018年html5入门到精通教程电子书百度云盘下载共22本
  15. How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
  16. 扫描系统进程和获取某进程的PID
  17. XSS笔记
  18. centos6 安装 docker 问题
  19. highstock禁用UTC
  20. 记录一下mariadb设置主从同步的过程[虚拟机测试]

热门文章

  1. 牛客多校第五场-D-inv
  2. hdu 4903 The only survival
  3. [SCOI2009]生日礼物
  4. Doc常用命令
  5. mysql 创建视图
  6. 不使用Tomcat,手写简单的web服务
  7. Moq 和 RhinoMocks
  8. 【Codeforces】868C. Qualification Rounds
  9. 【BZOJ】2190 [SDOI2008]仪仗队
  10. Eureka服务下线(Cancel)源码分析