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. Rxjava2视频笔记

    观察者模式 观察者模式是一对多的模式,多个观察者同时监听一个主题,当主题更新时,会同时通知所有的观察者 subject –>observer 学习新技术的步骤 1.官方文档的查阅和学习 2.Go ...

  2. [2017-07-18]ELK安装笔记

    ELK ElasticSearch LogStash Kibana Server:CentOS 7 采用RPM导入官方源方式进行安装 rpm --import https://artifacts.el ...

  3. jQuery实现鼠标滑过导航栏呈现不同的样式

    素材图片 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  4. Docker 集群环境实现的新方式

    近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...

  5. 7_SQL Server通过代码删除数据

    --通过代码方式删除数据select *from Employee --第一种删除方式,数据没了,表还在,id接着删除前的id继续加1delete from Employee where EmpId ...

  6. 花生壳DDNS为何不支持LetsEncrypt申请

    Inspired by Let's Encrypt Community , thx to sahsanu, jsha, and orzorc. 开端 Lets Encrypt 是一款免费的网站 SSL ...

  7. Linux-chmod命令(4)

     chmod:(change mode)改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限. 格式 : [-cfvR][[+-=][rwxX]...][,...] 参数 1:  -c ...

  8. Spring Cloud官方文档中文版-客户端负载均衡:Ribbon

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...

  9. SNS团队Beta阶段第五次站立会议(2017.5.26)

    1.立会照片 2.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 生词本功能测试,bug修复 发音图标的改进 龚晓婷 辅助完善历史纪录的功能 对于历史记录功能的测试 林仕庄 继续完善 ...

  10. 【Alpha】——Fifth Scrum Meeting

    一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 李永豪 测试统计功能 对统计出现的问题进一步完善 郑靖涛 着手编写报表设计 继续报表设计 杨海亮 协助编写统计功能 ...