ZOJ 3042 City Selection II 【序】【离散化】【数学】
题意:
输入数据n,m。n代表工厂的数量,m代表城市的数量。
接下来n+m行为工厂和城市的坐标。
规定如图所示方向刮风,工厂的air会污染风向地区的air。
注意,工厂和城市的坐标表示的是从x到x+1从y到y+1之间小正方形都是工厂区域,规定如果只有一个coner的air被污染那么该地区视为无污染。
要求输出有多少不被污染的城市。
坑:
思考了很多问题....
1.加入某城市的正下方是工厂怎么办...这个是否算污染。
2.假如有两个角被污染了怎么办...算污染吗。
坑了一整天.没办法找大神的代码测试了几组样例...【奈何年代久远代码都不好找更不用说题解】
总之测试结果是以上两种都不算污染。
其实坑都是自己挖的,用正常的脑子思考下问题,就不会出问题。
不过话说回来掉坑里不可怕,要保持冷静爬出来...
思路:
1.离散化,已知直线坐标,按照截距离散化。
2.序,从坐到右从上刀下依次处理,遇到工厂更新标记数组,遇到城市检查是否被污染,无污染加入答案序列。
3.如何处理只有两个顶点被污染的问题,这点我借鉴了大牛的思路,每个点不处理右上角的点,不管是工厂还是城市。那么城市不污染的条件是除了右上角的点以外其它三个点不被污染。证明自己画个图想想。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int inf=0x3f3f3f3f;
int tmp;
struct st{
pair<int,int>me;
bool imfac;
};
pair<int,int>city[];
pair<int,int>fac[];
int jilu[];
int mynum[];
bool vis[];
st all[];
pair<int,int>aaa[];
bool cmp(st a,st b){
if(a.me.first!=b.me.first)
return a.me.first<b.me.first;
else if(a.me.second!=b.me.second)return a.me.second>b.me.second;
else return a.imfac>b.imfac;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(vis,,sizeof(vis));
int num=,nnnn=;
for(int i=;i<n;i++){
scanf("%d%d",&fac[i].first,&fac[i].second);
jilu[num++]=*fac[i].first+fac[i].second;
jilu[num++]=*(fac[i].first+)+fac[i].second;
jilu[num++]=*(fac[i].first)+fac[i].second+;
}
for(int i=;i<m;i++){
scanf("%d%d",&city[i].first,&city[i].second);
jilu[num++]=*city[i].first+city[i].second;
jilu[num++]=*city[i].first+city[i].second+;
jilu[num++]=*(city[i].first+)+city[i].second;
}
sort(jilu,jilu+num);
num=unique(jilu,jilu+num)-jilu;
for(int i=;i<n;i++){
all[nnnn++].me=fac[i];
all[nnnn-].imfac=;
}
for(int i=;i<m;i++){
all[nnnn++].me=city[i];
all[nnnn-].imfac=;
}
int id,ansnum=;
sort(all,all+nnnn,cmp);
for(int i=;i<nnnn;i++){
if(all[i].imfac){
id=upper_bound(jilu,jilu+num,*all[i].me.first+all[i].me.second)-jilu;
vis[id]=;
id=upper_bound(jilu,jilu+num,*all[i].me.first+all[i].me.second+)-jilu;
vis[id]=;
id=upper_bound(jilu,jilu+num,*(all[i].me.first+)+all[i].me.second)-jilu;
vis[id]=;
}
else{
int ttt=;
id=upper_bound(jilu,jilu+num,*(all[i].me.first)+all[i].me.second)-jilu;
ttt+=vis[id];
id=upper_bound(jilu,jilu+num,*(all[i].me.first)+all[i].me.second+)-jilu;
ttt+=vis[id];
id=upper_bound(jilu,jilu+num,*(all[i].me.first+)+all[i].me.second)-jilu;
ttt+=vis[id];
if(ttt==){
aaa[ansnum++]=all[i].me;
}
}
}
sort(aaa,aaa+ansnum);
printf("%d\n",ansnum);
for(int i=;i<ansnum;i++){
printf("(%d,%d)\n",aaa[i].first,aaa[i].second);
}
}
}
ZOJ 3042 City Selection II 【序】【离散化】【数学】的更多相关文章
- Selection II
[Selection II] 1.上.下.左.右键可以移动Selection 1个像素.按住Shift键,可以一次移动10个像素. 2.Add Selection模式的快捷键是Shift,Sub Se ...
- HDU 4358 莫队算法+dfs序+离散化
Boring counting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Others)T ...
- zoj 3620 Escape Time II dfs
题目链接: 题目 Escape Time II Time Limit: 20 Sec Memory Limit: 256 MB 问题描述 There is a fire in LTR ' s home ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- ZOJ 3332 Strange Country II
Strange Country II Time Limit: 1 Second Memory Limit: 32768 KB Special Judge You want to v ...
- ZOJ 3956 Course Selection System
题意 有n节课可供选择,每节课都有两个值Hi和Ci,如果学生选择了m节课(x1,x2,....,xm),则它的舒适值被定义为: //这里没有公式((lll¬ω¬)),因为那个图片我保存不下来≧ ﹏ ≦ ...
- zoj 3356 Football Gambling II【枚举+精度问题】
题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3356 http://acm.hust.edu.cn/vjudge/ ...
- ZOJ 2301/HDU 1199 线段树+离散化
给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...
- HDU 4358 Boring counting(莫队+DFS序+离散化)
Boring counting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Others) ...
随机推荐
- ubuntu 安装 boost
1.tar -zxvf boost_1_43_0.tar.gz 2.cd boost_1_43_0, 执行: sudo ./bootstrap.sh sudo ./bjam install 检验安装 ...
- WEB/HTTP 调试利器 Fiddler 的一些技巧分享
1.原理简介: Fiddler 是目前最强大最好用的 Web 调试工具之一,它能记录所有客户端和服务器的http和https请求, 允许你监视,设置 CGI 请求的断点,甚至修改输入输出数据.同类的工 ...
- 用Navicat连接Oracle数据库时报错ORA-28547:connection to server failed,probable Oracle Net admin error
用Navicat连接Oracle数据库时出现如下错误 上网一查原来是oci.dll版本不对.因为Navicat是通过Oracle客户端连接Oracle服务器的,Oracle的客户端分为两种,一种是标准 ...
- VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
vb6中存在几个虚幻的值:Null.Missing.Empty.Nothing.vbNullString.除了最后一个之外,每一个值都不能直接用“a=值”来判断.下面分别解释一下这几个值的含义. 1. ...
- Oracle中in和exists的选择
在ORACLE 11G大行其道的今天,还有很多人受早期版本的影响,记住一些既定的规则, 1.子查询结果集小,用IN 2.外表小,子查询表大,用EXISTS 摘自:http://blog.chi ...
- python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
- Flash AS 响应双击事件MouseEvent.DOUBLE_CLICK
没想到在WinForm简简单单的一个问题,在AS里会成为一个坑. 我遇到的这个问题是由于Loader没有设置doubleClickEnabled=true而导致的. 因此出现这个问题,请思考是否由于此 ...
- 在Visual Studio 2010/2012中 找不到创建WebService的项目模板
参考文章: http://blog.sina.com.cn/s/blog_6d545999010152wb.html 在 Visual Studio 2010 或者2012的新建 Web 应用程序或者 ...
- Builder模式(建造者模式)
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- [Android NDK/JNI-1A]-开发环境搭建
NDK简介 NDK能干什么:NDK使得在android中,java可以调用C 函数库. 1.Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意 ...