20241216北京总结

总结

模拟赛

赛时做了\(3hT1\) , 一眼反悔贪心 , 但我贪心策略是假的 , \(so\)教训就是贪心这种算法 , 在过不去大样例的时候先缜密思考一下正确性 , 再想是不是代码实现的问题 , 还有就是有可能的话记得写对拍 .

接着冲了\(1.5hT2\) , 我对博弈的分析是完全正确的 , 就是若出现长度大于等于 \(k\) 奇数区间就看到区间开头的距离能否膜 \(k+1\) , 这个规律十五分钟秒了

然后问题就变成了一个 \(DS\) , 我没意识到线段树很难实现这种操作 , 写了一大坨线段树后挂了

其中折射了两个问题 , 不能因为看出正解就一个劲写正解 , 可能你的正解 , 只是部分正确 , 比如这题我看出 \(DS\) 后完全可以冲一下 \(n^2\) 和性质了

还有就是做题做少了 , 有人能看到这个 \(DS\) 形式一眼秒出是分块 , 如果我做题经验丰富的话也能看出它是一个线段树不太可行的东西

\(T3\) 想了一下 \(20\) 分 , 大概有思路 , 但一看前面全挂零了 , 冲了一下 \(T1\) 模拟退火 , 没想到捆绑测试真有 \(20\)

期望得分\(0+0+0\) ; 实际得分\(20+0+0\)

改题都还没改 , \(T3\) 没听 , 因为我场上想 \(T3\) 的时间有点短 , 这种构造感觉不仔细思考直接贺题解也一点用没有 , 之后再想 .

\(T1\) 可改 , 而且 \(T1\) 的解法相当充分 , 反悔贪心这块还是有点直接先口胡一个结论完了直接写代码来验证对不对的毛病 , 下次要仔细想想再写

另外这题可以用网络流做 , 但我网络流实在是有点废物了 , 按下不表之后再说吧

\(T2\) 分块或者说根号分支其实有点困难 , \(DS\) 还是有点不写就不知道怎么回事 , 大概云了一下 , 具体情况写了再说

下面是练习题情况

[AGC002E] Candy Piles

很难说它是博弈 , 它其实是一种模型的转换

把点阵转化为一个网格图。

从原点开始,每人每次可以选择向右或向上移动一格,向右代表消去最左边一行,向上代表消去最下面一行。很容易发现,当走到网格图的边界(下图中的实线部分)时,所有石子刚好被取完。

然后手玩一下 \(DS\) 就明白了

/*
 * @Author: 2019yyy
 * @Date: 2024-12-16 15:31:32
 * @LastEditors: 2019yyy
 * @LastEditTime: 2024-12-16 15:50:11
 * @FilePath: \code\20241216\agc002e.cpp
 * @Description: 
 * 
 * I love Chtholly forever 
 */
#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y){
    return x>y;
}
int a[1100000];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);
    int t;
    for(int i=1;i<=n+1;i++){
        if(i>a[i]){
            t=i-1;
            break;
        }
    }
    int ed=0;
    while(a[t+ed+1]==t){
        ed++;
    }
    if((ed&1) or ((a[t]-t)&1)){
        cout<<"First\n";
    }else{
        cout<<"Second\n";
    }
    return 0;
}

CF1495C Garden of the Sun

自然的想法是 : 按 \(mod\) \(3\) 分组 , \(1\) 组推平 ,\(2,0\) 选一个突出连接

最后特判一下 \(n\) 行为 \(0\) 组的情况

#include<bits/stdc++.h>
using namespace std;
char a[510][510];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        bool flag=false;
        for(int i=1;i<=n;i++){
            if(i%3==1){
                for(int j=1;j<=m;j++){
                    a[i][j]='X';
                }
            }else if(i%3==2){
                for(int j=1;j<=m;j++){
                    if(a[i][j]=='X'){
                        flag=true;
                        a[i+1][j]='X';
                        break;
                    }
                }
            }else{
                if(not flag){
                    for(int j=1;j<=m;j++){
                        if(a[i][j]=='X'){
                            flag=true;
                            a[i-1][j]='X';
                            break;
                        }
                    }
                }
                if(not flag){
                    a[i-1][1]=a[i][1]='X';
                }
                flag=false;
            }
        }
        if(n%3==0){
            for(int i=1;i<=m;i++){
                if(a[n][i]=='X'){
                    a[n-1][i]='X';
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cout<<a[i][j];
            }
            cout<<'\n';
        }
    }
    return 0;
}
posted @ 2024-12-16 21:11  2019yyy  阅读(16)  评论(0)    收藏  举报