Tsinsen 1485 Catch The Penguins 抓企鹅 ——Bitset
【题目分析】
刚开始想的是KD-Tree去暴力求解。
写了半天还没有暴力得的分数多(说好的nlogn呢)
直接按照四个维度排序。
然后扫一遍,用bitset去维护,然后对于四个维度小于一个询问的结果取一个交就可以了。
Bitset大法好。
【代码】
垃圾KD-Tree
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> #include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue> using namespace std; #define maxn 500005
#define mlog 16
#define F(i,j,k) for (int i=j;i<=k;++i)
#define inf (1e18) void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
} struct node{double d[4],mn[4],mx[4];int siz,l,r;}t[maxn],now;
int n,q,D,rt,tot=0,m;
bool operator < (node x,node y){return x.d[D]<y.d[D];} void update(int k)
{
F(i,0,3)
{
t[k].mx[i]=max(max(t[k].d[i],t[t[k].l].mx[i]),t[t[k].r].mx[i]);
t[k].mn[i]=min(min(t[k].d[i],t[t[k].l].mn[i]),t[t[k].r].mn[i]);
}
t[k].siz=t[t[k].l].siz+t[t[k].r].siz+1;
} int build(int l,int r,int dir)
{
int mid=(l+r)/2;
D=dir;
nth_element(t+l,t+mid,t+r+1);
t[mid].siz=1;
F(i,0,3) t[mid].mx[i]=t[mid].mn[i]=t[mid].d[i];
t[mid].l=mid>l?build(l,mid-1,(dir+1)%4):0;
t[mid].r=mid<r?build(mid+1,r,(dir+1)%4):0;
update(mid);
return mid;
} bool in(int o)
{
int flag=1;
F(i,0,3)
{
{
if (t[o].mx[i]>=0&&t[o].mx[i]<=now.d[i]);
else flag=0;
}
{
if (t[o].mn[i]>=0&&t[o].mn[i]<=now.d[i]);
else flag=0;
}
}
return flag;
} void print(int o){
if (!o) return;
printf("%d t[o].mn[0]=%f t[o].mn[1]=%f t[o].mx[0]=%f t[o].mx[1]=%f l :%d r: %d\n",o,t[o].mn[0],t[o].mn[1],t[o].mx[0],t[o].mx[1],t[o].l,t[o].r);
print(t[o].l);
print(t[o].r);
} bool din(int o)
{
int flag=1;
F(i,0,3)
{
if (t[o].d[i]>=0&&t[o].d[i]<=now.d[i]);
else flag=0;
}
return flag;
} bool out(int o)
{
int flag=1;
F(i,0,3)
{
if ((t[o].mx[i]>now.d[i]&&t[o].mn[i]>now.d[i])||(t[o].mx[i]<0&&t[o].mn[i]<0));
else flag=0;
}
return flag;
} int query(int o)
{
if (!o) return 0;
if (in(o)){return t[o].siz;}
else
{
int ret=0;
if (din(o)) ret+=1;
if (t[o].l)
{
if (out(t[o].l)); else ret+=query(t[o].l);
}
if (t[o].r)
{
if (out(t[o].r)); else ret+=query(t[o].r);
}
return ret;
}
} int main()
{
Finout();
F(i,0,3) t[0].mx[i]=inf,t[0].mn[i]=-inf;
scanf("%d",&m);n=1;
F(i,1,m)
{
int flag=1;
F(j,0,3)
{
scanf("%lf",&t[n].d[j]);
if (t[n].d[j]<0) flag=0;
}
if (flag) n++;
}
n--;
rt=build(1,n,1);
scanf("%d",&q);
F(i,1,q)
{
int flag=1;
F(j,0,3)
{
scanf("%lf",&now.d[j]);
if (now.d[j]<0) flag=0;
}
if (flag) printf("%d\n",query(rt));
else printf("0\n");
}
}
有趣的Bitset
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <bitset>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 30010
#define F(i,j,k) for (int i=j;i<=k;++i)
int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
bitset<maxn> b[maxn],now;
struct node{double d[4];int id;}a[maxn],q[maxn];
int n,m,D;
bool cmp(node x,node y){return x.d[D]<y.d[D];}
int main()
{
scanf("%d",&n);
F(i,1,n)
{
scanf("%lf%lf%lf%lf",&a[i].d[0],&a[i].d[1],&a[i].d[2],&a[i].d[3]);
a[i].id=i;
}
scanf("%d",&m);
F(i,1,m)
{
scanf("%lf%lf%lf%lf",&q[i].d[0],&q[i].d[1],&q[i].d[2],&q[i].d[3]);
q[i].id=i;
b[i].set();
}
F(i,0,3)
{
D=i;
sort(a+1,a+n+1,cmp);
sort(q+1,q+m+1,cmp);
now.reset();
int p=1;
F(j,1,m)
{
while (p<=n&&a[p].d[i]<=q[j].d[i]) now[a[p].id]=1,p++;
b[q[j].id]&=now;
}
}
F(i,1,m) printf("%d\n",b[i].count());
}
Tsinsen 1485 Catch The Penguins 抓企鹅 ——Bitset的更多相关文章
- 清澄 A1485. Catch The Penguins 抓企鹅
试题来源 2013中国国家集训队论文答辩 问题描述 Xyz带着他的教徒们乘着科考船一路破冰来到了南极大陆,发现这里有许许多多的企鹅.邪恶的Xyz想要抓很多企鹅回去开动物园,当宠物玩.但动物保护协会很快 ...
- B - Catch That Cow (抓牛)
B - Catch That Cow Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- 用正则表达式抓取网页中的ul 和 li标签中最终的值!
获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1& ...
- C# 中异常抛出捕获机制--throw / try,catch,finally
try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...
- java之try catch finally
try{ }catch(Exception e){ }finally{ } java异常处理在编程中很常见,将可能抛出异常的语句放在try{}中,若有异常抛出,则try{}中抛出异常语句之后的语句不再 ...
- UE4 Android打包 问题 记录笔记
问题一:error: expression result unused [-Werror,-Wunused-value] 虽然看了输出日志知道了这行沉余代码删掉就行,但是不是很懂这个地方报错意义. 问 ...
- 原来还有这样的记词方法_Java版记不规则动词_博主推荐
昨天在看一本英语书的不规则动词的时候,突然产生的灵感:就是想把这样记单词简单方式,用程序代码实现,然后,使用户可以与之进行交互 这样,在用户背不规则动词的时候就会轻松把它给记住.基于这一点,于是我就思 ...
- Jdbc 事务
package com.j1; import java.sql.Connection; import java.sql.SQLException; import com.mysql.jdbc.Prep ...
- Javaweb 第15天 web练习和分页技术
第15天 web练习和分页技术 复习day14内容: 学习新技术的思路? 分析功能的思路? 使用queryRunner操作数据库的步骤? ResultSetHandler接口常用实现类(三个重点)? ...
随机推荐
- DVWA之跨站请求伪造(CSRF)
CSRF全称是Cross site request forgery ,翻译过来就是跨站请求伪造. CSRF是指利用受害者尚未失效的身份认证信息(cookie,会话信息),诱骗其点击恶意链接或者访问包含 ...
- url post 请求方法
最近的项目是给手机app 提供方法. 因此 此方法可以进行接口测试 static class HttpClient { static CookieContainer cookies = new Coo ...
- C#语言基础 Main 函数中变量 整型
在我们每次上网或者用电脑的时候,请输入你的xxx 或者你的名字(年龄/身高/学校/籍贯)是 在这里我们就要学到一些变量,就是不确定的东西 string a: //赋予变量 a ="内容& ...
- 洛谷 P1464 Function
题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...
- Codeforces Round #316 (Div. 2) D Tree Requests
官方题解是离线询问,dfs树形转线性,然后二分找区间. 还有一种比较好的做法是直接dfs,将当前访问这个结点u相关的询问之前的状态存起来,然后访问完以后利用异或开关性,得到这颗子树上的答案. 代码是学 ...
- IOS7.1 企业应用 证书无效 已解决
http://www.cocoachina.com/bbs/read.php?tid=194213&keyword=7.1 关于IOS7.1企业版发布后,用户通过SARAFI浏览器安装无效的解 ...
- Linux之Nginx服务 nfs文件存储 负载均衡
一.搭建Nginx服务 Nginx 是俄罗斯人编写的十分轻量级的HTTP 服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个I ...
- Linux命令权限 用户权限 组权限 文件、目录权限
Linux命令的格式是: 命令+选项+参数 命令是必须存在的,选项和参数可以不必存在,不写的情况是有默认的参数 Linux 一切皆文件 对于文件而言,只需要对文件进行读写就可以实现对文件内容内容的增删 ...
- PAT (Advanced Level) Practise - 1099. Build A Binary Search Tree (30)
http://www.patest.cn/contests/pat-a-practise/1099 A Binary Search Tree (BST) is recursively defined ...
- mysql 导入数据库
1:创建数据库 dos 进入 xxx\MySQL5.7\bin 目录(很多人喜欢把这个路径配置在环境变量path中,这样在dos敲命令时,就直接是mysql......) mysql -uroot - ...