【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划
题目


题解
题意
有nnn道题,编号为1~nnn
给出mmm次操作
每次操作有3种类型
1 xxx 表示交了ACACAC的代码在编号为xxx的题
2 xxx表示交了没有ACACAC的代码在编号为xxx的题
3 表示询问当前做过的题目中从来没有ACACAC的题,晚交的先输出
对于每个3询问,输出前20个
分析
既然mmm只有100
那为什么不打暴力呢
对于每种操作
是1的话给题目打个ACACAC标记
是2的话放入未ACACAC数组,注意我们不在意之前是否ACACAC
对于3,查找未ACACAC数组中的没有打过ACACAC标记的题目,并判断是否输出过,注意只输出前20个即可
(考试的时候没看见,30没了)
其实可以离散化也可以不离散化,看你的ACACAC标记怎么打,像我的话就是给编号打标记
Code
#include<cstdio>
#include<cstring>
using namespace std;
int m,i,d,now,num,tot,p[105];
long long n,x,hash[10010];
bool b[10010],bj[10010];
int HASH(long long x)
{
int pos;
pos=x%10007;
while (hash[pos]!=0)
{
if (hash[pos]==x) return pos;
pos++;
if (pos==10007) pos=0;
}
hash[pos]=x;
return pos;
}
int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
scanf("%lld%d",&n,&m);
while (m--)
{
scanf("%d",&d);
if (d==1)
{
scanf("%lld",&x);
now=HASH(x);
b[now]=true;
}
if (d==2)
{
scanf("%lld",&x);
now=HASH(x);
if (b[now]==false)
{
num++;
p[num]=now;
}
}
if (d==3)
{
memset(bj,false,sizeof(bj));
tot=0;
for (i=num;i;i--)
{
if (b[p[i]]==false&&bj[p[i]]==false)
{
printf("%lld ",hash[p[i]]);
bj[p[i]]=true;
tot++;
}
if (tot==20) break;
}
printf("\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
本文解析了NOIP2015模拟赛中一道关于题目提交与状态跟踪的问题,通过使用暴力算法和哈希表来记录题目状态,详细介绍了如何处理三种类型的操作:提交正确代码、提交错误代码以及查询未解决题目。

420

被折叠的 条评论
为什么被折叠?



