首页 > 其他分享 >[CSP-S2020] VP

[CSP-S2020] VP

时间:2024-10-23 14:34:13浏览次数:1  
标签:q1 q2 int back long VP S2020 now CSP

【比赛地址】

省流: \(100+100+70+55\to100+100+70+0,325\to270\)

[CSP-S2020] 儒略日

乱搞。这道题太恶心了,场上用了 \(1h\) 才做出来。

代码过于抽象,不放了。

[CSP-S2020] 动物园

非常简单的黄题。

#include <bits/stdc++.h>
using namespace std;
unsigned long long n, m, c, k, b, a;
unsigned long long ans = 0;
bool vis[100];
int main()
{
    scanf("%llu%llu%llu%llu", &n, &m, &c, &k);
    ans = k;
    for (unsigned long long i = 1; i <= n; i++)
    {
        scanf("%llu", &a);
        b |= a;
    }
    for (unsigned long long i = 0; i < m; i++)
    {
        unsigned long long x, y;
        scanf("%d%d", &x, &y);
        vis[x] = 1;
    }
    for (unsigned long long i = 0; i < k; i++)
        if (vis[i])
            if (!(b & (1ull << i)))
                ans--;
    if (ans == 64 && !n)
        puts("18446744073709551616");
    else if (ans == 64)
    {
        printf("%llu\n", -n);
    }
    else
    {
        printf("%llu\n", (1ull << ans) - n);
    }
}

[CSP-S2020] 函数调用

暴力 + 线段树模板 2 \(=70pts\)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int M = 4e5 + 10;
int l[M], r[M], sum[M], add[M], mul[M]; // Segment tree arrays
int n, q, m, mod, arr[N];
void pushdown(int o)
{
    sum[o << 1] = (sum[o << 1] * mul[o] + add[o] * (r[o << 1] - l[o << 1] + 1)) % mod;
    sum[o << 1 | 1] = (sum[o << 1 | 1] * mul[o] + add[o] * (r[o << 1 | 1] - l[o << 1 | 1] + 1)) % mod;
    mul[o << 1] = mul[o << 1] * mul[o] % mod;
    mul[o << 1 | 1] = mul[o << 1 | 1] * mul[o] % mod;
    add[o << 1] = (add[o << 1] * mul[o] + add[o]) % mod;
    add[o << 1 | 1] = (add[o << 1 | 1] * mul[o] + add[o]) % mod;
    mul[o] = 1;
    add[o] = 0;
}
void build(int o, int L, int R)
{
    l[o] = L, r[o] = R;
    add[o] = 0;
    mul[o] = 1;
    if (L == R)
    {
        sum[o] = arr[L];
        return;
    }
    int mid = (L + R) >> 1;
    build(o << 1, L, mid);
    build(o << 1 | 1, mid + 1, R);
    sum[o] = (sum[o << 1] + sum[o << 1 | 1]) % mod;
}
void update1(int o, int L, int R, int x)
{
    if (max(L, l[o]) > min(R, r[o]))
        return;
    if (L <= l[o] && r[o] <= R)
    {
        mul[o] = mul[o] * x % mod;
        sum[o] = sum[o] * x % mod;
        add[o] = add[o] * x % mod;
        return;
    }
    pushdown(o);
    update1(o << 1, L, R, x);
    update1(o << 1 | 1, L, R, x);
    sum[o] = (sum[o << 1] + sum[o << 1 | 1]) % mod;
}
void update2(int o, int L, int R, int x)
{
    if (max(L, l[o]) > min(R, r[o]))
        return;
    if (L <= l[o] && r[o] <= R)
    {
        add[o] = (add[o] + x) % mod;
        sum[o] = (sum[o] + (r[o] - l[o] + 1) * x) % mod;
        return;
    }
    pushdown(o);
    update2(o << 1, L, R, x);
    update2(o << 1 | 1, L, R, x);
    sum[o] = (sum[o << 1] + sum[o << 1 | 1]) % mod;
}
int query(int o, int L, int R)
{
    if (max(L, l[o]) > min(R, r[o]))
        return 0;
    if (L <= l[o] && r[o] <= R)
    {
        return sum[o];
    }
    pushdown(o);
    return (query(o << 1, L, R) + query(o << 1 | 1, L, R)) % mod;
}

int T[N], v[N], p[N];
vector<int> Fun[N];

void F(int x)
{
    // Iterative approach using a stack
    stack<int> st;
    st.push(x);
    while (!st.empty())
    {
        int u = st.top();
        st.pop();
        if (T[u] == 1)
        {
            update2(1, p[u], p[u], v[u]);
        }
        else if (T[u] == 2)
        {
            update1(1, 1, n, v[u]);
        }
        else 
        {
            for (int i = Fun[u].size() - 1; i >= 0; --i)
                st.push(Fun[u][i]);
        }
    }
}
signed main()
{
    mod = 998244353;
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld", &arr[i]);
    build(1, 1, n);
    scanf("%lld", &m);
    for (int i = 1; i <= m; ++i)
    {
        int op;
        scanf("%lld", &op);
        T[i] = op;
        if (op == 1)
            scanf("%lld%lld", &p[i], &v[i]);
        else if (op == 2)
            scanf("%lld", &v[i]);
        else
        {
            int x;
            scanf("%lld", &x);
            while (x--)
            {
                int y;
                scanf("%lld", &y);
                Fun[i].push_back(y);
            }
        }
    }
    scanf("%lld", &q);
    for (int i = 1; i <= q; ++i)
    {
        int x;
        scanf("%lld", &x);
        F(x);
    }
    for (int i = 1; i <= n; ++i)
        printf("%lld ", query(1, i, i));
}

[CSP-S2020] 贪吃蛇

VP 后感觉暴力能拿 50pts。

赛事没看懂样例 2.2。

// 赛后补题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int main()
{
    int _;
    scanf("%d", &_);
    int n;
    for (int cas = 1; cas <= _; cas++)
    {
        if (cas == 1)
        {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++)
                scanf("%d", &a[i]);
        }
        else
        {
            int k;
            scanf("%d", &k);
            while (k--)
            {
                int x, y;
                scanf("%d%d", &x, &y);
                a[x] = y;
            }
        }
        deque<pair<int, int>> q1, q2;
        for (int i = 1; i <= n; i++)
            q1.push_back({a[i], i});
        int ans;
        while (1)
        {
            if (q1.size() + q2.size() == 2)
            {
                ans = 1;
                break;
            }
            int x, id, y;
            y = q1.front().first, q1.pop_front();
            if (q2.empty() || !q1.empty() && q1.back() > q2.back())
                x = q1.back().first, id = q1.back().second, q1.pop_back();
            else
                x = q2.back().first, id = q2.back().second, q2.pop_back();
            pair<int, int> now = make_pair(x - y, id);
            if (q1.empty() || q1.front() > now)
            {
                ans = q1.size() + q2.size() + 2;
                int cnt = 0;
                while (1)
                {
                    cnt++;
                    if (q1.size() + q2.size() + 1 == 2)
                    {
                        if (cnt % 2 == 0)
                            ans--;
                        break;
                    }
                    int x, id;
                    if (q2.empty() || !q1.empty() && q1.back() > q2.back())
                        x = q1.back().first, id = q1.back().second, q1.pop_back();
                    else
                        x = q2.back().first, id = q2.back().second, q2.pop_back();
                    now = {x - now.first, id};
                    if ((q1.empty() || now < q1.front()) && (q2.empty() || now < q2.front()))
                        ;
                    else
                    {
                        if (cnt % 2 == 0)
                            ans--;
                        break;
                    }
                }
                break;
            }
            else
                q2.push_front(now);
        }
        printf("%d\n", ans);
    }
    return 0;
}

标签:q1,q2,int,back,long,VP,S2020,now,CSP
From: https://www.cnblogs.com/kimi0705/p/-/CSP2020S

相关文章

  • P7909 [CSP-J 2021] 分糖果
    结论题题面概括请在$[l,r]$中找出一个数$k$,使得$n$%$k$的值最大.思路当$n\le10^9$时,说明$\Theta(n)$的算法已经结束了.所以,接下来是结论推理.当$\left\lfloor\frac{l}{n}\right\rfloor=\left\lfloor\frac{r}{n}\right\rfloor$时,$r$%$n$的......
  • P7910 [CSP-J 2021] 插入排序 题解
    正解首先要注意$2$点:修改数组元素的值会影响接下来的操作.对数组进行排序不会影响接下来的操作.思路直接扫一遍数组.假设排序后$a_x$会在第$p$位上.将$p$初始化为$n$.然后就开始找$x$前后有多少个小于$a_x$的值就行了.时间复杂度:$\Theta(nq)$.注意......
  • P7911 [CSP-J 2021] 网络连接 题解
    模拟代码#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intn,p=1,ans[1003];//没事干的ans数组structnode{ stringop,ad;}a[1003];intws(intn){//位数 intsum=0; if(n==0)return1; while(n){ n......
  • P8816 [CSP-J 2022] 上升点列 题解
    最长上升子序列根据题目中,每个坐标的横纵坐标均单调递增,所以明显可以使用最长上升子序列.定义状态$f_{i,p}$,表示正在节点$i$时,还剩下$p$次插入机会,所能达到的最大长度.定义变量$dis=|x_i-x_j|+|y_i-y_j|-1.$,表示$i$到$j$节点至少要插$dis$个节点.为什么要$-1$......
  • P8814 [CSP-J 2022] 解密 题解
    解方程$题目中说,n=pq,ed=(p-1)(q-1)+1,m=n-ed+2.$$把ed的式子展开,得到:$$ed=p(q-1)-(q-1)+1$$ed=pq-p-q+2$$再把展开后的式子带入m中,得:$$m=n-(pq-p-q+2)+2.$$m=n-pq+p+q-2+2$$\becausen=pq$$\thereforem=pq-pq+p+q-2+2$$m=p+q.$$如果想要求出p和q的值,那么可以再......
  • P8815 [CSP-J 2022] 逻辑表达式 题解
    短路我们可以使用一个变量来记录当前有没有短路.设变量短路为$dl$.当$dl$为$0$时,说明当前值为$0$,且运算符为&.当$dl$为$1$时,说明当前值为$1$,且运算符为|.代码重点讲完了,细节可以看代码以及注释.#include<iostream>#include<cstdio>#include<cstring>using......
  • Day12 备战CCF-CSP练习
    Day12题目描述西西艾弗岛上共有\(n\)个仓库,依次编号为\(1∼n\)。每个仓库均有一个\(m\)维向量的位置编码,用来表示仓库间的物流运转关系。具体来说,每个仓库\(i\)均可能有一个上级仓库\(j\),满足:仓库\(j\)位置编码的每一维均大于仓库\(i\)位置编码的对应元素。比如......
  • 准备CSP 复赛
    用来方便自己复习版本C++14目录快读和快输注意事项缺省源快读和快输链接:浅谈C++IO优化——读优输优方法集锦最全快读、快写模板「持续更新」-凌云_void-博客园读入、输出优化-OIWiki打的时候一定要注意运算符优先级QWQ(有时候真的很难发现)错误示例:int......
  • P9751 [CSP-J 2023] 旅游巴士 题解
    思路首先,举一个例子,假如说小Z到了入口,但是没到时间,所以没法进去,该怎么办?当然是等$k$个时间单位呀.除此之外,像到了其他景区,但是还没开门怎么办?继续等$k$的非负整数倍时间呀.知道这个后,我们先定义状态$f_{i,j}$,表示到达点$i$时,路径长度(即时间)$mod$$k$的最早时......
  • P9749 [CSP-J 2023] 公路 题解
    此题贪心食用更佳在输入油价的时候,我们边计算油价的最小值和路程和.当路程之和$>0$时,计算油价并且减去对应路程即可.注意事项要开$long$$long$!!!.代码#include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;typedeflonglo......