http://www.lydsy.com/JudgeOnline/problem.php?id=1074

题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n次(n<=8,右边折向左边),折完后,有m个询问(m<=50),每次询问一个点在最终的图形中穿过了几次纸片。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <sstream>
using namespace std;
typedef long long ll;
#define pb push_back
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
inline int getint() { static int r, k; r=0,k=1; static char c; c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } const double eps=1e-6, PI2=acos(-1)*2;
int dcmp(double x) { return abs(x)<eps?0:(x<0?-1:1); }
struct iP { double x, y; iP(double _x=0, double _y=0):x(_x),y(_y){} void rd() { scanf("%lf%lf", &x, &y); } void D() { printf("x=%.2f, y=%.2f\n", x, y); }};
typedef iP iV;
iV operator-(iP a, iP b) { return iV(a.x-b.x, a.y-b.y); }
iV operator*(iV a, double b) { return iV(a.x*b, a.y*b); }
iV operator+(iP a, iV b) { return iP(a.x+b.x, a.y+b.y); }
bool operator==(iP a, iP b) { return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0; }
bool operator<(const iP &a, const iP &b) { return a.x==b.x?a.y<b.y:a.x<b.x; }
double cross(iV a, iV b) { return a.x*b.y-a.y*b.x; }
double dot(iV a, iV b) { return a.x*b.x+a.y*b.y; }
double Length(iV a) { return sqrt(dot(a, a)); }
double angle(iV a, iV b) { return acos(dot(a, b)/Length(a)/Length(b)); }
iV rot(iV v, double ang) { double cs=cos(ang), sn=sin(ang); return iV(v.x*cs-v.y*sn, v.y*cs+v.x*sn); }
struct iL { iP p; iV v; iL(){} iL(iP _p, iV _v):p(_p),v(_v) {} }; bool onL(iP a, iL l) { return dcmp(cross(a-l.p, l.v))<0; }
bool onR(iP a, iL l) { return dcmp(cross(a-l.p, l.v))>0; }
iP rev(iP a, iL l, int flag=1) { return l.p+rot(a-l.p, angle(a-l.p, l.v)*2*flag); } const int Mx=1<<10;
iP h[Mx];
iL line[10];
int n, m, cnt; void dfs(int dep, iP p) {
//if(dcmp(p.x)<=0 || dcmp(p.x-100)>=0 || dcmp(p.y)<=0 || dcmp(p.y-100)>=0) return;
h[cnt++]=p;
if(dep==0) return;
dfs(dep-1, p);
if(onL(p, line[dep])) dfs(dep-1, rev(p, line[dep], -1));
}
iP find(iP p) {
for1(i, 1, n) if(onR(p, line[i])) p=rev(p, line[i]); else if(!onL(p, line[i])) return iP(-1, -1);
return p;
}
bool check(iP &p) { if(dcmp(p.x)<=0 || dcmp(p.x-100)>=0 || dcmp(p.y)<=0 || dcmp(p.y-100)>=0) return false; return true; }
void work(iP &p) {
//if(dcmp(p.x)<=0 || dcmp(p.x-100)>=0 || dcmp(p.y)<=0 || dcmp(p.y-100)>=0) { puts("0"); return; }
int ans=0;
cnt=0;
dfs(n, p);
sort(h, h+cnt);
cnt=unique(h, h+cnt)-h;
rep(i, cnt) if(check(h[i]) && find(h[i])==p) ++ans;
printf("%d\n", ans);
} int main() {
read(n);
for1(i, 1, n) {
iP p1, p2;
p1.rd(); p2.rd();
line[i]=iL(p1, p2-p1);
}
read(m);
for1(i, 1, m) {
iP p; p.rd();
work(p);
}
return 0;
}

  


这题很神....

看了题解简直惊呆了QAQ逆向思维...

首先我们对于每个点,我们先看看这个点可能由哪些点转移而来(按折纸顺序排序的折纸操作的子集),最多只有$2^8$个这样的点。最后我们再枚举这些点看能否折回原来的点。(注意,如果折的时候正在判定的点在这个直线上,那么这是无解的,因为穿过边界不算。而且永远也不会有正方形的一部分覆盖到这里了)

但是我陷入到了计算几何调试不出来的坑...想个问题似乎想了2h.................................................sb错1:计算向量之间的角我竟让忘记打上acos......调了无数次.... sb错2:输出调试了老半天,浪费大量时间...(难道就不能好好想想吗...

果然状态太差不适合做题

【BZOJ】1074: [SCOI2007]折纸origami的更多相关文章

  1. 1074: [SCOI2007]折纸origami - BZOJ

    Description 桌上有一张边界平行于坐标轴的正方形纸片,左下角的坐标为(0,0),右上角的坐标为(100,100).接下来执行n条折纸命令.每条命令用两个不同点P1(x1,y1)和P2(x2, ...

  2. 1074: [SCOI2007]折纸origami

    Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 372  Solved: 229[Submit][Status][Discuss] Descriptio ...

  3. BZOJ1074 [SCOI2007]折纸origami

    我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. /** ...

  4. 【题解】折纸 origami [SCOI2007] [P4468] [Bzoj1074]

    [题解]折纸 origami [SCOI2007] [P4468] [Bzoj1074] 传送门:折纸 \(\text{origami [SCOI2007] [P4468]}\) \(\text{[B ...

  5. CSS3写折纸

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. 折纸问题java实现

    /** * 折纸问题 这段代码写的太low了 本人水平有限 哎... 全是字符串了 * @param n * @return * @date 2016-10-7 * @author shaobn */ ...

  7. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  8. CSS3实现文字折纸效果

    CSS3实现文字折纸效果 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title></tit ...

  9. bzoj 1067: [SCOI2007]降雨量

    题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...

随机推荐

  1. 如何在linux中用命令产生一个范围内的随机数?

    在shell中有一个环境变量RANDOM,它的范围是0--32767 如果我们想要产生0-25范围内的数,如何做呢?如下: $RANDOM%26 用这个环境变量对26取模,就可以得到最小是0,最大是2 ...

  2. linux 搭建hexo博客

    搭建环境: CentOS 6.5 1.安装git的编译包 yum -y install gcc zlib-devel openssl-devel perl cpio expat-devel gette ...

  3. zookeeper 用法和日常运维

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...

  4. 【消息队列MQ】各类MQ比较

    目录(?)[-] RabbitMQ Redis ZeroMQ ActiveMQ JafkaKafka 目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息 ...

  5. sharepoint bcs (bussiness connectivity services)

    sharepoint bcs  在2010 版本中是提供2010 与外部数据连接的. BCS全名Business Connectivity Services,可以把它看成SharePoint 2007 ...

  6. Expected MultipartHttpServletRequest: is a MultipartResolver configured?

    2015-05-05 19:09:47.510::WARN: /purchase/long-term-contract/uploading.htmjava.lang.IllegalArgumentEx ...

  7. kettle转换JavaScript获取命令行参数

    日常开发中由于很多参数是变化的,需要在部署时才能确定.而写在配置文件里又显得很笨重,因而可以运行时实时指定.那么kettle是怎么获取命令行中的参数的呢? kettle可以通过转换里的JavaScri ...

  8. Java异常与异常处理简单使用

    异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...

  9. LESS学习笔记1

    个人理解:less是一个可以写函数的css

  10. 如何给Eclipse中添加库(jar包)

    折腾Eclipse时,经常会遇到这种情况: 缺少某个库,找到之后,需要将该库,jar包,加入到当前项目,使得代码中的import xxx得以正常导入. 举例: [已解决]Eclipse的java代码出 ...