Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)

题目链接:https://codeforces.com/contest/1305

A - Kuroni and the Gifts

诚心诚意的签到题。

B - Kuroni and Simple Strings

题意:给一个括号串s。定义一个括号串是“简单括号串”,当且仅当其是"(((..("+")))...)"的形式,且前后两部分的长度相等。每次操作可以从括号串s中选择一个子序列,要求这个子序列是一个简单括号串,然后把整个子序列从s中删除。要求使用尽可能少的操作使得无法再操作。

题解:假如某个‘(‘的右边还有‘)‘,那么显然还可以继续操作。假如每次只能消除一对‘(‘和‘)‘,那么消除最左侧的‘(‘和最右侧的‘)‘是最好的,根据这个思路可以依次把最左和最右的括号匹配掉,当两边指针相遇之后就不会再有匹配的括号了。

char s[1005];
int ans[1005], atop;

void test_case() {
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    int firstleft = -1, firstright = -1;
    for(int i = 1; i <= n; ++i) {
        if(s[i] == '(') {
            firstleft = i;
            break;
        }
    }
    if(firstleft == -1) {
        puts("0");
        return;
    }
    for(int i = firstleft + 1; i <= n; ++i) {
        if(s[i] == ')') {
            firstright = i;
            break;
        }
    }
    if(firstright == -1) {
        puts("0");
        return;
    }
    puts("1");
    int L = 1, R = n;
    atop = 0;
    while(L <= R) {
        if(s[L] == ')') {
            ++L;
            continue;
        }
        if(s[R] == '(') {
            --R;
            continue;
        }
        assert(L < R && s[L] == '(' && s[R] == ')');
        ans[++atop] = L;
        ans[++atop] = R;
        ++L;
        --R;
    }
    sort(ans + 1, ans + 1 + atop);
    printf("%d\n", atop);
    for(int i = 1; i <= atop; ++i)
        printf("%d%c", ans[i], " \n"[i == atop]);
}

C - Kuroni and Impossible Calculation

题意:给一个n(<=2e5)个非负整数的序列,以及正整数m(<=1000),求 \(\prod_{1\leq i < j \leq n} |a_i-a_j| \mod m\) 的值。

题解:由于m比较小,所以有一些暴力的做法。假如n>=m+1,那么根据鸽巢原理答案就是0,否则n也会很小。n很小直接n^2计算即可。注意 \(|a-b|\mod m \neq |a \mod m - b \mod m|\) ,这个要分类讨论。

int n, m;
int a[200005];

void test_case() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    if(n >= m + 1) {
        puts("0");
        return;
    }
    sort(a + 1, a + 1 + n);
    ll res = 1;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j < i; ++j) {
            res *= a[i] - a[j];
            if(res >= m)
                res %= m;
        }
    }
    printf("%lld\n", res);
}

D - Kuroni and the Celebration

题意:给一棵n个节点的有根树,但是根未知,然后每次询问一对(u,v),评测机返回他们的LCA。使用不超过 \(\lfloor \frac{n}{2} \rfloor\) 次询问确定根的编号。

题解:可以观察出,每次询问两个点(u,v),记得到的LCA为w。那么从w向u走和从w向v走的整棵子树都没用了。但是假如w是u和v其中之一,则只能去掉一棵子树,在极端情况下这棵子树只拥有一个节点,这样会导致询问超限。假如每次选的u和v都是叶子,那么w是u和v其中之一的情况,就可以立即确定其是根,否则一定可以去掉至少两个节点。也就是说一次询问至少去掉两个节点。易知最后的边界,会是一棵2个节点的树或者1个节点的树,假如把度数<=1的都叫做叶子,那么有可能会把1个节点的树的这个节点入队两次,把这个情况去掉,或者规定度数=1的才是叶子。

int n, rt;
set<int> G[1005];
int vis[1005];

queue<int> leaf;

int ask(int u, int v) {
    printf("? %d %d\n", u, v);
    fflush(stdout);
    int w;
    scanf("%d", &w);
    if(w == u || w == v) {
        printf("! %d", w);
        fflush(stdout);
        exit(0);
    }
    return w;
}

void test_case() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n - 1; ++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        G[u].insert(v);
        G[v].insert(u);
    }
    for(int i = 1; i <= n; ++i) {
        if(G[i].size() <= 1) {
            leaf.push(i);
            vis[i] = 1;
        }
    }
    while(leaf.size() >= 2) {
        int u = leaf.front();
        leaf.pop();
        int v = leaf.front();
        leaf.pop();
        int w = ask(u, v);
        for(auto &eu : G[u]) {
            G[eu].erase(u);
            if(vis[eu] == 0 && G[eu].size() <= 1) {
                leaf.push(eu);
                vis[eu] = 1;
            }
        }
        for(auto &ev : G[v]) {
            G[ev].erase(v);
            if(vis[ev] == 0 && G[ev].size() <= 1) {
                leaf.push(ev);
                vis[ev] = 1;
            }
        }
    }
    assert(leaf.size() == 1);
    int r = leaf.front();
    printf("! %d", r);
    fflush(stdout);
    exit(0);
}

E - Kuroni and the Score Distribution

显然123456...x这样构造可以获得最大的平衡度,易知用完5000个数的平衡度都不会超过5000*5000。不少于m个平衡度是很好做的,但是比赛的时候不知道怎么弄到恰好m个平衡度,其实只需要调节最后一个x的大小,很明显x每增加1就会失去一个平衡度。这样总是有一个位置是刚刚好的,大概这最后一个数会在10000附近。假如还有剩下的数,就从1e6开始,每隔20000放一个就可以了。

F

有没有确定性的做法?

原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12406247.html

时间: 2024-11-05 14:53:50

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)的相关文章

[Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated]-E. Kuroni and the Score Distribution(构造)

[Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated]-E. Kuroni and the Score Distribution(构造) Kuroni is the coordinator of the next Mathforces round written by the "Proof by AC" team. All the preparation has been done, and he is discussing with the

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!).Kuroni and Impossible Calculation

http://codeforces.com/contest/1305题目链接 昨晚想了一个半小时愣是没想出来,惭愧: 发个博客记录一下: 一看题数据有点大,想到暴力肯定不行,于是开始想dp: 后面发现也不行就开始推数学式子.最后十分钟推出来可以用范德蒙行列式求解,但是没打上去. 今天看了正解发现果然还是得暴力,不过要加一个限制条件 当 n>mod 的时候,结果一定是0 这时数据量就缩小到三位数了. 为什么呢,因为鸽巢原理, n>mod的时候 必定存在 a%mod=b%mod =>|a-b

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)E(构造)

从1~n构造显然平衡数最大,先尽可能1~i构造,再补一个数填平或者不补,再用大数把数字补全. 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[5007]; 5 int main(){ 6 ios::sync_with_stdio(false); 7 cin.tie(NULL); 8 cout.tie(NULL); 9 int n,m; 10 cin>>n&

Ozon Tech Challenge 2020 游戏存档

(cf 即某大型线上游戏 (指比赛经历 0:02 A 是个送分题,秒了 0:04 B 不是挺傻的吗,我怎么 RE 了啊 0:12 我怎么调用错数组了啊,终于过了 0:15 C 是个送分题,wa*1 0:16 我怎么又不开 long long 啊 /dk 0:20 这 D 好难啊,自闭了 0:30 原来我知道树长什么样子的啊,那不是很 naive 0:36 T 了一发就过了 0:54 这 E 怎么这么简单啊,一下就过了. 回去看了一下榜,发现排名还挺靠前,感觉很有希望. 与此同时 Alan_zho

[CodeForces] Ozon Tech Challenge 2020

A.Kuroni and the Gifts 题意:两个长度为\(n\)的数列,每个数字都不相同,求一种排列方式,使\(a_i+b_i\)和均不相等. 题解:因为每一个\(a_i\)和\(b_i\)都不相同,我们可以对于\(a\)和\(b\)序列排个序,那么显然\(a_{i-1} + b_{i-1} < a_i + b_i\),从而也就保证了\(a_i+b_i\)和均不相等. B.Kuroni and Simple Strings 题意:括号序列\(S\), 每次可以删去\((), (()),

div嵌套div 背景图片 不显示的问题

这几天 在做一个小Demo的时候碰到了如上的问题,一个DIV嵌套多个DIV时,父容器DIV不显示背景图片.同时结合之前碰到类似的问题,我归纳了如下几个解决方法: 1.就是常见的 子div 背景把父div的背景给盖住了,例子: 该例子就是 我有一个父div 和它里面嵌套的一个子div,两个div的宽度和高度大小是一样的,其中父div的背景图片就是上面这张图片(箭头部分是透明的),子div的背景图片是那种渐变灰色图片,其实懂英语的人应该看出来了就是,我想实现一个那种类似于iphone滑动那种灯光从

div 属性 DIV标签属性有什么如何设置属性

div 属性 DIV标签属性有什么如何设置属性(音乐放松椅) div 属性介绍,对DIV可加属性有哪些,DIV属性一览表DIVCSS5整理 DIVCSS5给大家整理DIV标签内常用属性,同时通过div各属性小实例,让大家认识各属性并掌握属性. div标签内常用属性列表 1.style 设置css样式(扩展了解style标签) 2.align 设置div盒子内的内容居中.居左.居右 3.id 引人外部对应#(井号)选择符号样式 4.class 引人外部对应.(句号)选择符号样式 5.title 设

DIV布局-DIV高度不同自动换行并对齐《转》

每个div框内容有多有少,要支持div高度自适应,还要添加的div自动追加,并且换行还要保持每行对齐. 刚开始的效果: 给出了完美解决方案: 效果: 因为要支持每个div可删除,删除后,后面的div自动补齐,所以用table不显示(除非想自虐的人可以试下) 最终就是css修改了一下就搞定了... 1 <html> 2 <head> 3 <style> 4 .test_area{ 5 width:100%; 6 background-color:#FFFFFF; 7 mi

xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 1 <div class="dyleft">左栏固定宽度为200px</div> 2 <div class="dyright">右栏固定宽度为200px</div> 3 <div class="dycenter">中间自适应宽度</div> 2.cs