社区讨论

快读之后要输入一个字符只能用scanf("%s",ss) 吗

学术版参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8bqvnf
此快照首次捕获于
2023/10/27 16:01
2 年前
此快照最后确认于
2023/10/27 16:01
2 年前
查看原帖
P2464 [SDOI2008] 郁闷的小 J
这道题目,我这样久RE+TLE了
CPP
#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了
CPP
#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));
		}
	}
}
唯一区别就是:第一个是快读之后读入一个字符再快读;第二大是快读之后读入一个字符数组,或者说遇到空格才停止读入字符,再快读。
两者有区别吗?????

回复

5 条回复,欢迎继续交流。

正在加载回复...