Crayon 线段树或者树状数组
Crayon
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 线段树或者树状数组的更多相关文章
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- HDU 1556 线段树或树状数组,插段求点
1.HDU 1556 Color the ball 区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...
- HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树
HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树
题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...
- Turing Tree_线段树&树状数组
Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems abou ...
随机推荐
- wireshark 随笔
在进行通信开发的过程中,我们往往会把本机既作为客户端又作为服务器端来调试代码,使得本机自己和自己通信.但是wireshark此时是无法抓取到数据包的,需要通过简单的设置才可以. 具体方法如下: ①:以 ...
- 慕课网视频破解付费分享-前端开发-Python等
微信小程序 慕课网 BAT大牛经验总结全面深入解读Android面试 前端JS基础面试技巧 vue2.0+node.js+mongodb全栈打造商城 Vue.js高级实战-开发移动端音 ...
- chrome开发工具指南(二)
Application 面板 使用 App Manifest 窗格检查您的网络应用清单和触发 Add to Homescreen 事件. 使用 Service Worker 窗格执行与服务工作线程相关 ...
- java常见加密方式介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt260 本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法. ...
- Cassandra HBase和MongoDb性能比较
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp68这是一篇基于亚马逊云平台上对三个主流的NoSQL数据库性能比较,在读写 ...
- vue-cli搭建多页面项目如何配置
这里使用的是webpack模板. 首先安装vue-cli,执行命令 npm install vue-cli -g: 安装完成后初始化一个项目模板:vue init webpack myproject; ...
- spring cloud认识
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状 ...
- Ubuntu16.04下安装texlive
Ubuntu 16.04下安装texlive的步骤如下: 1.下载texlive 打开终端输入:sudo apt-get install texlive-full #下载这一过程会持续10-20分钟 ...
- 算法学习:Pac-Man的简单对抗
Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台.其主体利用python完成.该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用. http://ai.ber ...
- Sqlite数据库添加数据以及查询数据方法
只是两个添加查询方法而已,怕时间长不用忘了