[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. Peach-Printer2.0 Web 打印服务解决方案

    Peach-Printer1.0在沉寂许久后迎来了一个使用客户,非常感谢客户的支持和理解. 通过客户的使用反馈本人尝试对1.0版本进行完善修改,但始终打印效果未能实现预期.思索许久后决心更改打印控件的 ...

  2. kubectl port-forward bind: address already in use unable

    前言 本地的 8080 映射到 Pod 的 80,kubectl 会把这个端口的所有数据都转发给集群内部的 Pod kubectl port-forward wp-pod 8080:80 & ...

  3. vue watch监听路由变化

    vue watch监听路由变化 // 监听 this.$route.path // watch监听非DOM元素的改变 watch:{ '$route.path':function(to,from){ ...

  4. http://eslint.org/docs/rules/semi

    报错: Errors: 88 http://eslint.org/docs/rules/semi 56 http://eslint.org/docs/rules/quotes 34 http://es ...

  5. Git安装与Git GUI的使用

    一.下载安装包 官网:https://git-scm.com/downloads(下载慢) 或 https://pc.qq.com/search.html#!keyword=git,本人使用的是Git ...

  6. matplotlib -- 绘图操作 -- 数据分析三剑客

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...

  7. HoloLens2 开发推荐配置

    博客地址:https://www.cnblogs.com/zylyehuo/ 1.win11 pro+vs2019+unity2018+MRTK2.6.1 2.win10 pro+vs2019+uni ...

  8. MySQL-排序相关原理分析

    全字段排序和rowId排序 建表语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` ...

  9. Redis 过期键删除和内存淘汰策略【Redis 系列之四】

    〇.前言 对于 Redis 服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费. 那么,本文将结合博主收集的资料,简单介绍下过期键删除.内存淘汰两个策略,仅供参考. 博主 Re ...

  10. 代码块--java进阶day03

    1.代码块 1.局部代码块 定义在方法中的一对大括号,可以提早释放内存,走完{}里的逻辑后就会被释放,在之后的编程中无法使用 2.构造代码块 位置在类中,方法外的{},在构造方法执行的时候,构造代码块 ...