Thor(CF #366 Div. 1)

来源:互联网 发布:卓文网络商学院诈骗 编辑:程序博客网 时间:2024/06/16 10:36

这道题虽然做出来了,但花时间太久了,主要问题在于题意的理解上,WA / TLE了4次,还是理解能力问题,需要加强。

题目大意:一个人的手机上有 n 个app,每个app都会有提示信息。然后给出 q 个事件,所有事件可以分为三类,第一类是,app x 发出一条信息;第二类是,这个人将app x 的所有信息都读完了;第三类是,这个人读了前 t 条信息。题意模糊在第三类,他读了前 t 条信息,指的是在前一次处理(第三类的处理)的基础上继续往下读 t 条。附链接:http://codeforces.com/problemset/problem/704/A。

大体思路:开辟一个数组 app[ maxn ] 记录第 i 个app的信息数量,数组order[ maxn ] 按顺序(从1到p编号)记录每条信息属于哪个 app,vis[ maxn ] 的作用是,当进行第二类处理时,vis[ i ] 记录当时的编号顺序。

以下为ac代码:

#include<iostream>#include<cstring>using namespace std;const int maxn=300005;int app[maxn];int order[maxn];   //存的内容为app的编号,下标代表第几个事件int vis[maxn];int main(){    int n,q;    memset(app,0,sizeof(app));    memset(vis,0,sizeof(vis));    cin>>n>>q;    int cnt=0;    //记录事件编号,从1开始    int type,num;    int left=0;   //剩余的未读信息    int last=1;   //第三类处理初始化,从1开始    while(q--){        cin>>type>>num;        if(type==1){            ++app[num];            ++left;            order[++cnt]=num;   //按事件编号顺序记录,内容为app的编号        }        else if(type==2){            left-=app[num];            app[num]=0;            vis[num]=cnt;    //将当前的事件编号存到第i个app的vis中        }        else{            while(last<=num){  //从上一次的基础开始!!!                if(last>vis[order[last]]){  //当last小于或等于vis[order[last]],说明第last条信息已经读过了                    --left;                    --app[order[last]];                }                ++last;            }        }        cout<<left<<endl;    }    return 0;}


0 0