[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的更多相关文章
- BZOJ 2039: [2009国家集训队]employ人员雇佣
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1369 Solved: 667[Submit ...
- Step by Step 安装 BizTalk Server 2009
原创地址:http://www.cnblogs.com/jfzhu/p/4020444.html 转载请注明出处 演示环境为Windows Server 2008 Enterprise, SQL Se ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ 2463: [中山市选2009]谁能赢呢?
2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1887 Solved: 1390[Submit][Sta ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- SACS +Petrel 2009地震
Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...
- 彻底卸载 RAD Studio 2009/2010/XE
彻底卸载 RAD Studio 2009/2010/XE: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: 1. 删除以下目录(注意有些目录是隐藏的): %ALLUSER ...
- DataSnap 2009 系列之三 (生命周期篇)
DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...
- 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...
- Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>
Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含 ...
随机推荐
- windows下测试TCP/UDP端口连通性
一.简介 最近调试项目的时候有需要测试UDP连接,所以顺便研究了一下. MaQaQ:省流,不介意下载工具的话就直接拉到最后看Advanced Port Scanner. 二.TCP 1.telnet( ...
- 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
比较 HashSet.LinkedHashSet 和 TreeSet 三者的异同HashSet.LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是 ...
- 用正则表达式做爬取--java进阶day06
1.String类中与正则有关的方法 replaceAll方法中要填入两个正则表达式,第一个是我们要修改的字符串,第二个则是我们要改成以后的字符串 如下图,出师表中存在很多数字,我们要删去这些数字,就 ...
- 浅聊java运行机制
Java程序运行机制 首先要清楚运行机制一般有两种 解释型 编译型 解释型: 顾名思义,就像有个人在旁边给你解释东西一样.比如看一本英文书,英语老师在旁边一句一句给你翻译解释.在写源代码时,每写一个 ...
- 【Linux】3.11 包管理工具(RPM和YUM)
包管理工具 1. RPM包 RPM:RedHat Package Manager,红帽软件包管理工具. Linuxd分发版本都有采用(suse,redhat,centos等) 1.1 rpm指令 1. ...
- 【Python】基础操作
指定解释器的运行环境 有时候我们会遇见报错 SyntaxError: Non-ASCII character '\xe4' in file E:/PycharmProjects/LEDdisplay2 ...
- 【Java】Java提取${}占位符并组装对应值
目录 Java提取${}占位符并组装对应值 零.起因 壹.想法 贰.实现 叁.总结 肆.参考文档 Java提取${}占位符并组装对应值 实现了一个${}装配工~ 零.起因 最近写个JavaWeb项目, ...
- java基础之String类、Math类、Arrays类、Collections类
一.String类 概述:程序中所有的双引号字符串,都是String类的对象.(就算没有new,照样算是) 特点: 1.字符串的内容用不可变[重点] 2.因为字符串[String对象]是不可变的,所以 ...
- File类使用详解
File类是java io包下代表与平台无关的文件和目录,也就是说,在程序中操作文件和目录都可以通过File类来完成.但是File不能访问文件内容本身,访问文件内容需要使用输入/输出流. File类的 ...
- 重生之我是操作系统(十)----I/O管理
简介 操作系统的I/O管理(input/output mannagment)是协调,控制计算机与外部设备(如磁盘,键盘,网络接口)等之间数据交换的核心功能.实现可靠高效且统一(隐藏设备差异,如磁盘.串 ...