North American Invitational Programming Contest 2018

A - Cut It Out!

Kattis - cutitout

B - Double Clique

Kattis - doubleclique

C - Flashing Fluorescents

Kattis - flashingfluorescents

D - Missing Gnomes

Kattis - missinggnomes

题意:按一定顺序给出m个数字,求n的全排列中字典序最小且满足顺序m的排列。
思路:直接模拟即可
AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 1e5+5;
int already[maxn];
bool mark[maxn];

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; ++i) {
        scanf("%d", &already[i]);
        mark[already[i]] = true;
    }
    int tot = 1;
    for(int i = 0; i < m; ++i) {
        while(tot < already[i]) {
            while(mark[tot]) {
                ++tot;
            }
            if(tot < already[i]) {
                printf("%d\n", tot);
                ++tot;
            }
        }
        printf("%d\n", already[i]);
    }
    while(tot <= n) {
        if(!mark[tot])
            printf("%d\n", tot);
        ++tot;
    }
    return 0;
}

E - Prefix Free Code

Kattis - prefixfreecode

F - Probe Droids

Kattis - probedroids

题意:一个n * m(1\leq n,m\leq10^6)的区域,左下角是一个炮台,炮台的初始朝向是x轴正方向,然后炮台沿逆时针旋转并依次发炮,给出q(1\leq q \leq 100)个质询,输出第 i 个被打中的位置的坐标。
\begin{matrix} \bowtie & \bowtie & \bowtie & \bowtie & \bowtie \\ \bowtie & \bowtie & \bowtie & \bowtie & \bowtie \\ \odot \mkern -14mu= & \bowtie & \bowtie & \bowtie & \bowtie \end{matrix}
思路:一开始本来想按照斜率排序,若在相同斜率上就按照与炮台距离从近到远排序。可是给出的n * m个坐标,算下来的话应该是1e12的复杂度,给了6s也是肯定不够的。

G - Rainbow Graph

Kattis - rainbowgraph
题意:给出一个n个点,m条边的无向图,但是这个图比较特殊的是每条边有颜色:R(red) G(green) B(blue), Roy和Biv是色盲,Roy看不到R(red),Biv看不到B(blue),但是他们都能看到G(green),现在他们想知道,在这个无向图中选取1~m条路,他们能否看到这个图是连通的(任意两点间可达),若不连通,输出0,若连通,输出当前选择的k条路的权值之和。
思路

H - Recovery

Kattis - recovery
题意:第一行为每行1的个数的奇偶性,第二行为每列1的个数的奇偶性,(1代表奇,0代表偶)。要求既满足,且1尽量多,且由每一行拼接成的二进制代表的数字尽量的小。若构造不出来,则输出-1。
思路:模拟,先构造出全为1的矩阵,根据行列给出的形式模拟,0尽量的往左上角放。
AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 55;
char str[maxn], ptr[maxn];
int n, m, num[maxn][maxn];

int main()
{
    scanf("%s %s", str, ptr);
    n = strlen(str);
    m = strlen(ptr);
    int numx = 0, numy = 0;
    for(int i = 0; i < n; ++i) {
        if((str[i] - '0') % 2 != m % 2)
            ++numx;
    }
    for(int i = 0; i < m; ++i) {
        if((ptr[i] - '0') % 2 != n % 2)
            ++numy;
    }
    if(numx % 2 != numy % 2) {
        printf("-1\n");
        return 0;
    }
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            num[i][j] = 1;
        }
    }
    if(numx >= numy) {
        for(int i = n - 1; i >= 0; --i) {
            if((str[i] - '0') % 2 != m % 2) {
                num[i][0] = 0;
            }
        }
        for(int i = m - 1; i > 0; --i) {
            if((ptr[i] - '0') % 2 != n % 2) {
                for(int j = n - 1; j >= 0; --j) {
                    if(num[j][0] == 0) {
                        swap(num[j][0], num[j][i]);
                        break;
                    }
                }
            }
        }
    }
    else {
        for(int i = m - 1; i >= 0; --i) {
            if((ptr[i] - '0') % 2 != n % 2) {
                num[0][i] = 0;
            }
        }
        for(int i = n - 1; i > 0; --i) {
            if((str[i] - '0') % 2 != m % 2) {
                for(int j = m - 1; j >= 0; --j) {
                    if(num[0][j] == 0) {
                        swap(num[0][j], num[i][j]);
                        break;
                    }
                }
            }
        }
    }
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            printf("%d", num[i][j]);
        }
        printf("\n");
    }
    return 0;
}

I - Red Black Tree

Kattis - redblacktree

题意:给出一棵树,这棵树有n个点,其中m个点为红色的。
现在给出n-1行分别是标号为2~n的点的父亲节点的编号,再给出m行为红色的点的标号,现在要选一个集合,这个集合里有且仅有k个红色节点,且集合内任意两点间不存在祖先关系,问要组成有0,1,2,...,k个红色节点的集合分别有多少种选法。

J - Winter Festival

Kattis - winterfestival

K - Zoning Houses

Kattis - zoninghouses

题意:给出n个坐标和q个质询,坐标一次标号为1~n,每次质询分别是区间l, r。现在要把区间l到r之间的坐标全部用一个边长为x的正方形框住,你可以选择忽悠至多一个坐标,问这个正方形边长最小为多少。
思路:若删除一个点,则最优方案下一定是删除x或者y坐标最小或者最大的4个点之一,用线段树维护即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容