AtCoder Beginner Contest 189

AtCoder Beginner Contest 189

E - Rotate and Flip

题解:

  1. ( x , y ) (x, y) (x,y)顺时针旋转90°后变成 ( y , − x ) (y, -x) (y,x)
  2. ( x , y ) (x, y) (x,y)逆时针旋转90°后变成 ( − y , x ) (-y, x) (y,x)
  3. ( x , y ) (x, y) (x,y) x = p x = p x=p对称时变成 ( 2 p − x , y ) (2p - x, y) (2px,y)
  4. ( x , y ) (x, y) (x,y) y = p y = p y=p对称时变成 ( x , 2 p − y ) (x, 2p - y) (x,2py)

有了这个我们只需要在 记录每次旋转的变换参数, 后面直接代入x, y的坐标就能求出答案了。

#include<bits/stdc++.h>

using namespace std;
const int N = 2e5 + 7;

typedef long long ll;

ll n, x[N], y[N], m, q;

ll a[N], b[N], fza[N], fzb[N], visa[N], visb[N];

int main() {
    ios::sync_with_stdio(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x[i] >> y[i];
    }
    cin >> m;
    a[0] = 0, b[0] = 0;
    fza[0] = fzb[0] = 1;
    visa[0] = 1, visb[0] = 2;
    for (int i = 1; i <= m; i++) {
        int op;
        cin >> op;
        if (op == 3) {
            ll p;
            cin >> p;
            a[i] = 2 * p - a[i - 1];
            b[i] = b[i - 1];
            visa[i] = visa[i - 1];
            visb[i] = visb[i - 1];
            fza[i] = -fza[i - 1];
            fzb[i] = fzb[i - 1];
        } else if (op == 4) {
            ll p;
            cin >> p;
            b[i] = 2 * p - b[i - 1];
            fzb[i] = -fzb[i - 1];
            a[i] = a[i - 1];
            visa[i] = visa[i - 1];
            visb[i] = visb[i - 1];
            fza[i] = fza[i - 1];
         } else if (op == 2) {
            if (visa[i - 1] == 1) {
                visa[i] = 2;
                visb[i] = 1;
            } else {
                visa[i] = 1;
                visb[i] = 2;
            }
            a[i] = b[i - 1];
            b[i] = a[i - 1];
            fza[i] = fzb[i - 1];
            fzb[i] = fza[i - 1];
            fza[i] = -fza[i];
            a[i] = -a[i];


        } else {
            if (visa[i - 1] == 1) {
                visa[i] = 2;
                visb[i] = 1;
            } else {
                visa[i] = 1;
                visb[i] = 2;
            }
            a[i] = b[i - 1];
            b[i] = a[i - 1];
            fza[i] = fzb[i - 1];
            fzb[i] = fza[i - 1];
            fzb[i] = -fzb[i];
            b[i] = -b[i];
        }
    }
    int q; cin >> q;
    while (q--) {
        int A, B;
        cin >> A >> B;
        ll ansx = x[B], ansy = y[B];
        if (visa[A] == 1) {
            ansx = ansx * fza[A] + a[A];
            ansy = ansy * fzb[A] + b[A];
            

        } else {
            ll cnt = ansx;
            ansx = ansy * fza[A] + a[A];
            ansy = cnt * fzb[A] + b[A];
            
        }
        cout << ansx << " " << ansy << endl;
    }

}




F - Sugoroku2

题解:

d p [ i ] dp[i] dp[i]为从第 i i i个位置走到大于等于 n n n的期望步数。

那么:

d p [ i ] = d p [ i + 1 ] + d p [ i + 2 ] + d p [ i + 3 ] … … + d p [ i + m ] m + 1 m ∗ m dp[i] = \frac{dp[i + 1] + dp[i + 2] + dp[i + 3] ……+dp[i + m]}{m} + \frac{1}{m} * m dp[i]=mdp[i+1]+dp[i+2]+dp[i+3]+dp[i+m]+m1m

如果第 i i i个位置可以回到原点, 那么:

d p [ i ] = d p [ 0 ] dp[i] = dp[0] dp[i]=dp[0]

有了这个好像无法算出答案, 因为陷入了死循环。

但是, 如果把 d p [ 0 ] dp[0] dp[0]看成一个参数

用公式表示的话:

递推到最后一次的结果一定是:

d p [ 0 ] = a ∗ d p [ 0 ] + b dp[0] = a * dp[0] + b dp[0]=adp[0]+b

一元一次方程, 直接解出来就行了。

代码:

#include<bits/stdc++.h>

using namespace std;

const int N = 2e5 + 7;

int a[N], n, m, k, vis[N];

long double dp[N][2];

int main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= k; i++) {
        cin >> a[i];
        vis[a[i]] = 1;
    }

    double sum = 0, cnt = 0;
    int count = 0;
    for (int i = n - 1; i >= 0; i--) {
        if (vis[i]) {
            dp[i][0] = 1.0;
        } else {
            dp[i][1] = ( sum) / (long double) m + 1;
            dp[i][0] = cnt / (long double) m;
            
        }
        sum = sum + dp[i][1];
        cnt = cnt + dp[i][0];
        sum -= dp[i + m][1];
        cnt -= dp[i + m][0];
       
    }
    if (fabs(dp[0][0] - 1.00) <= 0.000000001) {
        puts("-1");
    } else {
        printf("%.4Lf\n", dp[0][1] / (1 - dp[0][0]));
    }

   

}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值