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 ...
随机推荐
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结
本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用 ...
- BeautifulSoup练习第一节
一.pip install beautilfulsoup4 二.主要使用html.parser这个python标准库 三.打印首页博客的时间.打印摘要 # coding:utf-8from bs4 i ...
- echarts柱状图修改背景线为网格线、去掉刻度标签、鼠标悬停在柱条上时变色、柱条圆角弧度、
option = { color: ['red'],//修改柱条颜色 tooltip : { triggerOn:'mousemove' }, grid: { left: '3%', right: ' ...
- 深入剖析ConcurrentHashMap 一
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt201 ConcurrentHashMap是Java5中新增加的一个线程安全的 ...
- jvm系列 (五) ---类加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- JavaScript学习日志(六):事件
这篇随笔,深恶痛绝,敲到快结束的时候,凌晨00:19,突然闪退,也不知道是Mac的原因还是chrome的原因,重新打开的时候,以为自动保存有效果,心想没关系,结果他么的只保存了四分之一,WTF?!!! ...
- hibernate 事务理解
简介: Hibernate本身并不具备事务管理能力 .在事务管理层, Hibernate将其委托给底层的JDBC或者JTA ,以实现事务管理和调度功能. Hibernate的默认事务处理机制基于JDB ...
- tkinter第四章 输入框,校对
#最简单的输入框 import tkinter as tk root = tk.Tk() e = tk.Entry(root)#输入框的类 e.pack() e.delete(0,tk.END)#把输 ...
- Js函数初学者练习(一)switch-case结构实现计算器。
前 言 JRedu 给大家介绍一点JS函数的练习题希望初学者多做一些练习能够更好的掌握JS的函数,以及能够提升大家的逻辑思维.(我也是个渣渣希望路过的大神多提建议或意见) 希望能够对大家有所帮助 ...