2016-2017 National Taiwan University World Final Team Selection Contest

A - Hacker Cups and Balls

Gym - 101234A

题意:给出一个长度为n(n为奇数,1 \leq n \leq 99999)的数组,给出m个操作,0 \leq m \leq 10^5,每一个操作包含一个l_{i}r_{i},如果给出的l_{i} < r_{i},那么将这段排序成递增,如果l_{i} > r_{i},将这段排序成递减。最后输出数组最中间的那个数字。
思路

二分答案k,记\leq k的数为0,> k的数为1,那么区间排序就是把区间中的0和1提取出来然后再按顺序刷回去,用一个支持区间赋值区间求和的线段树维护即可,最后求出\lfloor \frac{n+1}{2} \rfloor处的值,若为0则k可能更小,否则必须更大,复杂度O(n\log^2n)
saltyfish/2016-2017 National Taiwan University World Final Team Selection Contest

B - Bored Dreamoon

Gym - 101234B

C - Crazy Dreamoon

Gym - 101234C

题意:一个 2000 * 2000 的格子,输入n条线段,求被触碰到的格子的数量。
思路:按照线段斜率模拟。若k==1k==-1,触格正好在斜对角上;若0 < k < 1或者-1 < k < 0,触及到的格子都是在线段的左、右,左、右,向上延伸的,如果是k > 1或者k < -1,触及到的格子都是在线段的上、下,上、下,向上延伸的,对于中间有某个点正好卡在整数坐标上,就直接continue。注意函数每次的变化值就是+k。
AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define eps 1e-8
using namespace std;
const int maxn = 2000 + 100;
bool mark[maxn][maxn];
int n, cnt;

void solve(double x1, double y1, double x2, double y2) {
    double k = (y2 - y1) / (x2 - x1);
    if( fabs(k-1) < eps ) {
        int st = (int)x1, ed = (int)x2, sty = (int)y1;
        for(int i = st; i < ed; ++i) {
            if(!mark[i][sty]) {
                mark[i][sty] = true;
                ++cnt;
            }
            ++sty;
        }
    }
    else if( fabs(k+1) < eps ) {
        int st = (int)x1, ed = (int)x2, sty = (int)y1 - 1;
        for(int i = st; i < ed; ++i) {
            if(!mark[i][sty]) {
                mark[i][sty] = true;
                ++cnt;
            }
            --sty;
        }
    }
    else if( k > 0 && k < 1 ) {  // left & right
        int st = (int)x1 + 1, ed = (int)x2;
        double d = y1;
        for(int i = st; i < ed; ++i) {
            d += k;
            int d1 = (int)d, d2 = (int)d + 1;
            if(fabs(d1 - d) < eps || fabs(d2 - d) < eps)
                continue;
            if(!mark[i-1][d1]) {
                mark[i-1][d1] = true;
                ++cnt;
            }
            if(!mark[i][d1]) {
                mark[i][d1] = true;
                ++cnt;
            }
        }
    }
    else if( k < 0 && k > -1 ) {  // left & right
        int st = (int)x1 + 1, ed = (int)x2;
        double d = y1;
        for(int i = st; i < ed; ++i) {
            d += k;
            int d1 = (int)d, d2 = (int)d + 1;
            if(fabs(d1 - d) < eps || fabs(d2 - d) < eps)
                continue;
            if(!mark[i-1][d1]) {
                mark[i-1][d1] = true;
                ++cnt;
            }
            if(!mark[i][d1]) {
                mark[i][d1] = true;
                ++cnt;
            }
        }
    }
    else if(k > 1){  // up & down
        double kk = (x2 - x1) / (y2 - y1);
        int st = (int)y1 + 1, ed = (int)y2;
        double d = x1;
        for(int i = st; i < ed; ++i) {
            d += kk;
            int d1 = (int)d, d2 = (int)d + 1;
            if(fabs(d1 - d) < eps || fabs(d2 - d) < eps)
                continue;
            if(!mark[d1][i-1]) {
                mark[d1][i-1] = true;
                ++cnt;
            }
            if(!mark[d1][i]) {
                mark[d1][i] = true;
                ++cnt;
            }
        }
    }
    else if(k < -1){  // up & down
        double kk = (x2 - x1) / (y2 - y1);
        int st = (int)y1 - 1, ed = (int)y2, b = (int)x1;
        double d = x1;
        for(int i = st; i > ed; --i) {
            d -= kk;
            int d1 = (int)d, d2 = (int)d + 1;
            if(fabs(d1 - d) < eps || fabs(d2 - d) < eps)
                continue;
            if(!mark[d1][i-1]) {
                mark[d1][i-1] = true;
                ++cnt;
            }
            if(!mark[d1][i]) {
                mark[d1][i] = true;
                ++cnt;
            }
        }
    }
}


int main() {
    double x1, y1, x2, y2;
    cnt = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) {
        scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
        if(fabs(x1-x2) < eps || fabs(y1-y2) < eps)
            continue;
        if(x1 > x2) {
            swap(x1, x2);
            swap(y1, y2);
        }
        solve(x1, y1, x2, y2);
    }
    printf("%d\n", cnt);
    return 0;
}

D - Forest Game

Gym - 101234D

E - Lines Game

Gym - 101234E
题意:给出n (1 ≤ N ≤ 10^5) 个线段和权值,给出第一行p_{i},表示第i个线段为(0, i)(1, p_{i})的连线,第二行为线段对应的权值v_{i}。现在要把这些线段删掉,删一个线段的同时可以把与它相交的所有线段都删掉,但花费仅是这一条线段的权值。求最小花费。
思路:判断线段相交/不相交的条件非常简单,若i_{1} > i_{2}p_{i_{1}} > p_{i_{2}} 或者 i_{1} < i_{2}p_{i_{1}} < p_{i_{2}} ,那么两条线段必然不相交。然后按照贪心的取法,尽量去取权值小的。但是存储和查找相交线段的复杂度比较不可观,这样的思路无法实现。

F - Lonely Dreamoon 2

Gym - 101234F

G - Dreamoon and NightMarket

Gym - 101234G

题意:主人公去吃饭,现在有N种价值的食物(2 ≤ N ≤ 2 × 10 ^ 5),他每天都要吃与之前不同且最便宜的组合,问第K(1 ≤ K ≤ min (10 ^ 6, 2 ^ N −1) )天他花了多少钱。
思路:我理解的是01背包k优解?
听说有的队伍优先队列过的

H - Split Game

Gym - 101234H

I - Tree Game

Gym - 101234I

J - Zero Game

Gym - 101234J
题意:给出一个由0、1组成的串,现在允许你进行Q种操作,每种操作可以进行K_{i}步,每次操作可以随意挑一个数字移动位置。问操作后能够得到的最长的连续的0串有多长。

思路:单调队列

枚举答案中最左边0的位置,对应的方案应该是删除该位置右侧的连续若干段1,设delta=删除1后加入的0的个数-删除的1的个数,问题便转化为维护delta的最大值,用一个单调队列即可

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

推荐阅读更多精彩内容

  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    十里江城阅读 1,182评论 0 1
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,739评论 2 9
  • A - Artwork Gym - 101550A题意:给一个n*m的格子,进行q(1 ≤ q ≤ 1e4)次涂色...
    JinxiSui阅读 540评论 0 0
  • 还记得马丁路德金的梦想么? 自由 人们看起来越来越自由了 人们有了更多的选择 也在追求更多更好的选择 可自由又太过...
    简文随感阅读 424评论 0 0
  • 望着河边那极美且窈窕的身段,后者充满爱的目光呆滞地停留在辛南美艳的面容,那长长的绸缎环绕其周身宛如不天上那食...
    乐乐_6c2a阅读 146评论 0 1