快读之后要输入一个字符只能用scanf("%s",ss) 吗
  • 板块学术版
  • 楼主小铭同学lym
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/8/11 07:28
  • 上次更新2023/10/27 16:01:21
查看原帖
快读之后要输入一个字符只能用scanf("%s",ss) 吗
490314
小铭同学lym楼主2022/8/11 07:28

P2464 [SDOI2008] 郁闷的小 J

这道题目,我这样久RE+TLE了

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define rg register int 
#define inl inline 
using namespace std;
using namespace __gnu_pbds;
gp_hash_table<int,int>mp[1005];
const int N=1e5+5;
int L[N],R[N],id[N],a[N],n,m,fff,len;
char ch,cz;
inl int frad()
{
	fff=0,ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9') 	fff=(fff<<3)+(fff<<1)+(ch^48),ch=getchar();
	return fff;
}
inl int qry(int l,int r,int k)
{
	int ans=0,il=id[l],ir=id[r];
	if(il==ir)
	{
		for(rg i=l;i<=r;++i)
			ans+=(a[i]==k);
		return ans;
	}
	for(rg i=l;i<=R[il];++i)
		ans+=(a[i]==k);
	for(rg i=L[ir];i<=r;++i)
		ans+=(a[i]==k);
	for(rg i=il+1;i<ir;++i)
		ans+=mp[i][k];
	return ans;
}
int main()
{
	n=frad(),m=frad();
	len=sqrt(n);
	for(rg i=1;i<=n;++i)
	{
		a[i]=frad(),id[i]=(i-1)/len+1;
		mp[id[i]][a[i]]++;
		if(!L[id[i]])
			L[id[i]]=i;
		R[id[i]]=i;
	}
	int l,r,k;
	while(m--)
	{
		scanf("%c",&cz);
		if(cz=='C')
		{
			l=frad(),r=frad();
			mp[id[l]][a[l]]--,a[l]=r,mp[id[l]][a[l]]++;
		}
		else
		{
			l=frad(),r=frad(),k=frad();
			printf("%d\n",qry(l,r,k));
		}
	}
}

但是我这样就AC了

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define rg register int 
#define inl inline 
using namespace std;
using namespace __gnu_pbds;
gp_hash_table<int,int>mp[1005];
const int N=1e5+5;
int L[N],R[N],id[N],a[N],n,m,fff,len;
char ch,ss[5];
inl int frad()
{
	fff=0,ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9') 	fff=(fff<<3)+(fff<<1)+(ch^48),ch=getchar();
	return fff;
}
inl int qry(int l,int r,int k)
{
	int ans=0,il=id[l],ir=id[r];
	if(il==ir)
	{
		for(rg i=l;i<=r;++i)
			ans+=(a[i]==k);
		return ans;
	}
	for(rg i=l;i<=R[il];++i)
		ans+=(a[i]==k);
	for(rg i=L[ir];i<=r;++i)
		ans+=(a[i]==k);
	for(rg i=il+1;i<ir;++i)
		ans+=mp[i][k];
	return ans;
}
int main()
{
	n=frad(),m=frad();
	len=sqrt(n);
	for(rg i=1;i<=n;++i)
	{
		a[i]=frad(),id[i]=(i-1)/len+1;
		mp[id[i]][a[i]]++;
		if(!L[id[i]])
			L[id[i]]=i;
		R[id[i]]=i;
	}
	int l,r,k;
	while(m--)
	{
		scanf("%s",ss);
		if(ss[0]=='C')
		{
			l=frad(),r=frad();
			mp[id[l]][a[l]]--,a[l]=r,mp[id[l]][a[l]]++;
		}
		else
		{
			l=frad(),r=frad(),k=frad();
			printf("%d\n",qry(l,r,k));
		}
	}
}

唯一区别就是:第一个是快读之后读入一个字符再快读;第二大是快读之后读入一个字符数组,或者说遇到空格才停止读入字符,再快读。

两者有区别吗?????

2022/8/11 07:28
加载中...