新的一周了诶..
8.8
做cf
看了一天博弈于是B想得好复杂..一直算 sg算不对..
c 是不懂要怎么处理 前 t 秒里面 没有被 2 操作 操作掉的数
cf 366 div2 c C - Thor
给每个节点 一个队列,队列里面存放的就是 对应它添加进来的时间,
在 3 操作 的时候,可以维护 一个位置 ,假如上次是操作到t1 那么这次的操作 就只需要 t1 到 t2就可以了
没想到把每一个时间当成一个东西丢进队列里面..
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <math.h> 6 #include <vector> 7 #include <map> 8 #include <set> 9 #include <stack> 10 #include <queue> 11 #include <string> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 16 typedef long long LL; 17 typedef pair<int,int> pii; 18 typedef pair<double,double> pdd; 19 const double eps = 1e-8; 20 const int INF = (1 << 30) - 1; 21 const int maxn = 300010; 22 int n,m,que[maxn]; 23 queue<int> q[maxn]; 24 25 void solve(){ 26 int op,x,t = 0,ans = 0,pos = 0; 27 memset(que,-1,sizeof(que)); 28 for(int i = 1;i <= m;i++){ 29 scanf("%d %d",&op,&x); 30 if(op == 1){ 31 que[++t] = x; 32 q[x].push(t); 33 ans++; 34 } 35 else if(op == 2){ 36 while(!q[x].empty()){ 37 int u = q[x].front();q[x].pop(); 38 que[u] = -1; 39 ans--; 40 } 41 } 42 else{ 43 int top = min(t,x); 44 for(int i = pos+1;i <= top;i++){ 45 if(que[i] == -1) continue; 46 int v = que[i]; 47 q[v].pop(); 48 ans--; 49 } 50 pos = max(pos,top); 51 } 52 printf("%d\n",ans); 53 } 54 } 55 56 int main(){ 57 scanf("%d %d",&n,&m); 58 solve(); 59 return 0; 60 }
时间: 2024-10-21 11:29:45