码迷,mamicode.com
首页 > 其他好文 > 详细

2018-2019 Russia Open High School Programming Contest (Unrated, Online Mirror, ICPC Rules, Teams Preferred)

时间:2018-12-10 11:42:33      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:ted   ima   contest   can   break   for   red   team   数组   

(占坑)

A. Company Merging

签到题

B. LaTeX Expert

模拟

D. Similar Arrays

题意:构造两个长为 \(n\) 的数组 \(a,b\),元素取值范围是 \([1,n]\)\(a\) 中的数互不相同,\(b\) 中至少有一对相同的数,给出一些形如 \((x,y)\) 的限制,要满足 \((a[x]<a[y])==(b[x]<b[y])\)

取两个没有边相连的位置填上一对差值为 \(1\) 的数,然后其它的位置随便填,这样就构造出了 \(a\) 数组,\(b\) 数组再把那两个位置变成同一个数即可。

#include <cstdio>
#include <vector>

const int N = 100005;
int n, m, a[N], f[N], x;
std::vector<int> G[N];

int main() {
    scanf("%d%d", &n, &m);
    if (m == n * (n - 1) / 2) { puts("NO"); return 0; }
    for (int i = 1, a, b; i <= m; ++i) {
        scanf("%d%d", &a, &b), G[a].push_back(b), G[b].push_back(a);
    }
    for (int i = 1; i <= n; ++i) {
        if (G[i].size() == n - 1) continue;
        int m  = G[i].size();
        for (int j = 0; j < m; ++j) f[G[i][j]] = 1;
        for (int j = 1; j <= n; ++j)
            if (!f[j] && i != j) {
                x = j, a[i] = 1, a[j] = 2; break;
            }
        break;
    }
    for (int i = 1, j = 2; i <= n; ++i)
        if (!a[i]) a[i] = ++j;
    puts("YES");
    for (int i = 1; i <= n; ++i) printf("%d ", a[i]);
    puts(""); a[x] = 1;
    for (int i = 1; i <= n; ++i) printf("%d ", a[i]);
    return 0;
}

I. Minimal Product

题意:给出一个序列,找出两个位置 \(i,j\) 满足 \(i<j\)\(a[i]<a[j]\),使得 \(a[i]·a[j]\) 最小。

对于正数,直接取它前面的最小值相乘更新即可;对于负数,维护一个递减的单调栈,插入负数 \(x\) 时把单调栈中小于 \(x\) 的数全弹掉,因为如果后面要用到这些数,则后面的数一定是小于等于 \(x\) 的,一个小于等于 \(x\) 的数乘负数 \(y\) 一定不如 \(x\) 乘负数 \(y\) 更优。

学会了用 \(unsigned\ int\) 自然溢出对 \(2^{32}\) 取模,以及不需要 \(\text{&} 4294967295\) !!!

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 2e7+5;
const long long INF = 9223372036854775807LL;
long long a[N], sta[N], top, T, n, l, r, mn, ans;
unsigned int b[N], x, y, z;

int main() {
    scanf("%d", &T);
    while (T--) {
        mn = ans = INF, top = 0;
        cin >> n >> l >> r >> x >> y >> z >> b[1] >> b[2];
        for (int i = 3; i <= n; ++i) b[i] = b[i-2] * x + b[i-1] * y + z;
        for (int i = 1; i <= n; ++i) {
            a[i] = b[i] % (r - l + 1) + l;
            if (a[i] >= 0) {
                if (mn < a[i]) ans = std::min(ans, mn * a[i]);
                mn = std::min(mn, a[i]);
                continue;
            }
            mn = std::min(mn, a[i]);
            while (top && sta[top] < a[i])
                ans = std::min(ans, sta[top] * a[i]), --top;
            sta[++top] = a[i];
        }
        if (ans == INF) puts("IMPOSSIBLE");
        else cout << ans << endl;
    }
    return 0;
}

M. The Pleasant Walk

签到题

2018-2019 Russia Open High School Programming Contest (Unrated, Online Mirror, ICPC Rules, Teams Preferred)

标签:ted   ima   contest   can   break   for   red   team   数组   

原文地址:https://www.cnblogs.com/fly-in-milkyway/p/10094649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!