galiyuebing @ 2023-10-27 20:24:31
rt
用分块写的,本地没问题,下了一组数据也没问题,一交上全RE,点了一下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#define pii pair<int,int>
using namespace std;
const int N=1e6+10;
int n,q,block,t;
int st[N],ed[N],pos[N];
long long a[N],add[N];
void ini()
{
t=sqrt(n);
block=n/t;
if(n%block)++t;
for(int i=1;i<=t;++i){st[i]=(i-1)*block+1;ed[i]=i*block;}
ed[t]=n;
for(int i=1;i<=t;++i)
{
for(int j=st[i];j<=ed[i];++j)pos[j]=i;
sort(a+st[i],a+ed[i]+1);
}
}
void change(int l,int r,long long k)
{
int lp=pos[l],rq=pos[r];
if(lp==rq)for(int i=l;i<=r;++i)a[i]+=k;
else
{
for(int i=lp+1;i<rq;++i)add[i]+=k;
change(l,ed[lp],k);change(st[rq],r,k);
}
}
long long Sum(int l,int r,long long c)
{
int lp=pos[l],rq=pos[r];
if(lp==rq)
{
int tot=lower_bound(a+l,a+r+1,c-add[lp])-a;
return r-tot+1;
}
else
{
long long ans=0;
for(int i=lp+1;i<rq;++i)
{
int tot=lower_bound(a+st[i],a+ed[i]+1,c-add[i])-a;
ans+=ed[i]-tot+1;
}
ans+=Sum(l,ed[lp],c)+Sum(st[rq],r,c);
return ans;
}
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);ini();
getchar();
for(int i=1,l,r;i<=q;++i)
{
char ch;
scanf("%c%d%d",&ch,&l,&r);
if(ch=='M')
{
long long w;
scanf("%lld",&w);
change(l,r,w);
}
else
{
long long c;
scanf("%lld",&c);
printf("%lld\n",Sum(l,r,c));
}
getchar();
}
return 0;
}
by tang_mx @ 2023-10-27 20:27:32
https://www.luogu.com.cn/paste/4lxz30r8
by yinianxingkong @ 2023-10-27 20:28:59
……输入,改法很简单,注释掉getchar,输入字符改用scanf("%s")就过了
然而我太蒻了,不知道原因QAQ(也是以前一道题调不出来发现的)
by galiyuebing @ 2023-10-27 20:32:16
@yinianxingkong 感谢大佬!!过了
顺便挂个二贴:为什么会RE呢?%c不是读取单个字符吗?为什么换成字符串的%s就行了?
by yinianxingkong @ 2023-10-27 20:33:27
bdfs了一下……好像%c会吞字符,前面加个空格scanf(" %c")就能A
还是用%s罢……
by cmach_socket @ 2024-01-29 11:41:07
@yinianxingkong 因为scanf不会读入行末换行符,导致下一行读入会多一个行末换行符,如果用%c读入就会读入这个换行符。scanf(" %c")前面的空格意思是跳过一个空白字符(指换行符,空格,制表符等),这样输入的字符就是正确的。 至于平时%d为什么不用scanf(" %d"),因为限制了必须是数字,所以这个换行符是非法的就会跳过。而%c不会,只要是字符就会合法
by yinianxingkong @ 2024-01-29 11:45:02
@cmach_socket ok,谢谢。当然即便是这样我也不会用scanf("%c")的