Crayon

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

Background

Mary love painting so much, but as we know she can't draw very well. There is no one appreciate her works, so she come up with a puzzle with herself.

Description

There are only one case in each input file, the first line is a integer N (N ≤ 1,000,00) denoted the total operations executed by Mary.

Then following N lines, each line is one of the folling operations.

  • D L R : draw a segment [L, R], 1 ≤ L ≤  R ≤ 1,000,000,000.
  • C I : clear the ith added segment. It’s guaranteed that the every added segment will be cleared only once.
  • Q L R : query the number of segment sharing at least a common point with interval [L, R]. 1 ≤ L ≤ R ≤ 1,000,000,000.

Input

n

Then following n operations ...

Output

For each query, print the result on a single line ...

Sample Input

6
D 1 3
D 2 4
Q 2 3
D 2 4
C 2
Q 2 3

Sample Output

2
2 线段树
 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll long long
typedef struct abcd
{
int l,r,ci,i;
char x;
} abcd;
abcd a[];
typedef struct abc
{
int x,i;
} abc;
abc c[];
int cn=,b[],bn=;
bool cmp(abc x,abc y)
{
return x.x<y.x;
}
bool cmp1(abcd x,abcd y)
{
return x.l<y.l;
}
bool cmp2(abcd x,abcd y)
{
return x.r<y.r;
}
bool cmp3(abcd x,abcd y)
{
return x.i<y.i;
}
typedef struct tree
{
int a,d,sub;
} tree;
tree t[];
void fun(int x)
{
if(t[x].d)
{
t[x<<].d+=t[x].d;
t[x<<].sub+=t[x].d;
t[x<<|].sub+=t[x].d;
t[x<<|].d+=t[x].d;
t[x<<].a+=t[x].d;
t[x<<|].a+=t[x].d;
t[x].d=;
}
}
void update(int x,int y,int b,int c,int tt,int z)
{
if(x<=b&&y>=c)
{
t[tt].sub+=z;
t[tt].d+=z;
t[tt].a+=z;
return ;
}
if(t[tt].d)
fun(tt);
int m=(b+c)>>;
if(x<=m&&y>m)t[tt].sub+=z;
if(x<=m)update(x,y,b,m,tt<<,z);
if(y>m)update(x,y,m+,c,tt<<|,z);
t[tt].a=t[tt<<].a+t[tt<<|].a-t[tt].sub;
}
int query(int x,int y,int b,int c,int tt)
{
if(x<=b&&y>=c)
{
return t[tt].a;
}
if(t[tt].d)
fun(tt);
int m=(b+c)>>;
int r=,sub;
if(x<=m)r=query(x,y,b,m,tt<<);
if(y>m)r=r+query(x,y,m+,c,tt<<|);
t[tt].a=t[tt<<].a+t[tt<<|].a-t[tt].sub;
if(x<=m&&y>m)
return r-t[tt].sub;
else return r;
}
int main()
{
int n,i,j;
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(i=; i<n; i++)
{
getchar();
scanf("%c",&a[i].x);
if(a[i].x=='C')
{
scanf("%d",&a[i].ci);
}
else
{
scanf("%d%d",&a[i].l,&a[i].r);
c[cn++].x=a[i].l,c[cn++].x=a[i].r;
if(a[i].x=='D')
b[bn++]=i;
}
a[i].i=i;
}
int now=;
sort(c,c+cn,cmp);
c[].i=;
for(i=; i<cn; i++)
{
if(c[i].x==c[i-].x)
c[i].i=c[i-].i;
else c[i].i=now++;
} sort(a,a+n,cmp1);
j=;
for(i=; i<n; i++)
{
while(i<n&&a[i].x=='C')i++;
if(i==n)break;
while(a[i].l!=c[j].x)j++;
a[i].l=c[j].i;
}
sort(a,a+n,cmp2);
j=;
for(i=; i<n; i++)
{
while(i<n&&a[i].x=='C')i++;
if(i==n)break;
while(a[i].r!=c[j].x)j++;
a[i].r=c[j].i;
}
sort(a,a+n,cmp3);
/*for(i=0; i<n; i++)
cout<<a[i].x<<" "<<a[i].l<<" "<<a[i].r<<endl;*/
memset(t,,sizeof(t));
for(i=; i<n; i++)
{
if(a[i].x=='D')
{
update(a[i].l,a[i].r,,c[cn-].i,,);
}
else if(a[i].x=='C')
{
update(a[b[a[i].ci]].l,a[b[a[i].ci]].r,,c[cn-].i,,-);
}
else
{
printf("%d\n",query(a[i].l,a[i].r,,c[cn-].i,));
}
}
}

树状数组

 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll long long
typedef struct abcd
{
int l,r,ci,i;
char x;
} abcd;
abcd a[];
typedef struct abc
{
int x,i;
} abc;
abc c[];
int cn=,b[],bn=;
bool cmp(abc x,abc y)
{
return x.x<y.x;
}
bool cmp1(abcd x,abcd y)
{
return x.l<y.l;
}
bool cmp2(abcd x,abcd y)
{
return x.r<y.r;
}
bool cmp3(abcd x,abcd y)
{
return x.i<y.i;
}
int ab[][],m;
int lowbit(int x)
{
return x&(-x);
}
void update(int y,int x,int z)
{
while(x<=m)
{
ab[x][y]+=z;
x+=lowbit(x);
}
}
int query(int y,int x)
{
int sum=;
while(x>)
{
sum+=ab[x][y];
x-=lowbit(x);
}
return sum;
}
int main()
{
int n,i,j;
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(i=; i<n; i++)
{
getchar();
scanf("%c",&a[i].x);
if(a[i].x=='C')
{
scanf("%d",&a[i].ci);
}
else
{
scanf("%d%d",&a[i].l,&a[i].r);
c[cn++].x=a[i].l,c[cn++].x=a[i].r;
if(a[i].x=='D')
b[bn++]=i;
}
a[i].i=i;
}
int now=,sum=;
sort(c,c+cn,cmp);
c[].i=;
for(i=; i<cn; i++)
{
if(c[i].x==c[i-].x)
c[i].i=c[i-].i;
else c[i].i=now++;
} sort(a,a+n,cmp1);
j=;
for(i=; i<n; i++)
{
while(i<n&&a[i].x=='C')i++;
if(i==n)break;
while(a[i].l!=c[j].x)j++;
a[i].l=c[j].i;
}
sort(a,a+n,cmp2);
j=;
for(i=; i<n; i++)
{
while(i<n&&a[i].x=='C')i++;
if(i==n)break;
while(a[i].r!=c[j].x)j++;
a[i].r=c[j].i;
}
sort(a,a+n,cmp3);
/*for(i=0; i<n; i++)
cout<<a[i].x<<" "<<a[i].l<<" "<<a[i].r<<endl;*/
m=c[cn-].i;
for(i=; i<n; i++)
{
if(a[i].x=='D')
{
update(,a[i].l,);
update(,a[i].r,);
sum++;
}
else if(a[i].x=='C')
{
update(,a[b[a[i].ci]].l,-);
update(,a[b[a[i].ci]].r,-);
sum--;
}
else
{
int ans=query(,a[i].r);
ans-=query(,a[i].l-);
printf("%d\n",ans);
}
}
}

Crayon 线段树或者树状数组的更多相关文章

  1. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...

  2. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  3. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  4. HDU 1556 线段树或树状数组,插段求点

    1.HDU 1556  Color the ball   区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...

  5. HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树

    HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...

  6. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  7. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  8. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  9. Turing Tree_线段树&树状数组

    Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems abou ...

随机推荐

  1. python进阶学习(一)

    同样是<python基础教程(第二版)>的内容,只是后面内容学起来,相比前面会比较有趣,也更加实用,所以,将"基础"改为"进阶". python 电 ...

  2. [2014-09-18]Entity Framework 6 预热、启动优化

    好久没写博客了,终于憋出了一个大招,现在总结下. 虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com: ...

  3. js事件汇总

    常用事件: 1.鼠标事件:onClick,onDblClick,onMouseDown,onMouseUp,onMouseOut,onMouseOver ·onClick:单击页面元素时发生,onDb ...

  4. git 介绍及其使用总结

      版本控制 Git                   目录  目录 2 第1章 Shell和vi 4 1.1 什么是shell 4 1.2 shell分类 4 1.3 认识bash这个shell ...

  5. Ibatis XML 配置文件注释引起错误及解决方案

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp35 Ibatis XML 配置文件注释引起错误及解决方案 最近在使用Iba ...

  6. 记一次wiki数据爬取过程

    最近有个爬取各国领导人信息的奇怪需求,要求百度和维基两种版本的数据,最要命的还要保持数据的结构不变.正好印象中隐约记得维基有专门的领导人列表页,不考虑爬取下来的格式不变的话应该很好爬的样子. 首先思路 ...

  7. 【打死树莓派】-树莓派3代jessie+Opencv-解决安装不了libgtk2.0-dev包问题

    按照国际法先贴问题 Some packages could not be installed. This may mean that you have requested an impossible ...

  8. hibernate 事务理解

    简介: Hibernate本身并不具备事务管理能力 .在事务管理层, Hibernate将其委托给底层的JDBC或者JTA ,以实现事务管理和调度功能. Hibernate的默认事务处理机制基于JDB ...

  9. linux下文件和目录

    (1)普通文件(regular file):这是最常用的文件类型,这种文件包含了某种形式的数据,文件内容的解释由处理该文件的应用程序进行. (2)目录文件(directory file):这种文件包含 ...

  10. Error:Failed to load project configuration:xxxxxxxxxxxxxxxxxxxx cannot read file .idea/misc.xml

    你这idea不会没有配置默认jdk吧?你看看File--other settings--default project structure,看看project setting的project里面,有没 ...