ABC343 A-G

AtCoder Beginner Contest 343 - AtCoder

思路全出了,手搓全唐了,好消息是前几题手很快,上分了

A - Wrong Answer

题意:

输出一个不等与A+B的范围在0到9内的整数

代码:

void solve()
{
    int a, b;
    scanf("%d%d", &a, &b);
    if (a + b)printf("0\n");
    else printf("1\n");
}

B - Adjacency Matrix

题意:

给出一张有N个点的简单无向图,邻接表中的 Ai,j = 1表示 i, j 之间有边相连,对于每个点输出所有直接与它相连的点的编号

代码:

void solve()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        vector<int>v;
        for (int j = 1, x; j <= n; ++j)
        {
            scanf("%d", &x);
            if (x)v.push_back(j);
        }
        for (auto j : v)printf("%d ", j);
        printf("\n");
    }
}

C - 343

题意:

输出小于N的最大的回文立方数

题解:

O(N^{_{\frac{1}{3}}})暴力枚举所有立方数并暴力判断回文数即可

bool check(LL x)//判断x是不是回文数
{
    vector<int>v;
    while (x)
        v.push_back(x % 10), x /= 10;
    int n = v.size() - 1;
    for (int i = 0; i <= n; ++i)
        if (v[i] != v[n - i])return 0;
    return 1;
}
void solve()
{
    LL n, mx = 1;
    scanf("%lld", &n);
    for (LL i = 1; i * i * i <= n; ++i)//枚举立方数
        if (check(i * i * i))mx = i * i * i;
    printf("%lld\n", mx);
}

D - Diversity of Scores

题意:

有N人参加比赛,编号分别为1到N,每人都有一个积分,这个积分初始为0,这些分数将进行共计T次变化,第 i 次变化Ai, Bi表示第Ai个人获得了Bi分,你需要在每次分数发现变化后,输出当前不同的分数的数量

题解:

数组A维护一下每个人的分数,map<x,y>表示获得x分的人数共有y人,若每次修改前mp[A[x]] = 1则本次修改会使分数为A[x]的人数变为0,此时删除A[x]即可,具体维护方式见代码,修改之后的答案即mp.size(),注意数据范围爆int

LL a[N];
map<LL, int>mp;
void solve()
{
    int n, q;
    scanf("%d%d", &n, &q);
    mp[0] = n;
    while (q--)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        if (--mp[a[x]] == 0)
            mp.erase(a[x]);
        a[x] += y;
        ++mp[a[x]];
        printf("%d\n", mp.size());
    }
}

E - 7x7x7

题意:

在三维空间中有3个7x7x7的正方体,问是否存在一种放置方式使得同时被三个正方体包含的区域体积为V3,同时仅被两个正方体包含的区域体积为V2,仅被一个正方体包含的区域体积为V1,若存在输出三个正方体的位置

题解:

设第一个正方体的位置恒为(0, 0, 0),暴力枚举第二、三个正方体的位置,check每种放置方法是否合法即可,具体check方式见代码

对于枚举位置,显然让三个正方体离太远没有意义,我们只需要枚举所有能使得三个正方体相交/至少有一个面重合的最大范围即可,则我们可以枚举第二个正方体的三个维度的坐标值在(0, 7)范围,第三个正方体的坐标值在(-7, 14)范围即可(不知道还能不能更小)

int get_d(int x, int tx)//两个正方体的重合部分x/y/z方向上的边长
{
    return max(0, min(x, tx) + 7 - max(x, tx));
}
int get_d(int sx, int x, int tx)//三个正方体的重合部分x/y/z方向上的边长
{
    return max(0, min({ sx,x,tx }) + 7 - max({ sx,x,tx }));
}
int fun(int ax, int ay, int az, int bx, int by, int bz)//两个7x7x7的正方体的重合体积
{
    int dx = get_d(ax, bx), dy = get_d(ay, by), dz = get_d(az, bz);
    return dx * dy * dz;
}
void solve()
{
    int v1, v2, v3;
    scanf("%d%d%d", &v1, &v2, &v3);
    for (int x = 0; x <= 7; ++x)
    {
        for (int y = 0; y <= 7; ++y)
        {
            for (int z = 0; z <= 7; ++z)
            {
                for (int tx = -7; tx <= 14; ++tx)
                {
                    for (int ty = -7; ty <= 14; ++ty)
                    {
                        for (int tz = -7; tz <= 14; ++tz)
                        {
                            int dx = get_d(0, x, tx), dy = get_d(0, y, ty), dz = get_d(0, z, tz);
                            int tv3 = dx * dy * dz;
                            if (tv3 != v3)continue;
                            int tv2 = fun(0, 0, 0, x, y, z) + fun(0, 0, 0, tx, ty, tz) + fun(x, y, z, tx, ty, tz) - 3 * tv3;//容斥
                            if (tv2 != v2)continue;
                            int tv1 = 3 * 7 * 7 * 7 - 3 * tv3 - 2 * tv2;//容斥
                            if (tv1 != v1)continue;
                            printf("Yes\n");
                            printf("0 0 0 %d %d %d %d %d %d\n", x, y, z, tx, ty, tz);
                            return;
                        }
                    }
                }
            }
        }
    }
    printf("No\n");
}

F - Second Largest Query

题意:

给出一个长度为N的数组A,对该数组进行T次操作:

1 p x:修改Ap的值为x

2 l r:查询区间l, r内的次大值的数量

题解:

线段树维护即可,具体见代码

#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mx(i,j) (tr[i].mx[j])
#define cnt(i,j) (tr[i].cnt[j])
struct node
{
    int mx[2], cnt[2];//最大值,次大值;最大值的数量,次大值的数量
}tr[N << 2];
node push_up(node x, node y)
{
    map<int, int>mp;
    mp[x.mx[0]] += x.cnt[0];
    mp[x.mx[1]] += x.cnt[1];
    mp[y.mx[0]] += y.cnt[0];
    mp[y.mx[1]] += y.cnt[1];
    auto it = mp.rbegin();
    node res = { {it->first,next(it)->first},{it->second,next(it)->second} };
    return res;
}
void build(int l, int r, int i)
{
    if (l == r)
    {
        scanf("%d", &mx(i, 0));
        cnt(i, 0) = 1;
        return;
    }
    int mid = l + r >> 1;
    build(l, mid, ls(i));
    build(mid + 1, r, rs(i));
    tr[i] = push_up(tr[ls(i)], tr[rs(i)]);
}
void updata(int pos, int data, int l, int r, int i)
{
    if (l == r)
    {
        mx(i, 0) = data;
        return;
    }
    int mid = l + r >> 1;
    if (pos <= mid)updata(pos, data, l, mid, ls(i));
    else updata(pos, data, mid + 1, r, rs(i));
    tr[i] = push_up(tr[ls(i)], tr[rs(i)]);
}
node query(int ql, int qr, int l, int r, int i)
{
    if (ql <= l && r <= qr)
        return tr[i];
    int mid = l + r >> 1;
    node res = { {0,0},{0,0} };
    if (ql <= mid)res = push_up(res, query(ql, qr, l, mid, ls(i)));
    if (qr > mid)res = push_up(res, query(ql, qr, mid + 1, r, rs(i)));
    return res;
}
void solve()
{
    int n, q;
    scanf("%d%d", &n, &q);
    build(1, n, 1);
    while (q--)
    {
        int op, x, y;
        scanf("%d%d%d", &op, &x, &y);
        if (op == 1)
            updata(x, y, 1, n, 1);
        else
            printf("%d\n", query(x, y, 1, n, 1).cnt[1]);
    }

}

G - Compress Strings

题意:

给出N个字符串S,求字符串T的最小长度使得所有的Si都是T的子串

题解:

相当于是像拼积木一样拼接所有字符串,当Si的后缀等于Sj的前缀时就可以拼接Si与Sj的同时删去Sj的那一段相同的前缀,同时当Sj是Si的子串时则可以直接把Sj塞进Si里,不产生更多的长度,求最小的拼接之后的总长度

对于求Si的后缀与Sj的前缀的最大匹配长度和Sj是否是Si的子串这类字符串匹配问题可以用Z函数、KMP或者哈希处理

对于求最小总长度,我们可以发现N很小,因此我们可以使用状压dp,dp[f][i]表示已经拼接的集合为f,并且当前的拼接字符串的后缀为Si的后缀时的最小长度,此时往拼接字符串末尾拼接字符Sj存在两种转移:

1、Sj是Si的子串,则往集合中加入j,拼接字符串后缀仍为Si,不产生多余花费;

2、Sj不是Si的子串,往集合中加入j,拼接字符串后后缀变更为Sj,花费为 Sj的长度 - Si后缀与Sj前缀的最大匹配长度。

从集合中元素数量从少到多枚举状态转移即可

思路很快,但搓代码搓的很慢,比赛结束几分钟才搓完然后爆wa,赛后20分钟才调完的bug,写的太唐了,用的字符串哈希判断的字符串匹配,赛后顺便整理了一下模板,感觉这个板子写的挺还帅的

const LL N = 2e1 + 10, INF = 0x3f3f3f3f;
//个人手搓的多模哈希板子,感觉挺好使的
const int LEN = 2e5 + 10, H = 3, L = 1e18, R = 2e9;//最长的字符串长度, 哈希数量, 随机数生成范围
mt19937_64 rnd(random_device{}());//生成随机数
uniform_int_distribution<int> dist(L, R);
typedef array<LL, H> Hash;
Hash P, mod, p[LEN];
Hash operator*(Hash x, Hash y)//重载运算符是好东西
{
    Hash res;
    for (int i = 0; i < H; ++i)
        res[i] = x[i] * y[i] % mod[i];
    return res;
}
Hash operator+(Hash x, Hash y)
{
    Hash res;
    for (int i = 0; i < H; ++i)
        res[i] = (x[i] + y[i]) % mod[i];
    return res;
}
Hash operator-(Hash x, Hash y)
{
    Hash res;
    for (int i = 0; i < H; ++i)
        res[i] = (x[i] - y[i] + mod[i]) % mod[i];
    return res;
}
void fill(Hash& hs, LL x)
{
    for (auto& i : hs)i = x;
}
void init()
{
    for (int i = 0; i < H; ++i)
        P[i] = dist(rnd), mod[i] = dist(rnd);
    fill(p[0], 1);
    for (int i = 1; i < LEN; ++i)
        p[i] = p[i - 1] * P;
}
vector<Hash> build_hash(string& str)
{
    Hash t;
    fill(t, 0);
    vector<Hash>hs{ t };
    for (auto& c : str)
    {
        fill(t, c);
        hs.push_back(hs.back() * P + t);
    }
    return hs;
}
Hash get_hash(vector<Hash>& hs, int l, int r)
{
    return hs[r] - hs[l - 1] * p[r - l + 1];
}
//哈希板子
string s[N];
vector<Hash>h[N];
int e[N][N], dp[1 << 20][N];
void solve()
{
    init();
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        cin >> s[i];
        h[i] = build_hash(s[i]);
    }
    memset(e, 0x3f, sizeof e);
    for (int i = 1; i <= n; ++i)//i包含j
    {
        for (int j = 1; j <= n; ++j)if (i != j && s[i].size() >= s[j].size())
        {
            Hash hj = get_hash(h[j], 1, s[j].size());
            for (int l = 1; l + s[j].size() - 1 <= s[i].size(); ++l)
            {
                if (get_hash(h[i], l, l + s[j].size() - 1) == hj)
                {
                    e[i][j] = 0;
                    break;
                }
            }
        }
    }
    for (int i = 1; i <= n; ++i)//i拼接j的代价
    {
        for (int j = 1; j <= n; ++j)if (i != j)
        {
            int len = 0;//相同部分长度
            for (int t = 1; t <= s[i].size() && t <= s[j].size(); ++t)
            {
                if (get_hash(h[i], s[i].size() - t + 1, s[i].size()) == get_hash(h[j], 1, t))
                    len = t;
            }
            e[i][j] = min(e[i][j], (int)s[j].size() - len);
        }
    }
    vector<int>v[21];//预处理所有元素数量为i的集合vi
    for (int f = 1; f < 1 << 20; ++f)
        v[bitset<21>(f).count()].push_back(f);
    memset(dp, 0x3f, sizeof dp);
    for (int i = 1; i <= n; ++i)//初始化dp数组
        dp[1 << i - 1][i] = s[i].size();
    for (int s = 1; s < n; ++s)
    {
        for (auto f : v[s])
        {
            for (int u = 1; u <= n; ++u)if ((f >> u - 1) & 1)
            {
                for (int tv = 1; tv <= n; ++tv)if (!((f >> tv - 1) & 1))
                {
                    if (e[u][tv] == 0)dp[f + (1 << tv - 1)][u] = min(dp[f + (1 << tv - 1)][u], dp[f][u]);
                    else dp[f + (1 << tv - 1)][tv] = min(dp[f + (1 << tv - 1)][tv], dp[f][u] + e[u][tv]);
                }
            }
        }
    }
    int ans = INF;
    for (int i = 1; i <= n; ++i)
        ans = min(ans, dp[(1 << n) - 1][i]);
    printf("%d\n", ans);
}

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
更新说明: 2017-02-04(yaya) Ls command: Empty Folder returns false. 2016-12-08(yaya) 修正lz4、vhd不显示解压缩进度指示。增加lzma解压缩进度指示。 2016-11-09(不点) 0x8205 bit 5 = 1: 使checkkey闲置循环停止指令。 2016-04-13(yaya) 支持动画菜单 setmenu --graphic-entry=类型=菜单行数=菜单列数=图形宽(像素)=图形高(像素)=菜单行间距(像素) 菜单项0的路径文件名 类型: 位0:高亮指定颜色 位1:高亮颜色翻转 位2:高亮显示线框 位7:背景透明(最好使用黑色背景) 文件名: *n.??? 格式 n=00-99 高亮颜色由 color HIGHLIGHT=0xrrggbb 指定。 字符可以使用任意字型、字高、颜色,可以辅以图标。 2016-03-25(yaya) 菜单字符可以使用不同字型。 例如:"七" 使用不同字型,将 .hex 文件中的 unicode 码 “4e03” 修改为 “0080”, 将菜单中的 "七" 修改为 “\X0080”。 2016-03-23(yaya) 增强 echo 函数功能。 例如:echo -e \x18 显示 UTF-8 字符 0x18。 echo -e \X2191 显示 unicode 字符 0x2191。 2016-03-15(yaya) 1.增加动画控制热键 F2:播放/停止。 2.增加动画控制位 0x835b,位0:0/1=停止/播放。 3.增加精简字库模式:--simp=起始0,终止0,...,起始3,终止3 中文可以使用 --simp= ,内置字库应当包含 DotSize=[font_h],['simp'] 例如:font --font-high=24 --simp= /24_24.hex DotSize=24,simp 不使用热键: 可以加载 32*32 unifont 全字库 使用热键: 可以加载 24*24 unifont 全字库 使用精简字库: 可以加载 46*46 汉字全字库 使用精简字库及热键:可以加载 40*40 汉字全字库 4.不再支持 bin 格式字库。 2016-03-03(yaya) 1.增加图像背景色设置方法。 splashimage --fill-color=[0xrrggbb] 作用之一,作为小图像的背景。 作用之二,直接作为菜单的背景(即不加载图像背景)。此时只设置字体的前景色即可。 2.增加动画菜单。 splashimage --animated=[type]=[delay]=[last_num]=[x]=[y] START_FILE 类型[type]:bit 0-3: 播放次数 bit 4: 永远重复 bit 7: 透明背景 type=00:禁止播放 播放n次:序列图像各显示n次,时间独占。可作为启动前导、序幕。 永远重复:序列图像无限循环,时间与菜单共享。可作为菜单里的动画。 背景透明:即抠像。要求4角像素为背景色。 背景色最好为白色或黑色,这样可以去除一些灰色杂波。若是彩色背景,则应当非常干净。 提醒:请以16进制方式输入。否则易错。 延迟[delay]:序列图像之间的延迟。单位是滴答,即1/18.2秒。 序列数[last_num]:序列图像总数(2位数,从1开始计数)。 偏移[x]、[y]:图像偏移,单位像素。 起始图像文件 START_FILE 命名规则:*n.??? n: 1-9 或 01-99 或 001-999。 3.增加固定图像的背景色可以透明。 splashimage [--offset=[type]=[x]=[y]] FILE 类型[type]:bit 7: 透明背景 2016-02-14(yaya) setmenu 函数增加菜单项目背景短/满参数(默认短) 2016-01-19(yaya) splashimage 函数增加图像起始偏移(默认0) 2015-08-20(yaya) 1.支持非
R A B C a b c d a f c b d S A B C b g A d a F 山东海天软件工程专修学院模拟试卷 《数据库系统原理》A试卷 1、 单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代 码填写在题后的括号内。错选、多选或未选均无分。 1.在数据库方式下,信息处理中占据中心位置的是( ) A.磁盘 B.程序 C.数据 D.内存 2.下列功能中,不属于DML基本操作功能的是( ) A.排序 B.插入 C.修改 D.检索 3.在下列四种模型中,与计算机的硬件及软件均无关的是( ) A.外部模型 B.逻辑模型 C.概念模型 D.内部模型 4.设计数据库时,应该首先设计数据库的( ) A.应用系统结构 B.概念结构 C.逻辑结构 D.物理结构 5.如果实体X的存在依赖于Y的存在,且X主键的部分或全部从Y中获 得,则X是( ) A.递归实体 B.复合实体 C.弱实体 D.超类实体 6.关系规范化中的插入异常是指( ) A.不该插入的数据被插入 B.应该插入的数据没插入 C.插入了没有用的数据 D.插入了错误的数据 7.两个函数依赖集F和G等价的充分必要条件是( ) A.F=G B.F+=G C.F=G+ D.F+=G+ 8.设有关系R和S如题8图: 题8图 则R与S进行差运算,其结果的元组数为( ) A.1 B.2 C.3 D.5 9.下列不属于存储过程优点的是( ) A.增加了程序编写工作量 B.提高运行速度 C.降低网络通信量 D.间接实现安全控制 10.SQL语言的标准库函数COUNT、SUM、AVG、MAX和MIN等,不允 许出现在下列哪个子句中( ) A.SELECT B.HAVING C.GROUP…HAVING D.WHERE 11.SQL语言是关系型数据库系统典型的数据库语言,它是( ) A.过程化语言 B.结构化查询语言 C.格式化语言 D.导航式语言 12.将查询关系S的权限授予用户WANG,并允许该用户将此权限授予其 他用户。实现此功能的SQL语句是( ) A.GRANT SELECT TO S ON WANG WITH PUBLIC B.GRANT SELECT ON S TO WANG WITH PUBLIC C.GRANT SELECT TO S ON WANG WITH GRANT OPTION D.GRANT SELECT ON S TO WANG WITH GRANT OPTION 13.若事务T1 已经给数据A加上了共享锁,则事务T2 ( ) A.只能再对A加共享锁 B.只能再对A加排他锁 C.可以对A加共享锁,也可以对A加排他锁 D.不能再给A加任何锁 14.在对象联系图中,表示对象类型之间的超类与子类联系的是( ) A.双向箭头 B.双线箭头 C.双箭头 D.单箭头 15.在SQL/CLI中,将宿主程序与数据库交互的有关信息记录在运行时 数据结果中的是( ) A.环境记录、连接记录、语句记录、描述记录 B.环境记录、连接记录、语句记录、运行记录 C.环境记录、连接记录、运行记录、描述记录 D.环境记录、运行记录、语句记录、描述记录 二、填空题(本大题共10小题,每小题1分,共10分) 请在每小题的空格上填上正确答案。错填、不填均无分。 16.关系模型和层次、网状模型的最大差别是用________导航数据。 17.数据库系统中三级模式结构定义存放在________中。 18.如果关系模式R是1NF,且每个非主属性________函数依赖于候选 键,那么称R是第二范式的模式。 19.模式分解的优点之一是能消除________和操作异常现象。 20.若关系A有m个属性,关系B有n个属性,则A×B有________个属性。 21.SQL语言中,向数据库表中插入数据的命令是________。 22.在程序中,事务以BEGIN TRANSACTION语句开始,以________语 句或ROLL-BACK语句结束。 23.数据库的并发操作通常会带来三个问题:________问题、读脏数据问 题、不可重复读问题。 24.ODBC技术为应用程序提供了一套CLI函数库和基于________的运行 支持环境。 25.在面向对象技术中,数据类型系统由基本类型、复合类型和 ________三部分组成。 三、简答题(本大题共10小题,每小题3分,共30分) 26.什么是数据独立性?在数据库中有哪两级独立性? 27.什么是DB的系统缓冲区? 28.设有函数依赖集F={AB CE,A C,GP B,EP A,CDE P, HB P,D HG,ABC PG},计算属性集D关于F的闭包D+。 29.什么是事务?它具有哪些性质? 30.简述基本表和视
ABC**DE*G**F***是一个按先序遍历输入的字符序列。根据引用中的描述,我们可以根据这个序列建立二叉树并按中序和后序的方式遍历。 首先,根据先序遍历的顺序建立二叉树。在先序遍历中,首先访问根节点A,然后根据先序遍历的顺序,我们可以确定A的左子树是B和C,而右子树为空。继续遍历B和C的子树,我们可以确定B的左子树为空,右子树为D和E;C的左子树为空,右子树为G。最后,遍历D、E和G的子树,我们可以确定D的左子树为空,右子树为空;E的左子树为空,右子树为空;G的左子树为空,右子树为F。这样我们就建立了如下的二叉树: ``` A / \ B C \ \ D G \ E \ F ``` 接下来,我们可以按中序遍历的方式遍历这棵树。中序遍历的顺序是左子树-根节点-右子树。所以按中序遍历的顺序,我们首先访问左子树B,然后访问根节点A,接着访问右子树D,再访问根节点B,然后访问右子树E,接着访问根节点D,然后访问右子树F,接着访问根节点E,然后访问右子树C,接着访问根节点G,最后访问右子树C。所以按中序遍历的顺序,结果是B-A-D-E-F-C-G。 最后,我们按后序遍历的方式遍历这棵树。后序遍历的顺序是左子树-右子树-根节点。所以按后序遍历的顺序,我们首先访问左子树B,然后访问右子树D,接着访问根节点E,再访问右子树F,接着访问根节点D,然后访问右子树B,接着访问根节点G,最后访问右子树C,然后访问根节点C,最后访问根节点A。所以按后序遍历的顺序,结果是B-D-E-F-D-B-G-C-A。 综上所述,按中序遍历的方式遍历该二叉树的结果是B-A-D-E-F-C-G,按后序遍历的方式遍历该二叉树的结果是B-D-E-F-D-B-G-C-A。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值