HikariVVIP @ 2022-06-21 13:33:35
input:
10 9
719 583 321 556 741 430 50 28 326 804
A 1 10 321
M 1 10 101
A 1 10 337
A 1 10 596
M 1 10 511
A 1 10 142
A 1 10 99
A 1 10 88
M 1 10 609
output:
8
8
5
10
10
10
LuoGu IDE output:
8
8
6
3
5
8
8
8
3
这组数据在我的本地输出的是正确答案,但是在洛谷IDE和提交里都显示的是下面那组数据。
蒟蒻被这题卡了一周了(WA 0),请求各位神犇的帮助!
by HikariVVIP @ 2022-06-21 13:34:06
#include<bits/stdc++.h>
#define Debug(file) freopen(file".in","r",stdin);freopen(file".res","w",stdout);
using namespace std;
char op;
int n,q,block,tot;
int st[1005],ed[1005],bel[1000050],lz[1005],val[1000050];
vector<int> vec[1005];
inline int read()
{
char ch=getchar();
int x=0,f=1;
while(ch < '0' || ch > '9')
{
if(ch == '-')
f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9')
{
x = (x<<3) + (x<<1) + (ch^48);
ch = getchar();
}
return x * f;
}
void update(int x)
{
vec[x].clear();
for(int i=st[x];i<=ed[x];i++)
{
vec[x].push_back(val[i]);
}
sort(vec[x].begin(),vec[x].end());
}
void add(int l,int r,int v)
{
if (bel[l]==bel[r])
{
for (int i=l;i<=r;i++)
{
val[i]+=v;
}
update(bel[l]);
}
else
{
for (int i=l;i<=ed[bel[l]];i++)
{
val[i]+=v;
}
update(bel[l]);
for (int i=st[bel[r]];i<=r;i++)
{
val[i]+=v;
}
update(bel[r]);
for (int i=bel[l]+1;i<bel[r];i++)
lz[i]+=v;
}
}
int ask(int l,int r,int v)
{
int cnt=0;
if (bel[l]==bel[r])
{
for (int i=l;i<=r;i++)
if(val[i]+lz[bel[l]]<v)
cnt++;
}
else
{
for (int i=l;i<=ed[bel[l]];i++)
{
if(val[i]+lz[bel[l]]<v)
cnt++;
}
for (int i=st[bel[r]];i<=r;i++)
{
if(val[i]+lz[bel[r]]<v)
cnt++;
}
for (int i=bel[l]+1;i<bel[r];i++)
{
cnt+=lower_bound(vec[i].begin(),vec[i].end(),v-lz[i])-vec[i].begin();
}
}
return (r-l+1)-cnt;
}
int main()
{
//Debug("P2801_2")
n=read();q=read();
block=sqrt(n);
tot=n/block;
if (n%block) tot++;
for (int i=1;i<=n;i++)
{
val[i]=read();
bel[i]=(i-1)/block+1;
vec[bel[i]].push_back(val[i]);
}
for (int i=1;i<=tot;i++)
{
st[i]=(i-1)*block+1;
ed[i]=i*block;
}
ed[tot]=n;
for (int i=1;i<=tot;i++)
{
sort(vec[i].begin(),vec[i].end());
}
for (int i=1;i<=q;i++)
{
scanf("%c",&op);
int l=read(),r=read(),v=read();
if (op=='M')
add(l,r,v);
else
printf("%d\n",ask(l,r,v));
}
return 0;
}
丑陋的代码
by Bug_Automation @ 2022-06-21 13:37:32
ub吧
by HikariVVIP @ 2022-06-21 13:59:26
@Bug_Automation 请问是哪里ub呢qwq
by 编码落寞 @ 2022-06-21 14:32:07
@HikariVVIP
可能是换行符的问题。你读入op的时候出现了换行符。
scanf("%c",&op);
改成
scanf("\r%c",&op);
具体原理,我也不了解
by 听取MLE声一片 @ 2022-06-21 14:54:27
@HikariVVIP 为什么字符串要加&
by HikariVVIP @ 2022-06-21 22:38:07
@编码落寞 thk!!!