您的位置:首页 > 其它

ZZULIOJ 1784 Camellia的难题

2015-11-22 15:55 232 查看

1784: Camellia的难题

Time Limit: 2 Sec  Memory Limit:
128 MB
Submit: 67  Solved: 14

SubmitStatusWeb
Board

Description

 Camellia遇到了一个问题,她无法解决所以来求助豆子,以下是豆子所理解的问题:给定1000万个点,编号1-1000万。每个点都有一个值,初始的时候均为-1,有n个操作,操作有以下五种。

1 x 代表将x点更新为i,i为第几次操作。

2 x 代表将x点更新为-1。

3   代表把所有的点变为-1。

4 x 查询x点的值。

5  查询1000万个点里有多少个点不是-1。

亲爱的同学,你能帮助他们解决这个问题么?

Input

 首先输入一个t(t<10)代表t组数组,接下来每组数据首先输入一个n(n<100万)代表n次操作,接下来n行每行一种操作。

Output

 对于4、5操作来言,输出它们的答案。

Sample Input

181 201 154 2052 15535

Sample Output

1210

其中最麻烦的操作是3,在进行3的时候,记录一个时间变量tim,然后如果结点值只要小于tim表示这个点为-1,然后正常进行运算就行了

ac代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 10000001
#define fab(a) (a)>0?(a):(-a)
#define INF 0xfffffff
#define LL long long
using namespace std;
int v[MAXN];
int main()
{
int t,i,n,a,c,tim;
scanf("%d",&t);
while(t--)
{
tim=0;
int k=10000000;
scanf("%d",&n);
memset(v,-1,sizeof(v));
for(i=1;i<=n;i++)
{
scanf("%d",&c);
if(c==1)
{
scanf("%d",&a);
//printf("%d\n",v[a]);
if(v[a]==-1||v[a]<tim)//这的小于号找了半天
k--;
v[a]=i;
//printf("%d\n",k);
//printf("%d\n",v[a]);
}
else if(c==2)
{
scanf("%d",&a);
if(v[a]!=-1&&v[a]>tim)
{
k++;
}
//printf("%d\n",k);
//sum=sum-v[a]-1;
}
else if(c==3)
{
k=10000000;
tim=i;
}
else if(c==4)
{
scanf("%d",&a);
if(v[a]<tim)
printf("%d\n",-1);
else
printf("%d\n",v[a]);
}
else if(c==5)
{
printf("%d\n",10000000-k);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: