社区讨论
快读之后要输入一个字符只能用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 条回复,欢迎继续交流。
正在加载回复...