首页 > 编程语言 >2024 CCPC第五届辽宁省程序设计竞赛 集训2

2024 CCPC第五届辽宁省程序设计竞赛 集训2

时间:2024-10-24 18:35:03浏览次数:1  
标签:ps return Point int double CCPC 2024 ++ 集训

A. 早餐

print("39.20")

B. 水论文

signed main()
{
    int n,k;
    cin >> n >> k;
    set<int> st;
    int ans = 0;
    st.insert(n);
    for(int i = 0, t = n; i <= k; i ++, t = sqrt(t))
    {
        st.insert(t);
        if(st.count(t * t)) ans += 1;
        else ans += k - i + 1;
        if(t == 1) break;
    }
    cout << ans;
    return 0;
}

C. nim游戏?

import sys
input = lambda:sys.stdin.readline()

n = int(input())
for i in range(n):
    print('lose')

D. 校验和

#define int long long
void solve()
{
    int n, k;
    cin >> n >> k;
    string s;
    cin >> s;
    bitset<N> a(s);
    set<int> st;
    unsigned int ans;
    bool ok = 0;
    int cnt = a.count();
    for (int i = 0; i <= k; i++)
    {
        if (__builtin_popcount(i + cnt) == i)
            st.insert(cnt + i);
    }
    if (st.size())
    {
        ans = *st.begin();
        vector<int> res;
        while(ans)
        {
            res.push_back(ans & 1);
            ans >>= 1;
        }
        while (res.size() < k)
            res.push_back(0);
        if (res.size() > k)
            cout << "None";
        else
            for (int i = res.size() - 1; i >= 0; i--)
                cout << res[i];
        cout << "\n";
    }
    else
        cout << "None\n";
}

E. 数房子

#include <bits/stdc++.h>
using namespace std;
#define IOS                       \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);                   \
    cout.tie(0);
// #define int long long
#define endl '\n'
#define all(_x) _x.begin(), _x.end()
#define range(_x, _st, _ed) (_x.begin() + _st), (_x.begin() + _ed)
#define rep(_x, _y, _z) for (int _x = _y; _x < _z; _x++)
#define matrix(_x, _y, _z) vector<vector<int>>(_x, vector<int>(_y, _z))
#define debug(_x) cout << #_x << '=' << _x << endl
typedef long long i64;
typedef pair<int, int> pii;
typedef vector<vector<int>> mat;
constexpr int N = 2e5 + 10;
// dont use umap!!!

const double eps = 1e-12;
const double pi = acos(-1);
int cmp(double x, double y)
{
    if (fabs(x - y) < eps)
        return 0;
    return x > y ? 1 : -1;
}
int sgn(double x)
{
    if (fabs(x) < eps)
        return 0;
    return x > 0 ? 1 : -1;
}

template <typename T>
struct Point
{
    T x, y;
    T cross(Point p1, Point p2)
    {
        return p1.x * p2.y - p2.x * p1.y;
    }
    Point operator-(Point p)
    {
        return {x - p.x, y - p.y};
    }
    Point operator+(Point p)
    {
        return {x + p.x, y + p.y};
    }
    Point operator*(double p)
    {
        return {x * p, y * p};
    }
    T operator*(Point p)
    {
        return cross(*this, p);
    }
    Point operator/(double p)
    {
        return {x / p, y / p};
    }
    bool operator==(Point p)
    {
        return (!cmp(x, p.x)) && (!cmp(y, p.y));
    }
    bool operator!=(Point p)
    {
        return !(*this == p);
    }
    Point rotate(double p)
    {
        return {x * cos(p) - y * sin(p), x * sin(p) + y * cos(p)};
    }
};
typedef Point<double> point;

struct line
{
    point p, v;
};

double dot(point p, point v)
{
    return p.x * v.x + p.y * v.y;
}

double area(point p, line l)
{
    return (p - l.p) * (l.v - l.p);
}

double dist(point p1, point p2)
{
    return hypot(p1.x - p2.x, p1.y - p2.y);
}

point cross_point(line l1, line l2)
{
    auto p = l1.p, v = l1.v, q = l2.p, w = l2.v;
    auto u = p - q;
    double t = w * u / (v * w);
    return p + v * t;
}

signed main()
{
    IOS;
    int n;
    cin >> n;
    vector<point> ps(n);
    for (int i = 0; i < n; i++)
    {
        cin >> ps[i].x >> ps[i].y;
    }
    //    e
    // a /\ d
    //  |  |
    // b -- c
    int cnt = 0;
    for (int a = 0; a < n; a++)     // 枚举a
        for (int b = 0; b < n; b++) // 枚举b
        {
            for (int c = 0; c < n; c++) // 枚举c
            {
                if (area(ps[c], {ps[a], ps[b]}) < 0 && sgn(dot(ps[c] - ps[b], ps[a] - ps[b])) == 0) // 如果c在ab直线的右边且ab和bc垂直
                {
                    for (int d = 0; d < n; d++) // 枚举d
                    {
                        if (sgn((ps[d] - ps[c]) * (ps[a] - ps[b])) == 0 &&
                            sgn((ps[d] - ps[a]) * (ps[c] - ps[b])) == 0) // 如果dc和ab平行而且ad和bc平行
                        {
                            for (int e = 0; e < n; e++) // 枚举e
                            {
                                // e在直线ab右边,直线dc左边且在ad上方
                                if (sgn(dot(ps[e] - ps[a], ps[b] - ps[a])) < 0 && sgn(dot(ps[e] - ps[d], ps[c] - ps[d])) < 0 && sgn(area(ps[e], {ps[d], ps[c]})) > 0 && sgn(area(ps[e], {ps[a], ps[b]})) < 0 && sgn(dist(ps[e], ps[a]) - dist(ps[e], ps[d])) == 0)
                                {
                                    // cout << a << " " << b << " " << c << " " << d << " " << e << '\n';
                                    cnt++;
                                }
                            }
                        }
                    }
                }
            }
        }
    cout << cnt;
    return 0;
}

F. 相遇

vector<vector<int>> edge(N);
int fa[N][21], dep[N], L[N], R[N];
int now = 0;

void dfs(int x, int f)
{
    dep[x] = dep[f] + 1;
    fa[x][0] = f;
    L[x] = ++now; // 记录当前子树dfs序的左端点
    for (int i = 1; i < 20; i++)
    {
        fa[x][i] = fa[fa[x][i - 1]][i - 1];
    }
    for (auto v : edge[x])
    {
        if (v == f)
            continue;
        dfs(v, x);
    }
    R[x] = now; // 记录当前子树dfs序的右端点
}

int lca(int x, int y)
{
    if (dep[x] < dep[y])
        swap(x, y);
    for (int i = 19; i >= 0; i--)
    {
        if (dep[x] - (1 << i) >= dep[y])
        {
            x = fa[x][i];
        }
    }
    if (x == y)
        return x;

    for (int i = 19; i >= 0; i--)
    {
        if (fa[x][i] != fa[y][i])
        {
            x = fa[x][i];
            y = fa[y][i];
        }
    }
    return fa[x][0];
}

int dis(int x, int y)
{
    return dep[x] + dep[y] - 2 * dep[lca(x, y)];
}

int getfa(int x, int k) // 求x节点向上k级的祖先节点
{
    for (int i = 19; i >= 0; i--)
    {
        if ((1 << i) <= k)
        {
            k -= (1 << i);
            x = fa[x][i];
        }
    }
    return x;
}

int n, m;
int a[N][2]; // 记录点对
int c[N];    // 差分数组

signed main()
{
    IOS;
    cin >> n >> m;
    for (int i = 1; i < n; i++)
    {
        int x, y;
        cin >> x >> y;
        edge[x].push_back(y);
        edge[y].push_back(x);
    }

    for (int i = 1; i <= m; i++)
        cin >> a[i][0] >> a[i][1];
    dfs(1, 0);
    auto check = [&](int mid)
    {
        for (int i = 1; i <= m; i++)
        {
            if (dis(a[i][0], a[i][1]) <= mid)
            {
                c[1] += 2; // 这两个点都可以满足,在差分数组整体+2
                continue;
            }
            int anc = lca(a[i][0], a[i][1]);
            for (int j = 0; j < 2; j++) // 分别处理两个点
            {
                int len = dis(anc, a[i][j]); // 得到其中一点到点对lca的距离
                if (len > mid)               // 如果大于答案
                {
                    // 说明首都在当前节点mid级祖先节点的子树
                    int p = getfa(a[i][j], mid);
                    c[L[p]] += 1; // 对应的答案区间+1
                    c[R[p] + 1] -= 1;
                }
                else // 如果小于等于答案
                {
                    // 说明首都在另外一点的 两点距离-mid-1 级祖先的子树上
                    int p = getfa(a[i][j ^ 1], dis(a[i][0], a[i][1]) - mid - 1);
                    // 对应的答案区间+1
                    c[1] += 1;
                    c[L[p]] -= 1;
                    c[R[p] + 1] += 1;
                }
            }
        }
        int now = 0;
        int mx = 0;
        for (int i = 1; i <= n; i++)
        {
            now += c[i]; // 枚举每个节点的答案区间交集
            mx = max(mx, now);
            c[i] = 0; // 初始化差分数组
        }
        return mx >= 2 * m; // 如果存在一个满足所有点条件的首都,则说明mid可行
    };
    int l = 0, r = n;
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    cout << l;
}

G. 生成括号序列

typedef long long i64;
const int mod = 998244353;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    string s;
    cin >> s;
    int k = 0;
    vector<int> v;
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] == ')')
        {
            if (s[i - 1] == '(') // 如果是小括号
                k++;
            else // 如果是大括号
                v.push_back(k);
        }
    }
    i64 ans = 1;
    for (int i = v.size() - 1, j = 0; i >= 0; i--)
    {
        ans = ans * (k - v[i] + 1 + j) % mod;
        j++;
    }
    cout << ans << endl;
    return 0;
}

标签:ps,return,Point,int,double,CCPC,2024,++,集训
From: https://www.cnblogs.com/orangecodelog/p/18500167

相关文章

  • 新高一暑假第一期集训恢复性训练【数据结构-线段树晚测】(补)
    新高一暑假第一期集训恢复性训练【数据结构-线段树晚测】(补)A.[CF1045G]AIrobots我们先按视野降序排序,这样一个一个考虑,如果后面的能看到前面,那前面的也肯定能看到后面。这样,就是对于每一个机器人,在他前面有几个智商在\([q-k,q+k]\),位置在\([x-r,x+r]\)。那么把这个东......
  • 12万字的java面试题及答案整理(2024新版)
    前言本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***final有哪些用法?final也是很多面试喜欢问的地方,但我觉得这个......
  • 2024-10-24 学习人工智能的Day14 pandas(1)
    一、基础1、概述Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基础上构建而来Pandas名字衍生自术语“paneldata”(面板数据)和“Pythondataanalysis”(Python数据分析)Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以......
  • 2024-10-24 瀑布流(vue3)
    效果图: 代码: <template><divid="waterfallContainer"class="waterfall-container"><divv-for="(column,columnIndex)incolumns":key="columnIndex"class="waterfall-column">......
  • 多校A层冲刺NOIP2024模拟赛12
    多校A层冲刺NOIP2024模拟赛12\(T1\)A.Alice和璀璨花\(65pts/65pts/65pts\)部分分测试点\(1\sim10\):设\(f_{i,j}\)表示前\(i\)位中生长趋势子序列长度为\(j\)时的末尾最小元素,然后进行暴力转移。测试点\(11\sim13\):观察到至多选择\(\left\lceil\log_......
  • 20241024比赛总结
    T1数位设\(dp_{i,0/1}\)表示前i位,最后一段是/不是d倍数的方案数令\(d=2^x5^ym\)可以将模d同余转化为模\(2^x\),\(5^y\),\(m\)分别同余因为\(2^{20}=1048576>10^6\)所以,当\(j<=i-20\)时,前两项的结果均为0所以首先可以开两个前缀和,求sum[i-1]*10+s[i]-'0'对前两项的取模结果......
  • 2024牛客暑期多校训练营9 B.Break Sequence
    设\(f_i\)表示最后一个区间以\(a_i\)结尾的方案总数,也即前\(i\)个数的方案总数。最后的答案是\(f_n\)。很容易得到转移方程:\[f_i=\sum_{j=1}^{i-1}f_j\]其中,需要保证\(a_i\sima_j\)是一个合法区间才能累加,这个检查的过程可以通过\(j\)倒序并计算不合法的数的个......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛12
    Rank挂了不少,还行A.Alice和璀璨花签。一眼最长上升子序列,昨天在AT专题里刚见过,不过赛时没想到离散化之后树状数组,所以打的动态开点,结果细节挂了30pts。和最长上升子序列思路基本一致,直接区间查询\([1,a_i-1]\)的最大值,然后在\(a_i\timesb_{f_i}\)插入\(f_i\)......
  • 博客园 - 2024年10月24日之前使用的主题
     概览 配置01||基本设置02||代码高亮03||侧边栏公告04||页面定制CSS代码页面定制css代码/*动态星系*/@keyframesspin3D{from{transform:rotate3d(0.5,0.5,0.5,360deg)}to{transform:rotate3d(0deg)}}#loading{height:100%;background-color:#1d2630......
  • 抖音2024推文副业,欢迎来咨询
    不管钱多钱少,俗话说:苍蝇再少也是肉这个道理希望大家明白,想做就一起探讨,嫌少的也不用来了哈(只能做朋友,不能做副友),想做的欢迎来咨询(作者VX:GUAZI011492)想做收益多的可看这边文章(仅供参考)https://mp.weixin.qq.com/s?__biz=MzkxNTg0NDI4OA==&mid=2247483656&idx=1&sn=a948ff7d544......