CodeForces 705C 我被set.erase(*it)套路了

本文提供了一道CodeForces C题目的详细解答过程,针对三种操作:接收消息、读取消息及标记已读,使用C++实现了解决方案。特别注意了在删除集合元素时迭代器变化的问题。

深夜写题解,我只想说内心是崩溃的。

题意:三种操作1.某APP来一个消息 2.读完APPx的所有消息   3.读完前t个消息(是前t个,包括读过的)

想法:静下心读懂题意,想好思路再做算法设计要有明确的伪代码,才能保证万无一失

set.erase(*it); 删除*it的值之后,你会发现如果你用的是for(it = st.begin(); it != st.end(); it++)  ,你会发现删除一个之后会出现数据错乱!因为st.begin()的位置变了,注意~~~~!!!!!

http://codeforces.com/contest/705/problem/C

题解:

#include <bits/stdc++.h>
using namespace std;
typedef pair<string, string> P;
typedef long long LL;
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MAX_N 300005
#define LOCAL
set<int> st;        //all index
queue<int> que[MAX_N];
int cnt = 0;


void solve(int type, int xt)
{
    if(type == 1)
    {
         cnt++;         //the index
         que[xt].push(cnt);
         st.insert(cnt);

    }
    else
        if(type == 2)
    {
        while(!que[xt].empty())
        {
            st.erase(que[xt].front());
            que[xt].pop();
        }
    }
    else
        if(type == 3)
    {
        set<int>::iterator it;
        int cntnow = 0;
        for(it = st.begin(); it!=st.end(); it++)            //你妈神坑~~~  记得你st.erase()后再st.begin()就变了
        {
            cout << *it << " " ;
            if(*it <= xt)
                st.erase(*it);
                else
                    break;
        }
       cout << endl;
    }
}
int main()
{
	#ifdef LOCAL
		freopen("b:\\data.in.txt", "r", stdin);
	#endif
	int n, q;
    scanf("%d%d", &n, &q);
    for(int i = 0; i < q; i++)
    {
        int type, xt ; scanf("%d%d", &type, &xt);
        solve(type, xt);
//        printf("%d\n", st.size());
    }
    return 0;
}


### 关于 Codeforces Round 1010 Div 2 的未评级题目与解答 Codeforces 平台上的比赛通常会提供详细的题目描述以及官方解法。然而,针对 Codeforces Round 1010 Div 2 的具体信息并未在当前引用中提及[^1]。值得注意的是,某些比赛可能会被标记为 unrated(未评级),这意味着该场比赛的结果不会影响参赛者的评分等级。 对于未评级的比赛问题及其解决方案,可以参考以下几点: #### 题目解析 尽管无法直接获取到 Codeforces Round 1010 Div 2 的具体内容,但可以通过类似的 CF 比赛来推测其可能涉及的主题。CF 圆桌会议中的常见主题包括但不限于字符串处理、数组操作、动态规划和图论等问题[^2]。 以下是基于一般竞赛模式下的假设性分析: 1. **字符串匹配问题** 字符串问题是许多编程比赛中常见的类型之一。例如,在某次比赛中曾出现过一个非常相似的问题:“Given a string S, find the minimum number of operations required to convert all characters into uppercase.” 这一类型的解决方法通常是通过遍历整个字符串并逐一比较字符实现。 ```python def min_operations_to_uppercase(s): count = 0 for char in s: if 'a' <= char <= 'z': count += 1 return count ``` 2. **数组排序与统计** 数组类问题也频繁出现在各类算法挑战之中。比如给定一组整数列表,要求重新排列使得偶数位于奇数之前的同时保持相对顺序不变。这类问题可通过双指针技术或者额外空间辅助完成。 3. **动态规划应用** 动态规划适用于求解最优化路径或最大子序列等相关场景。如果存在一道 DP 类型的题目,则需定义状态转移方程并通过迭代计算得出最终结果。 #### 解决方案总结 由于缺乏确切的目标赛事数据集,上述仅为通用策略展示而非特定实例解答。建议访问 Codeforces 官网查询历史存档资料以获得权威版本说明文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值