zoukankan      html  css  js  c++  java
  • [2020 去世模拟赛 2] 一道防AK好题

    题目

    题目描述

    \(\sf{Lemon}\) 认为在第一届『\(\rm Citric\)』杯模拟赛中出的题目太简单了,于是他决定,这次要给参赛选手们一个下马威!^_^

    \(\sf{Lemon}\) 手上有一个长度为 \(n\) 的数列 \(x\)。他现在想知道,对于给定的 \(a,b,c\),他要找到一个 \(i\),使得 \(a\cdot (i+1)\cdot x_i^2+(b+1)\cdot i\cdot x_i+(c+i)=0\) 成立。
    如果有多个 \(i\) 满足,\(\sf{Lemon}\) 想要最小的那个 \(i\)
    \(\sf{Lemon}\) 有很多很多组询问需要你回答,多到他自己也不确定有多少组。所以在输入数据中 \(a=b=c=0\) 标志着 \(\sf{Lemon}\) 的提问的结束。

    更加糟糕的是,\(\sf{Lemon}\) 为了加大难度,决定对数据进行加密以防止离线算法的出现。
    假设你在输入文件中读到的三个数为 \(a_0,b_0,c_0\),那么 \(\sf{Lemon}\) 真正要询问的 \(a=a_0+lst,b=b_0+lst,c=c_0+lst\)\(lst\) 的值是你对 \(\sf{Lemon}\) 的前一个询问的回答。如果这是第一个询问,那么 \(lst=0\)
    所有的询问都将会按上述方式进行加密,包括标志着询问的结束的那个询问也是这样。

    输入格式

    输入文件第一行包含一个正整数 \(n\),表示数列的长度。
    输入文件第二行包含 \(n\) 个整数,第 \(i\) 个数表示 \(x_i\) 的值。
    接下来若干行,每行三个数,表示加密后的 \(a,b,c\) 值。

    输出格式

    包含若干行,第 \(i\) 行的值是输入文件中第 \(i\) 个询问的答案。注意,你不需要对标志着询问结束的那个询问作答。
    同时,标志着询问结束的询问一定是输入文件的最后一行。也就是,输入文件不会有多余的内容。

    样例输入

    5
    -2 3 1 -5 2 
    -5 -4 145
    -1 -6 -509
    -9 -14 40
    -3 -13 21
    -3 -3 -3
    

    样例输出

    5
    4
    3
    3
    

    数据范围与提示

    \(n\le 50000\),需要作出回答的询问个数不超过 \(500000\)\(|x_i|\le 30000\)

    解密后的 \(a\) 的绝对值不超过 \(50000\),解密后的 \(b\) 的绝对值不超过 \(10^8\),解密后的 \(c\) 的绝对值不超过 \(10^{18}\)

    解法

    为啥这成为我访问量最多的博客了,是因为有 AK 吗?

    询问的结束也遵循加密方式?那么最后一个提问的答案不就是 \(-a\) 吗?将答案代回式子,就可以解出上个提问的答案。

    没了。

    代码

    #include <cstdio>
    typedef long long ll;
    
    int n, cnt;
    ll x[50005], A, B, C, id, ans[500005];
    struct node {
        ll a, b, c;
        node() {}
        node(const ll x, const ll y, const ll z) {a = x, b = y, c = z;}
    }q[500005];
    
    int main() {
        scanf("%d", &n);
        for(int i = 1; i <= n; ++ i) scanf("%lld", &x[i]);
        while(scanf("%lld %lld %lld", &A, &B, &C) != -1)
            q[++ cnt] = node(A, B, C);
        id = -q[cnt].a;
        ans[cnt] = id;
        for(int i = cnt - 1; i >= 1; -- i) {
            ll chu = (0ll + x[id] * x[id] * (id + 1) + x[id] * id + 1);
            if(chu == 0) ans[i] = 1;
            else ans[i] = -(0ll + q[i].a * (id + 1) * x[id] * x[id] + x[id] * id * (q[i].b + 1) + q[i].c + id) / chu;
            id = ans[i];
        }
        for(int i = 2; i <= cnt; ++ i) printf("%lld\n", ans[i]);
        return 0;
    }
    
  • 相关阅读:
    CentOS7中使用yum安装Nginx的方法
    vsftp上传文件权限
    java传入ftp 0k
    centos 7.0 查看selinux状态|关闭|开启
    NamingException
    fastdfs服务器搭建
    安装gnome图形界面程序
    MAVEN插件-tomcat插件,java编译插件,资源文件拷贝插件
    spring ioc
    jsp全路径
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/12403095.html
Copyright © 2011-2022 走看看