Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 训练补题
  • Codeforces 刷题计划
  • 概率dp练习
  • dp专题练习
  • 数论练习
  • 搜索专题练习
  • 图论练习
  • 基础字符串练习
  • AtCoder练习
  • 题解们
  • solutions

  • 训练补题

    • 训练补题-个人1
    • 训练补题-个人10
    • 训练补题-个人2
      • GukiZ and GukiZiana (Codeforces 551E)
      • 10-20-30 (UVA 246)
      • Cutting a Painted Polygon (URAL 1181)
    • 训练补题-个人5
    • 训练补题-个人6
    • 训练补题-个人8
    • 训练补题-个人9
    • 训练补题-牛客训练赛1
    • 训练补题-牛客训练赛10
    • 训练补题-牛客训练赛2
    • 训练补题-牛客训练赛3
    • 训练补题-牛客训练赛6
    • 训练补题-牛客训练赛6
    • 训练补题-牛客训练赛7
    • 训练补题-牛客训练赛8
    • 训练补题-牛客训练赛9
    • 训练补题-杭电多校10
    • 训练补题-杭电多校2
    • 训练补题-杭电多校3
    • 训练补题-杭电多校6
    • 训练补题-杭电多校9
    • NWERC 2018-训练补题11
    • SpbKOSHP 19-训练补题12
    • Gym102576-训练补题13
    • GCPC2018-训练补题14
    • Gym102202-训练补题15

训练补题-个人2

  • auto-gen TOC: {:toc}

# 个人排位赛2补题记录

8tPfAK.jpg

# GukiZ and GukiZiana (Codeforces 551E)

分块的代码写出来了,结果疯狂Wa3。

赛后去Cf看Testcase 3,检查后找到了出错的地方(找不同?)

// 错误代码
for(int j=belong[le]+1; j<belong[ri] - 1; j++) {
    lazy[j] = min(lazy[j] + x, maxv);
}
// 修正后代码
for(int j=belong[le]+1; j<=belong[ri]- 1; j++) {
    lazy[j] = min(lazy[j] + x, maxv);
}
1
2
3
4
5
6
7
8

然后......就过了

8fOnxA.png

查错能力有待提高

# 10-20-30 (UVA 246)

两个要点

  1. 输出要求中,"Win"与其他两个状态的格式不同!
  2. 当发现了第iii种特等组合后,要重新从第一种开始判断

AC代码

#include <bits/stdc++.h>
#define Android ios::sync_with_stdio(false), cin.tie(NULL)
using namespace std;

vector<deque<int> > deck;
set<vector<deque<int> > > hsh;

const int pattern[][3] = { {0, 1, -1}, {0, -2, -1}, {-3, -2, -1} };

bool check(int p, int ptr){
    int sum = 0, sz = deck[ptr].size();
    if(sz < 3) return false;
    for(int i=0, pos; i<3; i++){
        pos = pattern[p][i]>=0?pattern[p][i]:sz+pattern[p][i];
        sum += deck[ptr][pos];
    }
    if(sum % 10 == 0){
        for(int i=0, pos; i<3; i++){
            pos = pattern[p][i]>=0?pattern[p][i]:sz+pattern[p][i];
            deck[7].push_back(deck[ptr][pos]);
        }
        for(int i=0; i<3; i++){
            pattern[p][i] >= 0 ? deck[ptr].pop_front() : deck[ptr].pop_back();
        }
        return true;
    }
    return false;
}

void solve(){
    int ans = 7, state = 2, ptr = 0;
    while(!deck[7].empty()){
        if(deck[7].size() == 52){
            state = 0;
            break;
        }
        
        if(hsh.find(deck) != hsh.end()) {
            state = 1;
            break;
        }
        hsh.insert(deck);
        
        while(deck[ptr].size() == 0) ptr = (ptr + 1) % 7;

        ans++;
        deck[ptr].push_back(deck[7].front());
        deck[7].pop_front();

        bool flag = true;
        while(flag){
            flag = false;
            for(int i=0; i<3 && !flag; i++) flag |= check(i, ptr);
        }
        ptr = (ptr + 1) % 7;
    }
    
    if(state == 0) cout << "Win : " << ans << '\n';
    if(state == 1) cout << "Draw: " << ans << '\n';
    if(state == 2) cout << "Loss: " << ans << '\n';
}

signed main(){
    Android;
    while(true){
        hsh.clear();
        deck.resize(8);
        for(int i=0; i<8; i++) deck[i].clear();

        int tmp; cin >> tmp;
        if(tmp == 0) break;
        deck[0].push_back(tmp);
        for(int i=1; i<7; i++){
            cin >> tmp;
            deck[i].push_back(tmp);
        }
        for(int i=0; i<52-7; i++){
            cin >> tmp;
            deck[7].push_back(tmp);
        }
        solve();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

# Cutting a Painted Polygon (URAL 1181)

可知题目一定有解

否则必定可以找到连续三个点,他们的颜色互不相同

然后把这三个点连成三角形,变成n-1的问题,重复步骤

要注意一个特例:某个颜色只剩下一个点


当然,也可以用分治+回溯的方法做

上次更新: 2021/02/24, 03:37:30
训练补题-个人10
训练补题-个人5

← 训练补题-个人10 训练补题-个人5→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式