首页 > 其他分享 >XCPC模板

XCPC模板

时间:2024-10-23 23:44:28浏览次数:6  
标签:return idx int BigInt XCPC const 模板 size

!!!声明:本人自用模板,谨慎使用,比赛中出现bug概不负责。

`BigInt`高精度整数(不含负数)
struct BigInt {
    std::vector<char> v;
    BigInt(int x = 0) : v{} {
        do v.push_back(x % 10); while (x /= 10);
    }
    BigInt(std::string &x) : v{} {
        assert(size(x) != 0);
        for (int i = (int)size(x) - 1; i >= 0; --i) {
            v.push_back(x[i] - '0');
        }
    }
    BigInt &operator=(int x) {
        v.clear();
        do v.push_back(x % 10); while (x /= 10);
        return *this;
    }
    BigInt &operator=(const BigInt &x) {
        v.resize(x.v.size());
        memcpy(const_cast<char *>(v.data()), x.v.data(), x.v.size() * sizeof(char));
        return *this;
    }
    friend bool operator==(const BigInt &a, const BigInt &b) {
        if (size(a.v) == size(b.v)) {
            int idx = 0;
            while (idx < (int)size(a.v) && a.v[idx] == b.v[idx]) idx++; 
            return idx < (int)size(a.v);
        } else {
            return false;
        }
    }
    friend bool operator!=(const BigInt &a, const BigInt &b) {
        return !(a == b);
    }
    friend bool operator<(const BigInt &a, const BigInt &b) {
        if (size(a.v) == size(b.v)) {
            int idx = size(a.v) - 1;
            while (idx >= 0 && a.v[idx] == b.v[idx]) idx--; 
            return idx >= 0 && a.v[idx] < b.v[idx];
        }
        return size(a.v) < size(b.v);
    }
    friend bool operator<=(const BigInt &a, const BigInt &b) {
        if (size(a.v) == size(b.v)) {
            int idx = size(a.v) - 1;
            while (idx >= 0 && a.v[idx] == b.v[idx]) idx--; 
            return idx == -1 || a.v[idx] <= b.v[idx];
        }
        return size(a.v) < size(b.v);
    }
    friend bool operator>(const BigInt &a, const BigInt &b) {
        if (size(a.v) == size(b.v)) {
            int idx = size(a.v) - 1;
            while (idx >= 0 && a.v[idx] == b.v[idx]) idx--; 
            return idx >= 0 && a.v[idx] > b.v[idx];
        }
        return size(a.v) > size(b.v);
    }
    friend bool operator>=(const BigInt &a, const BigInt &b) {
        if (size(a.v) == size(b.v)) {
            int idx = size(a.v);
            while (idx >= 0 && a.v[idx] == b.v[idx]) idx--;
            return idx == -1 || a.v[idx] >= b.v[idx];
        }
        return size(a.v) > size(b.v);
    }
    BigInt &operator+=(const BigInt &x) & {
        int n = std::max<int>(size(v), size(x.v)), tmp = 0;
        bool flag = false;
        for (int i = 0; i < n; ++i) {
            if (i >= (int)size(v)) v.push_back(0);
            if (i < (int)size(x.v)) v[i] += x.v[i];
            if (flag) v[i] += 1, flag = false;
            if (v[i] >= 10) v[i] %= 10, flag = true;
        }
        if (flag) v.push_back(1);
        return *this;
    }
    BigInt &operator-=(const BigInt &x) & {
        assert(*this >= x);
        bool flag = false;
        for (int i = 0; i < (int)size(v); ++i) {
            if (i < (int)size(x.v)) v[i] -= x.v[i];
            if (flag) v[i] -= 1, flag = false;
            if (v[i] < 0) v[i] += 10, flag = true;
        }
        while (size(v) > 1 && v.back() == 0) v.pop_back();
        return *this;
    }
    BigInt &operator*=(const int &x) & {
        int tmp = 0;
        for (int i = 0; i < size(v); ++i) {
            tmp += (int)x * v[i];
            v[i] = tmp % 10;
            tmp /= 10;
        }
        while (tmp) {
            v.push_back(tmp % 10);
            tmp /= 10;
        }
        return *this;
    }
    BigInt &operator*=(const BigInt &x) & {
        BigInt result;
        result.v.resize(size(v) + size(x.v));
        for (int i = 0; i < (int)size(v); ++i) {
            for (int j = 0; j < (int)size(x.v); ++j) {
                result.v[i + j] += v[i] * x.v[j];
                result.v[i + j + 1] += result.v[i + j] / 10;
                result.v[i + j] %= 10;   
            }
        }
        while (size(result.v) > 1 && result.v.back() == 0) result.v.pop_back();
        return *this = result;
    }
    BigInt &operator/=(const int &x) & {
        int r = 0;
        for (int i = size(v) - 1; i >= 0; --i) {
            r = r * 10 + v[i];
            v[i] = r / x;
            r %= x;
        }
        while (size(v) > 1 && v.back() == 0) v.pop_back();
        return *this;
    }
    int operator%=(const int &x) {
        int r = 0;
        for (int i = size(v) - 1; i >= 0; --i) {
            r = r * 10 + v[i];
            r %= x;
        }
        return r;
    }
    friend BigInt operator+(BigInt a, const BigInt &b) {
        return a += b;
    }
    friend BigInt operator-(BigInt a, const BigInt &b) {
        return a -= b;
    }
    friend BigInt operator*(BigInt a, const int &b) {
        return a *= b;
    }
    friend BigInt operator*(BigInt a, const BigInt &b) {
        return a *= b;
    }
    friend BigInt operator/(BigInt a, const int &b) {
        return a /= b;
    }
    friend int operator%(BigInt a, const int &b) {
        return a %= b;
    }
    friend std::istream &operator>>(std::istream &is, BigInt &a) {
        std::string str;
        is >> str;
        a = BigInt(str);
        return is;
    }
    friend std::ostream &operator<<(std::ostream &os, const BigInt &a) {
        for (int i = a.v.size() - 1; i >= 0; --i) os << (char)(a.v[i] + '0');
        return os;
    }
};

DSU并查集

struct DSU {
    std::vector<int> p, siz;
    DSU(int n) { init(n); }
    void init(int n) {
        p.resize(n);
        std::iota(p.begin(), p.end(), 0);
        siz.assign(n, 1);
    }
    int leader(int x) {
        while (x != p[x]) x = p[x] = p[p[x]];
        return x;
    }
    bool same(int x, int y) { return leader(x) == leader(y); }
    bool merge(int x, int y) {
        x = leader(x), y = leader(y);
        if (x == y) return false;
        siz[x] += siz[y], p[y] = x;
        return true;
    }
    int size(int x) { return siz[leader(x)]; }
};

标签:return,idx,int,BigInt,XCPC,const,模板,size
From: https://www.cnblogs.com/sleeeeeping/p/18498421

相关文章

  • 如何在后台修改网站名称?如何修改网站底部模板?
    修改网站名称登录后台管理系统使用管理员账号登录网站的后台管理系统。进入网站设置导航到网站的基本设置或全局设置页面。修改网站名称找到“网站名称”或“站点标题”等相关字段。输入新的网站名称并保存更改。确认修改访问前台页面,检查网站名称是否已......
  • VBA代码按模板批量新建Excel工作簿&自动填充单元格信息(2.0)
    <<<<接续投稿的1.01.代码①用于将模板复制到新建工作簿中,代码②用于将源文件(即新建工作簿所需名单所在的那个文件,也是粘贴代码的那个文件)。因此,完成“按模板批量与自动填充信息”这一操作需要准备三个文件。(文件命名没有严格要求,在操作过程中统一即可,图片中仅作演示)(1)——>......
  • 模板复习计划
    进度模板SPFA(不带负环)FloydDijkstra拓扑排序-[已完成]单调栈单调队列Trie树KMP线性乘法逆元线性任意n个数乘法逆元-[已完成]线段树2带负环的SPFAexgcdTarjan找强连通分量差分约束康托展开网络......
  • 二叉树路径问题模板总结
    二叉树路径问题模板总结文章目录二叉树路径问题模板总结问题分类1、自顶向下257.二叉树的所有路径112.路径总和113.路径总和II437.路径总和III面试题04.12.求和路径998.从叶节点开始的最小字符串2、非自顶向下543.二叉树的直径124.二叉树中的最大路径和687.最长同值路径......
  • Spring Boot 替换Word模板生成Word文件教程
    ......
  • 网站php模板怎么修改?
    备份现有文件在开始修改之前,先备份现有的模板文件,以防止意外情况发生。可以使用FTP工具将文件下载到本地进行备份。确定需要修改的文件找到需要修改的PHP模板文件。通常这些文件位于网站的模板目录中,例如 templates 或 views 文件夹。常见的文件扩展名包括 .php......
  • 测试题目的输入输出模板喵
    测试题目的输入输出模板目录测试题目的输入输出模板目录你可能会用到的代码A-看看你会不会用电脑B-求求你不要用内置函数C-GPAD-minE-for循环大神F-居然有人说这个是线性代数G-高三同学秒了H-无穷级数I-不要用内置函数......
  • 网站模板可以自己修改吗?
    网站模板通常是可以根据个人或企业的具体需求进行自定义修改的。以下是一些常见的修改方式:修改样式:通过编辑CSS文件来改变网站的颜色、字体、布局等视觉效果。调整结构:在HTML或相应的模板文件中添加或删除元素,以适应不同的页面布局需求。功能增强:利用JavaScript或其他前端框架......
  • 公司网站页面文字修改?网站模板修改外观的教程?
    公司网站页面的文字修改是一项常见的维护任务,可以通过以下步骤来完成:确定修改内容:确定需要修改的具体页面和段落。准备好新的文字内容。访问网站管理后台:如果你的网站有CMS(内容管理系统)如WordPress、Drupal等,登录到后台管理界面。导航到需要修改的页面或文章。编......
  • Java的模板模式 - 设计模式之行为模式
    模板模式(TemplateMethodPattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重新定义该算法的某些特定步骤。在Java中,模板模式通常通过抽象类来实现。下面是一个使用模板模式的示例代码,以及详细的......