[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 包含 ...
随机推荐
- 文件上传fuzz工具-Upload_Auto_Fuzz
一.工具介绍 在日常遇到文件上传时,如果一个个去测,会消耗很多时间,如果利用工具去跑的话就会节省很多时间,本Burp Suite插件专为文件上传漏洞检测设计,提供自动化Fuzz测试,共300+条p ...
- golang 逃逸分析详解
疑问 请问main调用GetUserInfo后返回的&User{...}.这个变量是分配到栈上了呢,还是分配到堆上了? package main type User struct { ID i ...
- Go语言遍历字符串——获取每一个字符串元素
遍历字符串有下面两种写法. 遍历每一个ASCII字符 遍历 ASCII 字符使用 for 的数值循环进行遍历,直接取每个字符串的下标获取 ASCII 字符,如下面的例子所示. theme := &qu ...
- 如何在 Github 上获得 1000 star?
作为程序员,Github 是第一个绕不开的网站.我们每天都在上面享受着开源带来的便利,我相信很多同学也想自己做一个开源项目,从而获得大家的关注.然而,理想很丰满,现实却是开发了很久的项目仍然无人问津. ...
- 【python-日期和时间处理】datetime模块基本使用
1. 获取datetime对象 获取当前datetime对象 方法:datetime.now(cls, tz=None) -> datetime 参数说明: tz:时区信息,不传该参数时,默认使 ...
- 【SpringCloud】SpringCloud Stream消息驱动
SpringCloud Stream消息驱动 消息驱动概述 是什么 什么是SpringCloudStream 官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架. 应用程序通 ...
- 跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
非常详细,傻瓜式依葫芦画瓢即可. 特别提示:订阅机器上的防火墙以及发布机器远程登录订阅机的问题 通过非命令行方式配置同步订阅 (1)实验环境说明 (2)实验前准备 (3)订阅设置 (4)测试同步订阅 ...
- Windows 左ctrl和左alt键互换
reg代码 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyb ...
- MySQL 查询树结构、循环查询、查看函数、视图、存储过程
MySQL经常会用到查询树结构数据,这里专门收集整了一篇. 构建函数 构建树查询函数:查询父级节点函数 -- 在mysql中完成节点下的所有节点或节点上的所有父节点的查询 -- 根据传入id查询所有父 ...
- MySQL 在设计表(建表)时需要注意什么?
MySQL 在设计表(建表)时需要注意的要点 设计数据库表是 MySQL 开发中非常重要的一环.合理的表结构设计可以提升性能.减少存储开销,并提高维护性.以下是一些关键的注意事项: 1. 明确需求和数 ...