2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
这是一场三人组队赛来的,单人带电子模板不限时单挑试一下。按照难度排序。
B - Balls of Buma
题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除,问把所有的球只用一次射击就消除的方法是多少?
题解:看起来一定要两边对称。
int n;
char s[300005];
int L[300005], R[300005], top;
void test_case() {
    top = 0;
    L[++top] = 1;
    R[top] = 1;
    for(int i = 2; i <= n; ++i) {
        if(s[i] == s[R[top]])
            R[top] = i;
        else {
            L[++top] = i;
            R[top] = i;
        }
    }
    if(!(top & 1)) {
        puts("0");
        return;
    }
    int mid = (top + 1) / 2;
    if(R[mid] == L[mid]) {
        puts("0");
        return;
    }
    for(int i = 1; i < mid; ++i) {
        if(s[R[mid - i]] != s[L[mid + i]]) {
            puts("0");
            return;
        } else {
            if(R[mid - i] - L[mid - i] + 1 + R[mid + i] - L[mid + i] + 1 < 3) {
                puts("0");
                return;
            }
        }
    }
    printf("%d\n", R[mid] - L[mid] + 1 + 1);
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        n = reads(s + 1);
        test_case();
    }
}
L - Lexicography
题意:给n*l个字母,构造n个长为l的字符串,使得字典序最小的第k个字符串的字典序最小。
题解:别看错题了,下面的解法是错的。
int n, l, k;
char s[1000005];
void test_case() {
    sort(s + 1, s + 1 + n * l);
    int cur = l + 1;
    for(int i = 1; i < k; ++i) {
        for(int j = 1; j <= l; ++j) {
            putchar(s[cur]);
            ++cur;
        }
        putchar('\n');
    }
    for(int j = 1; j <= l; ++j)
        putchar(s[j]);
    putchar('\n');
    for(int i = k + 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j) {
            putchar(s[cur]);
            ++cur;
        }
        putchar('\n');
    }
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        read(n), read(l), read(k);
        reads(s + 1);
        //puts(s + 1);
        test_case();
    }
}
int n, l, k;
char s[1000005];
char t[1005][1005];
void test_case() {
    sort(s + 1, s + 1 + n * l);
    int cur = 0;
    for(int j = 1; j <= l; ++j) {
        for(int i = 1; i <= k; ++i)
            t[i][j] = s[++cur];
        if(k == 1 || t[k][j] != t[k - 1][j]) {
            for(int tj = j + 1; tj <= l; ++tj)
                t[k][tj] = s[++cur];
            for(int ti = 1; ti < k; ++ti) {
                for(int tj = j + 1; tj <= l; ++tj)
                    t[ti][tj] = s[++cur];
            }
            break;
        }
    }
    for(int i = k + 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j)
            t[i][j] = s[++cur];
    }
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j)
            putchar(t[i][j]);
        putchar('\n');
    }
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        read(n), read(l), read(k);
        reads(s + 1);
        //puts(s + 1);
        test_case();
    }
}
但是这样填也不对,过不了这个样例:
4 4 4
abcdefabababcabc
aabc
abbd
abce
abcf
#至少应该是
aaef
abbd
abcc
abcc
不知道这样对不对?
int n, l, k;
char s[1000005];
char t[1005][1005];
void test_case() {
    sort(s + 1, s + 1 + n * l);
    int cur = 0, b = 1;
    for(int j = 1; j <= l; ++j) {
        for(int i = b; i <= k; ++i) {
            t[i][j] = s[++cur];
            if(i > 1 && t[i][j] > t[i - 1][j])
                ++b;
        }
        if(k == 1 || t[k][j] != t[k - 1][j]) {
            for(int tj = j + 1; tj <= l; ++tj)
                t[k][tj] = s[++cur];
            for(int ti = 1; ti < k; ++ti) {
                for(int tj = 1; tj <= l; ++tj)
                    if(t[ti][tj] == '\0')
                        t[ti][tj] = s[++cur];
            }
            break;
        }
    }
    for(int i = k + 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j)
            t[i][j] = s[++cur];
    }
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j)
            putchar(t[i][j]);
        putchar('\n');
    }
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        read(n), read(l), read(k);
        reads(s + 1);
        memset(t, '\0', sizeof(t));
        //puts(s + 1);
        test_case();
    }
}
还是WA29。发现应该把b++改成b=i,这样才对,因为可能会有连续几个一样的,一次跳过他们。变成WA45了,咋这么多数据呢?正式比赛可能都可以蒙混过关了。
多亏这两组样例发现了其实是有一定可能没有把其他字符串填满。
8 8 7
aaaaaaabbbbbbbbccccccccccddddddeeeeeeeffffffffgggggiiihhhhhhjjjj
8 8 2
aaaaaaabbbbbbbbccccccccccddddddeeeeeeeffffffffgggggiiihhhhhhjjjj
加油,看来单挑是有点难度,但是别怕。
int n, l, k;
char s[1000005];
char t[1005][1005];
void test_case() {
    sort(s + 1, s + 1 + n * l);
    int cur = 0, b = 1;
    for(int j = 1; j <= l; ++j) {
        for(int i = b; i <= k; ++i) {
            t[i][j] = s[++cur];
            if(i > 1 && t[i][j] > t[i - 1][j])
                b = i;
        }
        if(k == 1 || t[k][j] != t[k - 1][j]) {
            for(int tj = j + 1; tj <= l; ++tj)
                t[k][tj] = s[++cur];
            break;
        }
    }
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= l; ++j) {
            if(t[i][j] == '\0')
                t[i][j] = s[++cur];
            putchar(t[i][j]);
        }
        putchar('\n');
    }
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        read(n), read(l), read(k);
        reads(s + 1);
        memset(t, '\0', sizeof(t));
        //puts(s + 1);
        test_case();
    }
}
E - Elections
题意:有n个候选人,其中第n个你不喜欢。有m个投票站,第m个投票站投给第n个候选人的票为a_mn,关闭最少的投票站使得你不喜欢的候选人不能胜出。胜出意味着它严格大于其他[1,n-1]个候选人。
题解:貌似反过来想,要让第i个候选人大于等于第n个,只需要把最大的若干个投票站加起来。
int n, m;
int a[105][105];
pii b[105];
vector<int> ans;
void test_case() {
    ans.clear();
    for(int i = 1; i <= m; ++i)
        ans.push_back(i);
    for(int j = 1; j <= n - 1; ++j) {
        for(int i = 1; i <= m; ++i)
            b[i] = {a[i][j], i};
        sort(b + 1, b + 1 + m, greater<pii>());
        int sum = 0, cur = m;
        //cout << "j=" << j << endl;
        bool suc = 1;
        for(int i = 1; i <= m; ++i) {
            sum += b[i].first;
            //cout << "sum=" << sum << endl;
            if(sum < 0) {
                suc = 0;
                if(cur < ans.size()) {
                    ans.clear();
                    for(int ii = i; ii <= m; ++ii)
                        ans.push_back(b[ii].second);
                }
                break;
            }
            --cur;
        }
        if(suc) {
            puts("0\n");
            return;
        }
    }
    int siz = ans.size();
    printf("%d\n", siz);
    if(siz == 0) {
        puts("");
        return;
    }
    sort(ans.begin(), ans.end());
    for(int i = 0; i < siz; ++i)
        printf("%d%c", ans[i], " \n"[i == siz - 1]);
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    while(1) {
        read(n), read(m);
        for(int i = 1; i <= m; ++i) {
            for(int j = 1; j <= n; ++j)
                read(a[i][j]);
            for(int j = 1; j <= n - 1; ++j) {
                a[i][j] -= a[i][n];
                //cout << a[i][j] << " ";
            }
            //cout << endl;
        }
        test_case();
    }
}
J - Just Arrange the Icons
题意:苹果手机上面共有n个图标,第i个图标的种类是ai,给屏幕定一个图标的上限s,要求分尽可能少的屏幕,满足以下条件:1、同一个屏幕中的图标的种类相同;2、每个屏幕要么放满,要么只差一个放满
题解:不知道怎么做,想着乱搞一发没想到真过了。首先图标的种类的绝对值是无所谓的,先进行一次离散化,然后统计每种的数量,然后发现数量相同的其实是对于固定的屏幕大小是一样的,可以再合并出来,再进行一次(伪)离散化统计。问题转换为:给定k种数字xi,每种数字xi有ci个,求哪些s,可以使得xi分到大小为s或者s-1的屏幕中。发现这个是可以很容易验证的,因为至少需要(xi+s-1)/s块屏幕,只需要都放s-1的值不比xi大就是合法。
然后来个random_shuffle()再剪枝使得复杂度更加玄学。
这个复杂度本身就是对的,因为s的上限其实就是最小的数量+1,而恰好有k种数字,所以复杂度是s*k,而这个值不超过n。
int n;
int a[2000005], b[2000005];
int cnt1[2000005], cnt2[2000005];
ll ans;
void check(int s) {
    ll cur = 0;
    for(int i = 1; i <= n; ++i) {
        ll x = cnt1[i];
        if((x + s - 1) / s * (s - 1) > x)
            return;
        cur += (x + s - 1) / s * cnt2[x];
        if(cur >= ans)
            return;
    }
    ans = cur;
}
void test_case() {
    sort(b + 1, b + 1 + n);
    int c1 = unique(b + 1, b + 1 + n) - (b + 1);
    for(int i = 1; i <= c1; ++i)
        cnt1[i] = 0;
    for(int i = 1; i <= n; ++i) {
        a[i] = lower_bound(b + 1, b + 1 + c1, a[i]) - b;
        ++cnt1[a[i]];
    }
    for(int i = 1; i <= c1; ++i)
        cnt2[cnt1[i]] = 0;
    for(int i = 1; i <= c1; ++i)
        ++cnt2[cnt1[i]];
    sort(cnt1 + 1, cnt1 + 1 + c1);
    n = unique(cnt1 + 1, cnt1 + 1 + c1) - (cnt1 + 1);
    ans = 0;
    for(int i = 1; i <= n; ++i)
        ans += 1ll * cnt2[cnt1[i]] * ((cnt1[i] + 1) / 2);
    int *s = a;
    for(int i = 1; i + 2 <= cnt1[1] + 1; ++i)
        s[i] = i + 2;
    int cnts = cnt1[1] + 1 - 3 + 1;
    if(cnts <= 0) {
        printf("%lld\n", ans);
        return;
    }
    random_shuffle(s + 1, s + 1 + cnts);
    for(int i = 1; i <= cnts; ++i)
        check(s[i]);
    printf("%lld\n", ans);
}
int main() {
#ifdef KisekiPurin
    freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
    srand(time(0));
    int t;
    read(t);
    while(t--) {
        read(n);
        for(int i = 1; i <= n; ++i) {
            read(a[i]);
            b[i] = a[i];
        }
        test_case();
    }
}
K - Key Storage
2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)的更多相关文章
- 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution
		
A. Alice the Fan Solved. 题意: 两个人打网球,要求teamA 的得分与其他队伍拉开尽量大 输出合法的方案 思路: $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢 ...
 - 2021-2022 ICPC, NERC, Northern Eurasia Onsite (Unrated, Online Mirror, ICPC Rules, Teams Preferred) J. Job Lookup
		
题意 n个节点,n<=200,你需要构造这n个几点成为一棵树,并且这棵树的中序遍历为1-n; 你构造树的节点之间的最短路构成一个n×n的最短距离矩阵d: 同时给你n×n的权重矩阵c:最最小的Σd ...
 - 2019-2020 ICPC, NERC, Northern Eurasia Finals
		
A. Apprentice Learning Trajectory rdc乱编的做法 考虑贪心,每次会选择结束时间最早的. 设当前时间为 \(x\),那么可以区间有两类 a) \(l_i \leq x ...
 - Codeforces 1089E - Easy Chess - [DFS+特判][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem E]
		
题目链接:https://codeforces.com/contest/1089/problem/E Elma is learning chess figures. She learned that ...
 - Codeforces 1089K - King Kog's Reception - [线段树][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem K]
		
题目链接:https://codeforces.com/contest/1089/problem/K time limit per test: 2 seconds memory limit per t ...
 - 记第一场atcoder和codeforces 2018-2019 ICPC, NEERC, Northern Eurasia Finals Online Mirror
		
下午连着两场比赛,爽. 首先是codeforses,我和一位dalao一起打的,结果考炸了,幸亏不计rating.. A Alice the Fan 这个就是记忆化搜索一下预处理,然后直接回答询问好了 ...
 - 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)
		
A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...
 - 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution
		
A. Find a Number Solved By 2017212212083 题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$ 思路: 定义一个二元组$< ...
 - Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结
		
第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...
 
随机推荐
- Android 把枪/PDA 扫描头自回车没用 处理方法
			
XML 控件加上属性 android:imeOptions="actionNone"
 - IP-reputation feature
			
IP-reputation feature https://blog.norz.at/citrix-netscaler-ip-reputation-feature/ I recently had to ...
 - VBA常量(八)
			
常量是一个命名的内存位置,用于保存脚本执行期间固定(无法更改)的值.如果用户试图更改常量值,则脚本执行结束时会出现错误.常量声明与声明变量相同. 以下是命名常量的规则 - 常量名称必须使用一个字母作为 ...
 - Java 之 可变参数
			
可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式: 修饰符 返回值类型 方法名(参数类型... 形参名){ } 其实这个书写完全等价 ...
 - PHP常见算法
			
算法的概念:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作.一个问题可以有多种算法,每种算法都不同的效率.一个算法具有的特征:有穷,确切,输入,输出,可行 ...
 - C语言程序经过编译链接后形成二进制映像文件的组成
			
C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...
 - B树Java代码实现以及测试
			
B树定义 B 树又叫平衡多路查找树.一棵m阶的B 树 (m叉树)的特性如下: 根节点至少有两个孩子 每个非根节点至少有M/2(上取整)个孩子,至多有M个孩子. 每个非根节点至少有M/2-1(上取整)个 ...
 - 如何利用while语句根据用户输入要求打印菱形图案
			
需求:如何利用while语句根据用户输入要求打印菱形图案 diamond.py代码如下: x=int(input('Please input number: ')) i=1 j=1 while i&l ...
 - 标准库类型之vector
			
上篇中遗留了一个小作业,就是用string中的find_first_not_of和find_last_not_of函数来实现字符串左右空格的去除,先来完成它,实现的思路是先来编写去除左空格,然后再编写 ...
 - 1114  CSS基础
			
目录 CSS入门 标签设置长宽 1.字体样式 1.1 字体类型 font-family 1.2 字体大小 font-size 1.3 字体颜色 color 1.4 字体粗细 font-weight 1 ...