[CRCI2008-2009] CVJETICI

观察图片及样例一:

注:下文中的被占领,指的是在这一个区间内,才有交叉开花的可能。

第一张小图发现 $2 \sim 3$ 被占领。
第二张小图发现 $4 \sim 6$ 被占领,并伸入 $2 \sim 3$ 内,开花。第三张小图发现 $2 \sim 5$ 被占领,并伸入 $4 \sim 6$ 内,开花,其中 $2$ 被占领了两次,可能会开两次花,$6$ 已经开花,将来不在开花。第四张小图发现 $3 \sim 5$ 被占领,并伸入被两次占领的地方内,开两次花。

丑图献上:

这里有个问题,我们怎么判断每个点被占领了几次?,其实很简单,我们可以用线段树来处理一个区间内每个点都被占领了一次,相当于每个点加一。然后单点查询,判断被占领了几次。由于看过花的地方不能在开花,我们要减去之前有过的数量,也很简单,用数组存贮之前这个点上开过多少花就行了。

树状数组思路相同,记得用上差分。并在起点处加一,终点减一,用前缀和代表这一段的数量。

线段树:

#include<bits/stdc++.h>
using namespace std;
#define p2 (p<<1) //左右儿子
#define p3 (p<<1|1)
const int M=100005;
int n,tr[M<<2],had[M];//had是标记数组
void upd(int l,int r,int x,int y,int p){
if(l==x&&r==y){
tr[p]++;
return;
}
int mid=(l+r)/2;
tr[p2]+=tr[p];
tr[p3]+=tr[p];
tr[p]=0;
if(y<=mid) upd(l,mid,x,y,p2);
else if(x>=mid+1) upd(mid+1,r,x,y,p3);
else upd(l,mid,x,mid,p2),upd(mid+1,r,mid+1,y,p3);
}
int query(int l,int r,int x,int p){
if(l==r) return tr[p];
int mid=(l+r)/2,ret=0;
tr[p2]+=tr[p];
tr[p3]+=tr[p];
tr[p]=0;
if(x<=mid) ret=query(l,mid,x,p2);
else ret=query(mid+1,r,x,p3);
return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
int r1=query(1,100000,a,1);
int r2=query(1,100000,b,1);//进行查询
//查询完后,可能可以开花的数量数r1+r2,当时两朵花不能在一点,所以减去开过的花,也就是had
printf("%d\n",r1-had[a]+r2-had[b]);
//更新a点上目前有的数量r1
had[a]=r1;
had[b]=r2;
//a+1到b-1这个区间,去增加一
//为了防止没有区间,如a=1,b=2的情况要判断一下
if(a+1<=b-1) upd(1,100000,a+1,b-1,1);
}
return 0;
}

树状数组:

#include<bits/stdc++.h>
using namespace std;
const int M=100005;
int n,C[M+5],had[M+5];
void add(int x,int y){//在x的地方加上y
for(int i=x;i<=M;i+=i&-i) C[i]+=y;
}
int sum(int x){
int ret=0;
for(int i=x;i;i-=i&-i) ret+=C[i];
return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
int r1=sum(a);
int r2=sum(b);//进行查询
//查询完后,可能可以开花的数量数r1+r2,当时两朵花不能在一点,所以减去开过的花,也就是had
printf("%d\n",r1-had[a]+r2-had[b]);
//更新a点上目前有的数量r1
had[a]=r1;
had[b]=r2;
//a+1位置上加1,b-1位置上-1
//为了防止没有区间,如a=1,b=2的情况要判断一下
if(a+1<=b-1) add(a+1,1),add(b,-1);
}
return 0;
}

官方代码(思路差不多的,他将其分成了 $256$ 块)

#include <cstdio>

int N;
int A[100001];
int B[1000]; int main( void ) {
scanf( "%d", &N );
for( int i = 0; i < N; ++i ) {
int L, R;
scanf( "%d%d", &L, &R ); printf( "%d\n", A[L]+B[L>>8] + A[R]+B[R>>8] ); A[L] = -B[L>>8];
A[R] = -B[R>>8]; int x = L+1;
for( ; x < R && (x&0xFF); ++x ) ++A[x];
for( ; x+256 <= R; x += 256 ) ++B[x>>8];
for( ; x < R; ++x ) ++A[x];
} return 0;
}

[CRCI2008-2009] CVJETICI的更多相关文章

  1. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  2. Step by Step 安装 BizTalk Server 2009

    原创地址:http://www.cnblogs.com/jfzhu/p/4020444.html 转载请注明出处 演示环境为Windows Server 2008 Enterprise, SQL Se ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  4. BZOJ 2463: [中山市选2009]谁能赢呢?

    2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1887  Solved: 1390[Submit][Sta ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  6. SACS +Petrel 2009地震

    Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...

  7. 彻底卸载 RAD Studio 2009/2010/XE

    彻底卸载 RAD Studio 2009/2010/XE: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: 1. 删除以下目录(注意有些目录是隐藏的): %ALLUSER ...

  8. DataSnap 2009 系列之三 (生命周期篇)

    DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...

  9. 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  10. Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>

    Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含 ...

随机推荐

  1. 在 Go 中恰到好处的内存对齐

    问题 type Part1 struct { a bool b int32 c int8 d int64 e byte } 在开始之前,希望你计算一下 Part1 共占用的大小是多少呢? func m ...

  2. Draw.io:你可能不知道的「白嫖级」图表绘制神器

    介绍 draw.io 是一个在 GitHub 上开源且拥有近十年发展历史的成熟项目,它是一款用于绘制 UML 图表的工具. 如果你曾经为流程图的绘制而流泪,又或是在夜里和UML大战到失眠, 不妨试试它 ...

  3. 如何不购买域名在云服务器上搭建HTTPS服务

    step 1: 事前准备 step 1.1: 云服务器 购买一台云服务器(带有弹性公网IP),阿里云,腾讯云,华为云什么的都可以. 选择ubuntu系统 开放安全组策略(把你需要的协议/端口暴露出来) ...

  4. 继承中构造方法访问特点--java 进阶day01

    1.子类不可以继承父类的构造方法 构造方法的名称必须与类名一致,上图中类名是Zi,而构造方法名是Fu,肯定不行 2.子类在初始化之前,需要对父类初始化 子类在初始化的过程中,很有可能会调用到父类的数据 ...

  5. 学习unigui【23】uniDBGrid的使用摘要

    Unidbgrid自动调整列宽 UniDBGrid1 -> ClientEvents -> ExtEvents [Ext.data.Store[store] ] add store.loa ...

  6. P5490 【模板】扫描线 & 矩形面积并 做题笔记

    扫描线是一种很常用的 trick,用来计算矩形并周长.并面积.核心思路是使用标记永久化 + 线段树,直接引用朴素的做法,即从某一维度开始扫描并将经过的面积加和. 错误 upd 函数中的汇总不正确,要想 ...

  7. SpringBoot接口 - 统一异常处理

    为什么要统一异常处理 如果不统一处理异常,程序开发时就需要在controller层写大量重复的Valid代码, 比如下面这个样子: @Slf4j @RestController public clas ...

  8. Python3爬虫入门(一)

    Python3爬虫入门 ​网络爬虫,也叫网络蜘蛛(Web?Spider).它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接. 在浏览器的地址栏输入URL地址, ...

  9. C# 使用StackExchange.Redis实现分布式锁的两种方式

    分布式锁在集群的架构中发挥着重要的作用.以下有主要的使用场景 1.在秒杀.抢购等高并发场景下,多个用户同时下单同一商品,可能导致库存超卖. 2.支付.转账等金融操作需保证同一账户的资金变动是串行执行的 ...

  10. 深度解析Maven版本仲裁机制:核心规则与原理

    结论先行 Maven的版本仲裁机制本质是通过 依赖路径 和 声明顺序 的优先级规则,自动解决多版本依赖冲突.其核心规则为: 最短路径优先:依赖树中路径最短的版本生效. 相同路径则先声明优先:路径长度相 ...