打完模拟题来庆祝一波:);感觉最近陷入一种“口胡五分钟打题两小时”的巨坑之中……

Description

Input

    第1行:四个用空格隔开的整数Pj Bi,B2,R. P(1≤P≤5)表示石子的个数,Bi(-5×100000≤Bi≤5×100000)和B2(-5×100000≤B2≤5×100000)表示两个河堤的z坐标,R(1≤R≤5×100000)表示你要描述湖面多少秒.没有两个石子会在同一时间砸到同一地点,两个河堤一定有不同的坐标,没有石子会砸到河堤上去.
    第2到P+1行:每行有三个用空格隔开的整数描述了一颗石子,X,K T(-5×100000≤X,K T≤5×100000).X.y表示石子砸的地点的坐标,T表示石子是什么时候砸下去的.

Output

    输出是一个9半9的矩阵,中心在(0,0)点.左下点的坐标为(-4,-4),右上点的坐标为(4,4).这个矩阵表现的是R秒时湖面状态.

题目分析

有用的信息只有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 波纹的更多相关文章

  1. 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 ...

  2. NOIP2018 - 暑期博客整理

    暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. bzoj 1755: [Usaco2005 qua]Bank Interest【模拟】

    原来强行转int可以避免四舍五入啊 #include<iostream> #include<cstdio> using namespace std; int r,y; doub ...

  5. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

  6. Android 自定义view实现水波纹效果

    http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...

  7. canvas水波纹效果

    先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围 ...

  8. canvas实现水波纹效果

    本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...

  9. 手把手教你画一个 逼格满满圆形水波纹loadingview Android

    才没有完结呢o( ̄︶ ̄)n .大家好,这里是番外篇. 拜读了爱哥的博客,又学到不少东西.爱哥曾经说过: 要站在巨人的丁丁上. 那么今天,我们就站在爱哥的丁丁上来学习制作一款自定义view(开个玩笑,爱 ...

随机推荐

  1. IT兄弟连 JavaWeb教程 JSP定义

    JSP页面是指扩展名为.jsp的文件,在一个JSP页面中,可以包括指令标识.HTML代码.JavaScript代码.嵌入的Java代码.注释和JSP动作标识等内容.但这些内容并不是一个JSP页面所必须 ...

  2. 【NOIP2015】 Day2 T2 字串 (多维动归)

    2018-09-12 原题传送门(洛谷)https://www.luogu.org/problemnew/show/P2679 模拟考试的时候完全没有想到 正确的DP方程呢 本来写了一个大致是对的转移 ...

  3. elasticsearch 备份和恢复

    curl   : http://keenwon.com/1393.html During snapshot initialization, information about all previous ...

  4. 可视化-grafana_使用influxDB数据

    1 添加数据源 给数据源取个名字,然后选择数据类型为influxDB. HTTP:8086是influxDB的HTTP查询API,grafana是通过这个接口获取数据. Details:选择从infl ...

  5. hdu 3686 Traffic Real Time Query System 点双两通分量 + LCA。这题有重边!!!

    http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能 ...

  6. HackerRank Super Six Substrings dp

    https://www.hackerrank.com/contests/hourrank-18/challenges/super-six-substrings 能被6整除的数有一个特点,就是能同时被3 ...

  7. Semi-prime H-numbers

    题目描述形如4n+1的数被称为“H数”,乘法在“H数”集合内为封闭的.因数只有1和本身的数叫“H素数”(不包括1),其余叫“H合数”.一个“H合成数”能且只能分解为两个“H素数”.求0·h内的“H合成 ...

  8. Java运算符——通过示例学习Java编程(6)

      作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=17 运算符是表示动作的字符,例如+是表示加法的算 ...

  9. java数据结构和算法06(红黑树)

    这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...

  10. cvCanny的参数

    cvCanny 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvCanny( const CvArr* image, CvArr* edges, double thresho ...