排位賽 13 題解

排位賽 13 題解

題型

  • A - 貪心 √
  • B - 后綴數(shù)組 √
  • C - 環(huán)形DP
  • D - 二維樹狀數(shù)組/二維線段樹 √
  • E - DFS找連通塊 √
  • F - 快速傅里葉變換(FFT)
  • G - DFS/二分 √
  • H - 最小比率生成樹/二分/迭代

A - domino

題意

給出放骨牌位置之間的距離遮怜,和可以推骨牌的次數(shù),求最少的骨牌高度和嚎幸。

思路

貪心才顿。統(tǒng)計(jì)只推一次所需要的骨牌高度惹想,然后排序,減去最高高度即可。

代碼

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
//#define LOCAL
#define LL __int64 // 1e5*1e5會(huì)爆int

const int maxn = 1e5+7;
int h[maxn];

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    int t; scanf("%d", &t);
    while (t--) {
        int n, k;
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n-1; ++i)
            scanf("%d", h+i);
        sort(h, h+n-1);
        LL ans = 0;
        for (int i = 0; i < n-k; ++i)
            ans += h[i];
        ans += n;
        printf("%I64d\n", ans);
    }
    return 0;
}

B - Sequence

題意

給出一個(gè)數(shù)字串裤翩,將其分為三段拳亿,每段都翻轉(zhuǎn)過來晴股,求可以得到的字典序最小的串。

思路

后綴數(shù)組》慰現(xiàn)學(xué)現(xiàn)賣系列电湘。本來用貪心法,結(jié)果發(fā)現(xiàn)不能過鹅经,翻了大白書才發(fā)現(xiàn)是后綴數(shù)組寂呛。先將整個(gè)數(shù)列翻轉(zhuǎn)過來求SA,然后找到第一個(gè)位置不在最后兩個(gè)的后綴瘾晃,作為一個(gè)的指針位置贷痪。然后求第二個(gè)指針位置。這里要注意一點(diǎn)酗捌,要將后面的串復(fù)制一遍然后求后綴數(shù)組呢诬。

代碼

\\用的不是正統(tǒng)倍增法,而是用sort簡(jiǎn)化了
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LOCAL

const int maxn = 200000+107;
int n, num[maxn], rev_num[maxn], k;
int rank[maxn], temp[maxn], sa[maxn];

bool cmp(int i, int j) {
    if (rank[i] != rank[j]) return rank[i] < rank[j];
    int x = i+k<=n?rank[i+k]:-1;
    int y = j+k<=n?rank[j+k]:-1;
    return x < y;
}

void get_sa(int a[], int m) {
    for (int i = 0; i <= m; ++i) {
        sa[i] = i;
        rank[i] = i<n? a[i] : -1;
    }
    for (k = 1; k <= n; k<<=1) {
        sort(sa, sa+m+1, cmp);
        temp[sa[0]] = 0;
        for (int i = 1; i <= m; ++i)
            temp[sa[i]] = temp[sa[i-1]] + (cmp(sa[i-1], sa[i])?1:0);
        for (int i = 0; i <= n; ++i)
            rank[i] = temp[i];
    }
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", num+i);
    reverse_copy(num, num+n, rev_num);
    get_sa(rev_num, n);
    int cur1;
    for (int i = 0; i <= n; ++i) {
        cur1 = n - sa[i];
        if (cur1 >= 1 && n-cur1 >= 2) break;
    }
    int m = n - cur1;
    reverse_copy(num+cur1, num+n, rev_num);
    reverse_copy(num+cur1, num+n, rev_num+m);
    get_sa(rev_num, m*2);
    int cur2;
    for (int i = 0; i <= m*2; ++i) {
        cur2 = n - sa[i];
        if (cur2-cur1 >= 1 && n-cur2 >= 1) break;
    }
    reverse(num, num+cur1);
    reverse(num+cur1, num+cur2);
    reverse(num+cur2, num+n);
    for (int i = 0; i < n; ++i)
        printf("%d\n", num[i]);
    return 0;
}

D - Matrix

題意

有一個(gè)$n\times n$的01矩陣胖缤,有兩種操作尚镰,一種是將一個(gè)矩形內(nèi)的元素全部異或1,另一種是單點(diǎn)查詢哪廓。要求實(shí)現(xiàn)這些操作狗唉。

思路

關(guān)于樹狀數(shù)組區(qū)間染色,有一篇論文可以看——《淺談信息學(xué)競(jìng)賽中的“0”和“1”》涡真。其中第一塊就用到了這個(gè)例題分俯。只要對(duì)區(qū)間邊緣的點(diǎn)更新,就能記錄區(qū)間染色的次數(shù)哆料,然后區(qū)間求前綴和就能得到染色了多少次缸剪,得到答案。

很菜的是东亦,有二重循環(huán)的bug調(diào)了一個(gè)小時(shí)才過杏节。

代碼

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e3+7;

int n, tree[maxn][maxn];

int lowbit(int x) {
    return x&(-x);
}

void add(int x, int y) {
    for (int i = x; i <= n; i += lowbit(i))
    for (int j = y; j <= n; j += lowbit(j))
        ++tree[i][j];
}

int query(int x, int y) {
    int rt = 0;
    for (int i = x; i; i -= lowbit(i))
    for (int j = y; j; j -= lowbit(j))
        rt += tree[i][j];
    return rt;
}

void solve() {
    char ins[2]; int t;
    scanf("%d%d", &n, &t);
    memset(tree, 0, sizeof tree);
    while (t--) {
        scanf("%s", ins);
        if (ins[0] == 'C') {
            int x1, y1, x2, y2;
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            add(x1, y1); add(x1, y2+1);
            add(x2+1, y1); add(x2+1, y2+1);
        }
        else {
            int x, y; scanf("%d%d", &x, &y);
            printf("%d\n", query(x, y)&1);
        }
    }
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    int t; scanf("%d", &t);
    while (t--) solve();
    return 0;
}

E - PaintBall

題意

一張1000*1000的圖上有n個(gè)圓形障礙物,求是否能從最左側(cè)走到最右側(cè)。

思路

對(duì)每個(gè)障礙物縮點(diǎn)奋渔,然后從上邊界開始DFS遍歷所有相鄰的障礙物镊逝,如果遍歷到的障礙物可以接觸到下邊界就無解。遇到與左邊界相鄰的障礙物就更新入口位置嫉鲸,出口為右邊界撑蒜。

代碼

/**
 * Author: wzhzzmzzy
 * Question: UVa - 11853
 * Algorithm: DFS
**/

#include <bits/stdc++.h>
using namespace std;
//#define LOCAL

const int maxn = 1<<10;
int n, flag, vis[maxn];
double ent, exi;

struct { double x, y, r; } node[maxn];

bool check(int u, int v) {
    return hypot(node[u].x-node[v].x, node[u].y-node[v].y) < node[u].r+node[v].r;
}

int dfs(int s) {
    if (!flag) return 0;
    vis[s] = 1;
    if (node[s].y - node[s].r <= 0)
        return flag = 0;
    for (int i = 0; i < n; ++i)
        if (!vis[i] && check(s, i)) dfs(i);
    if (node[s].x - node[s].r <= 0)
        ent = min(ent, node[s].y - sqrt(node[s].r*node[s].r-node[s].x*node[s].x));
    if (node[s].x + node[s].r >= 1000)
        exi = min(exi, node[s].y - sqrt(node[s].r*node[s].r-(1000-node[s].x)*(1000-node[s].x)));
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    while (~scanf("%d", &n)) {
        memset(vis, 0, sizeof vis);
        flag = 1, ent = exi = 1000;
        for (int i = 0; i < n; ++i)
            scanf("%lf%lf%lf", &node[i].x, &node[i].y, &node[i].r);
        for (int i = 0; i < n; ++i)
            if (!vis[i] && node[i].y+node[i].r >= 1000) dfs(i);
        if (!flag) puts("IMPOSSIBLE");
        else printf("0.00 %.2f 1000.00 %.2f\n", ent, exi);
    }
    return 0;
}

G - ztr loves lucky numbers

題意

找出一個(gè)最小的大于n的由相同數(shù)量的4和7組成的數(shù)字。

思路

先DFS打表玄渗,然后二分查找座菠。

代碼

/**
 * Author: wzhzzmzzy
 * Question: HDU - 5676
 * Algorithm: 二分
**/

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
//#define LOCAL
#define LL __int64

const int maxn = 1<<21;

LL n, num[maxn];
int cur;

void dfs(int u, int v, LL w) {
    if (!u && !v) {
        num[++cur] = w;
        return;
    }
    if (u) dfs(u-1, v, w*10+4);
    if (v) dfs(u, v-1, w*10+7);
}

void solve() {
    scanf("%I64d", &n);
    if (n > 777777777444444444) {
        puts("44444444447777777777");
        return;
    }
    int l = 1, r = cur;
    LL ans;
    while (l <= r) {
        int mid = (l+r)>>1;
        if (num[mid] >= n)
            r = mid-1, ans = num[mid];
        else l = mid+1;
    }
    printf("%I64d\n", ans);
}

void init() {
    cur = 0;
    for (int i = 2; i <= 18; i+=2)
        dfs(i>>1, i>>1, 0);
    sort(num+1, num+1+cur);
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    init();
    int t; scanf("%d", &t);
    while (t--) solve();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捻爷,隨后出現(xiàn)的幾起案子辈灼,更是在濱河造成了極大的恐慌,老刑警劉巖也榄,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡莹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甜紫,警方通過查閱死者的電腦和手機(jī)降宅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囚霸,“玉大人腰根,你說我怎么就攤上這事⊥匦停” “怎么了额嘿?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劣挫。 經(jīng)常有香客問我册养,道長(zhǎng),這世上最難降的妖魔是什么压固? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任球拦,我火速辦了婚禮,結(jié)果婚禮上帐我,老公的妹妹穿的比我還像新娘坎炼。我一直安慰自己,他們只是感情好拦键,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布谣光。 她就那樣靜靜地躺著,像睡著了一般芬为。 火紅的嫁衣襯著肌膚如雪抢肛。 梳的紋絲不亂的頭發(fā)上狼钮,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天碳柱,我揣著相機(jī)與錄音捡絮,去河邊找鬼。 笑死莲镣,一個(gè)胖子當(dāng)著我的面吹牛福稳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑞侮,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼的圆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了半火?” 一聲冷哼從身側(cè)響起越妈,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钮糖,沒想到半個(gè)月后梅掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡店归,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年阎抒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消痛。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡且叁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秩伞,到底是詐尸還是另有隱情逞带,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布纱新,位于F島的核電站展氓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怒炸。R本人自食惡果不足惜带饱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阅羹。 院中可真熱鬧勺疼,春花似錦、人聲如沸捏鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽导梆。三九已至轨淌,卻和暖如春迂烁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背递鹉。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工盟步, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躏结。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓却盘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親媳拴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黄橘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,744評(píng)論 0 33
  • 歸去來兮屈溉。 1.1 說明 本篇為《挑戰(zhàn)程序設(shè)計(jì)競(jìng)賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,332評(píng)論 0 160
  • 待更新 線段樹講解(未讀)線段樹模板(未讀) 模板 求區(qū)間總和 A - 敵兵布陣 HDU - 1166 題意 線段...
    染微言閱讀 1,289評(píng)論 1 0
  • 排位賽 09 題解 A - Fox and Number Game CodeForces - 389A 題意 給出...
    染微言閱讀 409評(píng)論 0 0
  • 我經(jīng)常徘徊在孤獨(dú)的邊緣塞关,沒有緣故。 可能是孤僻在作祟子巾,就算走在熱鬧繁華的大街帆赢,心中也是空蕩蕩。 我是個(gè)孤獨(dú)的旅行者...
    薰衣草的夏季閱讀 309評(píng)論 0 3