BZOJ4893: 项链分赃 && BZOJ4895: 项链分赃(增强版)

Solution

神仙题.jpg

切一刀简单啊,维护一个前缀和。

切两刀简单啊,拿个队列维护中间那一段。

切三刀,这tm什么毒瘤题。

于是打开题解:“保证不会答案不会超过宝石种类”。

orz神仙结论。

于是去研究了一下证明,但是看不懂拓扑学...

可以看一下3Blue1Brown的这个视频

出题人的证明

出题人大概是看了这个视频后出了这题?

这两题是一样的。第二题直接输出m就行了。

知道结论后瞎写就行

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

#define ll long long
#define N 100010
int cnt[3], sum[N][3];
int n, a[N];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        sum[i][0] = sum[i - 1][0];
        sum[i][1] = sum[i - 1][1];
        sum[i][2] = sum[i - 1][2];
        sum[i][a[i]]++;
    }
    for(int i = 1; i <= n; ++i) {
        if(sum[i][0] * 2 == sum[n][0] 
        && sum[i][1] * 2 == sum[n][1] 
        && sum[i][2] * 2 == sum[n][2])
            {puts("1"); return 0;}
    }
    int l = 1;
    for(int i = 1; i <= n; ++i) {
        cnt[a[i]]++;
        for(int j = 0; j < 3; ++j) {
            while(l <= i && cnt[j] * 2 > sum[n][j]) cnt[a[l]]--, ++l;
        }
        if(cnt[0] * 2 == sum[n][0] 
         && cnt[1] * 2 == sum[n][1] 
         && cnt[2] * 2 == sum[n][2])
         {puts("2"); return 0;}
    }
    puts("3");
}
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define N 100010

int n, m;
int main() {
    scanf("%d%d", &n, &m);
    printf("%d\n", m);
}
全部评论

相关推荐

运营你豪哥:简历改改吧-非本、求职意向技术岗、无实习经历、内容空洞 如果简历不爆改的话,应该是会持续崩溃了 1.把你教育经历放最下面去 2.蓝底照片很奇怪哈,感觉还在高中时代,建议白底重新拍一下 3.校园经历没啥必要,收集和反馈同学们对产品的意见,解决学生和老师之间的沟通,企业招聘不看这些哈 好好思考一下简历的设计和你要表达的重点,再去投简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务