线段树,延迟标记。

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

$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 ;
}

ZOJ 3324 Machine的更多相关文章

  1. zoj 3805 Machine

    Machine Time Limit: 2 Seconds      Memory Limit: 65536 KB In a typical assembly line, machines are c ...

  2. ZOJ 1364 Machine Schedule(二分图最大匹配)

    题意 机器调度问题 有两个机器A,B A有n种工作模式0...n-1 B有m种工作模式0...m-1 然后又k个任务要做 每一个任务能够用A机器的模式i或b机器的模式j来完毕 机器開始都处于模式0 每 ...

  3. ZOJ 3805 Machine(二叉树,递归)

    题意:一颗二叉树,求  “  宽度  ” 思路:递归,貌似这个思路是对的,先记下,但是提交时超时, 1.如果当前节点只有左孩子,那么当前宽度等于左孩子宽度 2.如果当前节点只有右孩子,那么当前宽度等于 ...

  4. zoj 3325 Machine(线段树)

    题意:0~n-1的数组,初始值为0:执行m个操作,每次操作执行后输出当前值为0的连续段的段数. 操作1: p i j : i~j区间的每个元素值减1 操作2: r i j :i~j区间的每个元素值加1 ...

  5. ZOJ Monthly, March 2018 题解

    [题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...

  6. ACM数据结构相关资料整理【未完成,待补充】

    在网上总是查不到很系统的练ACM需要学习的数据结构资料,于是参考看过的东西,自己整理了一份. 能力有限,欢迎大家指正补充. 分类主要参考<算法竞赛入门经典训练指南>(刘汝佳),山东大学数据 ...

  7. POJ 1325、ZOJ 1364、HDU 1150 Machine Schedule - from lanshui_Yang

    Problem Description As we all know, machine scheduling is a very classical problem in computer scien ...

  8. ZOJ 3407 Doraemon's Cake Machine [数学]

    题意: 最多有2000组测试样例,每组样例代表n,m; n代表要把蛋糕平分的份数,m代表必须进行多少次操作. 一共有三种操作 1.竖切   经过蛋糕圆心,将蛋糕整个向下切. 2.横切   平行于蛋糕平 ...

  9. zoj 1366 Cash Machine

    01背包加变形 动态规划的时候就犯浑了,每个状态都要记录的,我却只记录了当前状态的!! #include<stdio.h> #include<string.h> int max ...

随机推荐

  1. Vuejs - 单文件组件

    为什么需要单文件组件 在之前的实例中,我们都是通过 Vue.component 或者 components 属性的方式来定义组件,这种方式在很多中小规模的项目中还好,但在复杂的项目中,下面这些缺点就非 ...

  2. Atlantis(POJ1151+线段树+扫描线)

    题目链接:http://poj.org/problem?id=1151 题目: 题意:求所有矩形的面积,重合部分只算一次. 思路:扫描线入门题,推荐几篇学扫描线的博客: 1.http://www.cn ...

  3. HDU 1284 钱币兑换问题 (dp)

    题目链接 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于327 ...

  4. linux下暴力破解工具hydra【转】

    一.简介 Number one of the biggest security holes are passwords, as every password security study shows. ...

  5. Java垃圾收集算法

    算法名称 过程 优缺点 1. 标记-清除算法 (Mark-Sweep) 分为两个阶段: 1.首先标记出所有需要回收的对象: 2.在标记完成后统一回收所有被标记的对象. 缺点: 1.效率问题:标记和清除 ...

  6. Opencv模块功能介绍

    本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/   站在巨 ...

  7. java===java基础学习(11)---继承

    继承可以解决代码复用,让编程更加靠近人的思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法.所有的子类不需要重新定义这些属性和方法,只需要通过ex ...

  8. 【uva10779】收集者的难题

    按照题意建模就行了. #include<bits/stdc++.h> #define naive 0 #define inf 1000000007 using namespace std; ...

  9. swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到

    swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...

  10. iframe自适应高度的方法

    不带边框的iframe因为能和网页无缝的结合从而不刷新新页面的情况下实现更新页面部分的数据成为可能,可是iframe却不像层那样可以收缩自如,iframe高度需要动态的调整需要JS来配合使用,只能通过 ...