Codeforces Round 964 div4

Codeforces Round 964 div4

第一次vp,也是第一次打div4,并不是很清楚难度如何,所以vp时经常把题目想的过于复杂,同时手速码力还是有点弱,感觉有时候会很 混乱


A. A+B Again?

https://codeforces.com/contest/1999/problem/A

两位数直接对10求除和模即可,即 ans=n÷10+nmod10,我vp时思路直接对数进行除

B. Card Game

https://codeforces.com/contest/1999/problem/B

题意:两个人各有两个手牌,然后任意顺序安排手牌顺序去比较,每次出一张,比对方的手牌大则获胜,相等平局,否则则输,只有两次比较后比分比对方大这局才获胜,因此我们求可能的获胜局数。
一开始的想法就是直接用next_permutation写模拟,结果脑袋不清醒没想好怎么打,后来想到只需要写二重循环,没选中的牌进行比较即可,这里也因为是2个所以可以通过对2求模来找到未被选中的牌

void solve() {
    int a[2],b[2];
    std::cin >> a[0] >> a[1] >> b[0] >> b[1];
    int ans = 0;
    for(int i = 0;i <= 1;i ++ )
        for(int j = 0;j <= 1;j ++ ) {
            int cnt = 0;
            if(a[i] > b[j]) cnt ++;
            else if(a[i] < b[j]) cnt --;
            if(a[(i + 1) % 2] > b[(j + 1) % 2]) cnt ++;
            else if(a[(i + 1) % 2] < b[(j + 1) % 2]) cnt --;
            // std::cout << cnt << "\n";
            if(cnt > 0) ans ++;
        }
    std::cout << ans << "\n";
}   

C. Showering

https://codeforces.com/contest/1999/problem/C

这题真是唐中唐,不知道为什么上来就开始写差分,后来发现对端点差分不好判断长度,遂直接对线段按做端点排序直接判断两个线段间隔是否满足,同时注意第一条线段需不需要和0比较与最后一条线段需不需要和1比较
修改:这里不能进行排序,题目中给了有序,同时如果循环中有输入是不可以进行break

void solve() {
    int n,s,m;
    bool flag = false;
    std::cin >> n >> s >> m;
    int pre = 0,l = 0,r = 0;
    for(int i = 1;i <= n;i ++) {
        std::cin >> l >> r;
        if(l - pre >= s) flag = true;
        pre = r;
    }
    if(m - pre >= s) flag = true;
    std::cout << (flag ? "Yes" : "No") << "\n";
}

D. Slavic's Exam

https://codeforces.com/contest/1999/problem/D

题意:给一个含?的字符串a与字符串b,?可以任意改,是否能够让b成为a的子序列
思路:依次在a中比较b的每个字符,如果是?则将其改为对应的b中的字符。之后在直接判断b是否是a的子序列,具体实现是双指针
写完C就已经3点多了,脑子着实有点不清醒了,所以调的就开始很慢了(还是太菜了)

std::string a,b;
void solve() {
    std::cin >> a;
    std::cin >> b;
    int j = 0;
    for(auto &i : a) {
        if(j == b.size()) break;
        if(i == b[j]) {
            j ++;
            continue;
        }
        if(i == '?') i = b[j ++];
    }
    j = 0;
    for(int i = 0;i < a.size();i ++ ) {
        if(a[i] == b[j]) j ++;
        else if(a[i] == '?') a[i] = a[i - 1];
    }
    if(j >= b.size()) {
        std::cout << "YES\n";
        for(auto i : a)
            std::cout << i;
        std::cout << "\n";
    }else std::cout << "NO\n";
}

E. Triple Operations

https://codeforces.com/contest/1999/problem/E

题意:给一个序列,选择一对数 x,y 进行一次操作后则变为 3x,y3
思路:先选取最小的数操作至0,之后的操作就是选取0与其他非0数进行操作,需要注意的是操作最小数时会同时乘对应次数的3,只需要算出最小数操作为0的次数乘2即可。因为是算从 lr 的数的操作的次数,因此我们可以通过前缀和来进行优化。
求一个数操作为0的次数可以先预处理出来 F[i]=3i,因为是从 lr 是连续的,因此我们只需要 O(n) 的复杂度就可以处理出来

const int N = 200010, INF = 0x7fffffff,Mod = 998244353;
int l,r,f[13],p[N];
void init() {
    f[0] = 1;
    for(int i = 1;i <= 13;i ++ )
        f[i] = f[i - 1] * 3;
}
void init_() {
    p[0] = 0;
    p[1] = 1;
    int pre = 1;
    for(int i = 2;i <= 200010;i ++ ) {
        if(f[pre] <= i) pre ++;
        p[i] = pre;
        p[i] += p[i - 1];
    }
}
void solve() {
    std::cin >> l >> r;
    int ans = 0;
    ans += p[r] + p[l] - 2 * p[l - 1];
    std::cout << ans << "\n";
}

signed main() {
    FastIO;
    // freopen("in.txt", "r", stdin);
    // freopen("me.txt", "w", stdout);
    int _;
    _= 1;
    std::cin >> _;
    init();
    init_();
    while(_ --)
    {
        solve();
    }
    return 0;
}
posted @   nnnnakosuki  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示