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 ...
随机推荐
- BackgroundWorker类中主要属性、方法和事件
属性: 1.CancellationPending 获取一个值,指示应用程序是否已请求取消后台操作.通过在DoWork事件中判断CancellationPending属性可以认 ...
- POI处理Excel中的日期数据类型
在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...
- window的设置属性
1.windowAnimationStyle 用于设置一组window动画的引用style资源,window的动画属性由R.styleable.WindowAnimation定义. Winow动画类属 ...
- ASP.NET静态化方法
直接通过访问页面获取html代码实现静态化 突然想到一个静态化页面的方法:直接保存源代码即可. 模拟浏览器访问,获得源码,写入文件.不知道是否存在安全风险:各位大神请指点: 注意 1.资源使用绝对路径 ...
- cat、tail、head、tee、grep、wc、sort文件操作和过滤
详见;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103 文件操作和过滤 绝大多数命令行工作是针对文件的.我们会在本节中讨论如何 ...
- Git简易参考手册
如果用过mercury(HG),那么理解Git的运作方式就轻松多了.两者是相同的分布式版本管理工具,只是某些功能有着细微的差别 - Git的管理粒度更加细腻,因此操作上也比HG复杂一点.例如,修改文件 ...
- ps图层面板上的【透明度】与【填充】的区别
为文字添加投影,分别调图层面板上的[透明度]与[填充]的值你就知道区别了. 如上图降低填充的数值,结果只对文字颜色有影响却对投影毫无影响. 而如上图,调整不透明度的时候对文字颜色与投影均产生效果. 这 ...
- Java中equals和==之间的区别
今天在写表达式求值的时候,发现了equals和==||!=和!equals()之间是不一样的. 我就从网上搜了搜关于这方面的知识,然后在下面做一个总结: Java中有两类数据类型: 基本数据类型(Pr ...
- 团队作业4----第一次项目冲刺(Alpha版本)4.24
a.提供当天站立式会议照片 会议内容: ①:对数据库的设计存在问题的进一步讨论 ②:讨论需求分析中的存在的难解决的问题,比如要做到较好的反应用户的行为. ③:分配今天的任务 b. 每个人的工作 工作完 ...
- class中的东西和继承、多态的概念
class中的private.public.protected 最近看了一些视频顺便总结一下class中的这几个类型以及继承 public: 在C++和C#中类的用法,语法是差不多的.当变量,函数之类 ...