【模拟】bzoj1686: [Usaco2005 Open]Waves 波纹
打完模拟题来庆祝一波:);感觉最近陷入一种“口胡五分钟打题两小时”的巨坑之中……
Description
Input
Output
题目分析
有用的信息只有9x9的这一部分,所以我们来对于每一颗石子分别处理。
如果只是手算前两三个石头,看上去好像状态是指数阶的感觉很吓人,但实际上显然状态是与$n$同阶的(为什么我第一眼没看出来呢……)。
可以发现每一个水波到中心的曼哈顿距离相同,那么枚举水波就变得很容易了,我们来考虑如何计算反射。
注意到反射时$y$坐标是不会改变的,那只需要考虑起点和终点的$x$坐标。
有如下三种情况:
1.大坝包含了两点,所以传递没有受到任何影响。
2.大坝包住了起点,那么比较麻烦,需要考虑多次反射。
3.大坝包住了终点,那么只用考虑一次反射。
应该是有更优的写法的,不过分类讨论更稳(?)一些吧。
之后嘛,注意不要打挂就好了。
- #include<bits/stdc++.h>
- struct node
- {
- int a[][];
- int *const operator[](int x)
- {
- return a[x+];
- }
- node() {}
- }f;
- int stones,lRes,rRes,times;
- int s;
- int read()
- {
- char ch = getchar();
- int num = ;
- bool fl = ;
- for (; !isdigit(ch); ch = getchar())
- if (ch=='-') fl = ;
- for (; isdigit(ch); ch = getchar())
- num = (num<<)+(num<<)+ch-;
- if (fl) num = -num;
- return num;
- }
- inline bool limit(int x, int y){return x>=-&&x<=&&y>=-&&y<=;}
- inline bool illegal(int x)
- {
- if (x<-) return (x<lRes&&lRes<=-)||(x<rRes&&rRes<=-);
- if (x>) return (x>lRes&&lRes>=)||(x>rRes&&rRes>=);
- return ;
- }
- void add(int x, int y, int c)
- {
- register int bar,cnt;
- if (y < -||y > ) return;
- if (s < x){
- if ((s<=lRes&&lRes<=x)||(s<=rRes&&rRes<=x)){
- if (s <= lRes){
- bar = lRes, x = *bar-x-;
- }else{
- cnt = ;
- while (x <= lRes||x >= rRes)
- {
- if (cnt) bar = rRes;
- else bar = lRes;
- x = *bar-x, cnt = -cnt;
- if (cnt) x++;
- else x--;
- }
- }
- }
- }
- if (s > x){
- if ((x<=lRes&&lRes<=s)||(x<=rRes&&rRes<=s)){
- if (s >= rRes){
- bar = rRes, x = *bar-x+;
- }else{
- cnt = ;
- while (x <= lRes||x >= rRes)
- {
- if (cnt) bar = lRes;
- else bar = rRes;
- x = *bar-x, cnt = -cnt;
- if (cnt) x--;
- else x++;
- }
- }
- }
- }
- if (limit(x, y)) f[x][y] += c;
- }
- void deal(int x, int y, int t)
- {
- if (t==){
- if (limit(x, y)) f[x][y]++;
- return;
- }
- s = x;
- for (int delta=; delta<=t; delta++)
- {
- add(x+delta, y+t-delta, ), add(x+delta, y-t+delta, );
- add(x-delta, y+t-delta, ), add(x-delta, y-t+delta, );
- }
- add(x, y+t, -), add(x, y-t, -);
- add(x+t, y, -), add(x-t, y, -);
- t -= ;
- if (t==){
- if (limit(x, y)) f[x][y]--;
- return;
- }else if (t < ) return;
- for (int delta=; delta<=t; delta++)
- {
- add(x+delta, y+t-delta, -), add(x+delta, y-t+delta, -);
- add(x-delta, y+t-delta, -), add(x-delta, y-t+delta, -);
- }
- add(x, y+t, ), add(x, y-t, );
- add(x+t, y, ), add(x-t, y, );
- }
- int main()
- {
- stones = read(), lRes = read(), rRes = read(), times = read();
- if (lRes > rRes) std::swap(lRes, rRes);
- for (int i=; i<=stones; i++)
- {
- int x = read(), y = read(), t = read();
- if (t > times||illegal(x)) continue;
- deal(x, y, times-t);
- }
- for (int j=; j>=-; j--)
- {
- for (int i=-; i<=; i++)
- {
- if (i==lRes||i==rRes) putchar('X');
- else if (f[i][j] < ) putchar('o');
- else if (f[i][j] > ) putchar('*');
- else putchar('-');
- }
- putchar('\n');
- }
- return ;
- }
后记
逛了一圈发现我的代码又长又慢???
END
【模拟】bzoj1686: [Usaco2005 Open]Waves 波纹的更多相关文章
- poj 2434;bzoj 1686 [Usaco2005 Open]Waves 波纹
Description Input 第1行:四个用空格隔开的整数Pj Bi,B2,R. P(1≤P≤5)表示石子的个数,Bi(-5×100000≤Bi≤5×100000)和B2(-5×1000 ...
- NOIP2018 - 暑期博客整理
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj 1755: [Usaco2005 qua]Bank Interest【模拟】
原来强行转int可以避免四舍五入啊 #include<iostream> #include<cstdio> using namespace std; int r,y; doub ...
- 自定义view实现水波纹效果
水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...
- Android 自定义view实现水波纹效果
http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...
- canvas水波纹效果
先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围 ...
- canvas实现水波纹效果
本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...
- 手把手教你画一个 逼格满满圆形水波纹loadingview Android
才没有完结呢o( ̄︶ ̄)n .大家好,这里是番外篇. 拜读了爱哥的博客,又学到不少东西.爱哥曾经说过: 要站在巨人的丁丁上. 那么今天,我们就站在爱哥的丁丁上来学习制作一款自定义view(开个玩笑,爱 ...
随机推荐
- 在maven中引入本地jar包的方法
一.第一种方式: 1.电脑安装maven 2.下载jar.例如 gj.jar 3.把jar随便放一个位置 4.在jar包目录下打开cmd输入: mvn install:install-file -Df ...
- sql索引的作用
转https://www.cnblogs.com/hyd1213126/p/5828937.html (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提 ...
- windows下写的shell脚本到linux上不能运行
win上是dos模式,需要改成unix模式 方法是: 在linux上vim 打开脚本,然后:set ff=unix
- [coci2015-2016 coii] Palinilap【字符串 哈希】
传送门:http://www.hsin.hr/coci/archive/2015_2016/ 进去之后点底下的那个.顺带说一句,题目既不是一个英文单词,也不是克罗地亚单词,估计只是从回文串的英文单词p ...
- FFT与NTT的模板
网上相关博客不少,这里给自己留个带点注释的模板,以后要是忘了作提醒用. 以洛谷3803多项式乘法裸题为例. FFT: #include <cstdio> #include <cmat ...
- 寻找最美的你(select)
Time Limit:2000ms Memory Limit:128MB 题目描述 这个问题是这样的,如果一个区间[L,R]存在一个数ai,使得这个数是这个区间所有数的约数,那么[L,R]这段区间 ...
- 解析Javascript事件冒泡机制(转)
本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然 ...
- [转]AngularJS移动开发中的坑汇总
使用AngualrJs开发移动App已经快半年了,逐渐积累了很多AngularJS的问题,特别是对于用惯了Jquery的开发者,转到AngularJS还是需要克服很多问题的.不像Jquery那样侧重D ...
- 【转】HashMap 和 HashTable 到底哪不同 ?
2017/05/29 | 分类: 基础技术 | 2 条评论 | 标签: HASHMAP, HASHTABLE 分享到: 原文出处: 程序员赵鑫 HashMap和HashTable有什么不同?在面试和被 ...
- MessageQueue消息队列的开启
前言: MessageQueue消息队列形似一个保存消息的容器,发送方(例如服务程序)收集处理信息存储在队列中,接收方通过一定的协议取得队列中自己需要的信息,可以实现不同系统之间的通信: 但值得注意的 ...