传送门 题意:如果是操作1,那么就标记这个x点不可用;
如果是操作2,那么就查询该点第一个可用的数,包括这个点。
思路:这个题实际上就是让你将不可用的点做标记,并输出指定的点,可以建立一个Map函数(跟大佬学习的),map<int,int>m可以用左边的数表示右边的, 比如m[x]=1; 用1来表示x.
ps:m.count(x)是用来表示x在map中出现了几次。
这个题要用scanf/printf.并且要用c++11,否则容易超时。
//#define ll long long
using namespace std;
//const ll maxn = 1000000 + 5;
//const ll mod= 1e9+7;
//ll b[maxn];
//ll vis[maxn], Bool[maxn];
//ll a[maxn];
//ll ai[maxn],a[maxn],num[maxn],sum[maxn];
using namespace std;
map<long long ,long long >m;//1表示f(x)
int main()
{
long long n,v,V;
long long u;
scanf("%lld%lld",&n,&V);
for(long long i=0;i<V;i++)
{
scanf("%lld%lld",&u,&v);
if(u==1)
m[v]=1;//1代表v[2]
else
if(u==2)
{
if(!m.count(v))
printf("%lld\n",v);
else {
for(long long i=v+1;i<=n;i++)
{
if(!m.count(i))
{
printf("%lld\n",i);
break;
}
}
}
}
}
return 0;
}
练习代码
const int maxn = 1e5 + 5;
using namespace std;
char a[105][105];
map<int,int>cnt;
int main()
{
int n,N;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>N;
cnt[N]=1;
}
for(int i=0;i<n;i++)
if(cnt.count(i))
cout<<i<<endl;
return 0;
}