社区讨论
分块求卡常
P2357守墓人参与者 5已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m4dlso2m
- 此快照首次捕获于
- 2024/12/07 11:16 去年
- 此快照最后确认于
- 2025/11/04 13:13 4 个月前
进来就帮我卡卡代码吧,谢谢
TLE on #21
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char c=getchar();
while (c<'0' || c>'9')
{
if (c=='-') f=-1;
c=getchar();
}
while (c>='0' && c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,m;
int a[222222];
int sum[222222],id;
int kuai[222222],gs;
signed main()
{
// cin>>n>>m;
n=read();
m=read();
gs=ceil(sqrt(n));
for(int i=1;i<=n;i++)
{
// cin>>a[i];
a[i]=read();
sum[(i-1)/gs]+=a[i];
}
for(int i=1,op,l,r,c;i<=m;i++)
{
// cin>>op;
op=read();
if(op<=3)
{
l=r=1;
if(op==1)
{
// cin>>l>>r>>c;
l=read();
r=read();
c=read();
}
else if(op==2)
{
// cin>>c;
c=read();
}
else if(op==3)
{
// cin>>c;
c=read();
// c=-c;
c=~c+1;
}
if(l%gs!=1)
{
id=(l-1)/gs;
int rr=(l-1)/gs*gs+gs;
while(l<=r and l<=rr)
{
sum[id]+=c;
a[l]+=c;
l++;
}
}
while(l/gs<=r/gs and r-l+1>=gs)
{
id=(l-1)/gs;
kuai[id]+=c;
l+=gs;
}
id=(l-1)/gs;
while(l<=r)
{
sum[id]+=c;
a[l]+=c;
l++;
}
}
else
{
if(op==4)
{
// cin>>l>>r;
l=read();
r=read();
}
else if(op==5)
{
l=r=1;
}
int s=0;
if(l%gs!=1)
{
id=(l-1)/gs;
int rr=(l-1)/gs*gs+gs;
while(l<=r and l<=rr)
{
s+=a[l];
s+=kuai[id];
l++;
}
}
while(l/gs<=r/gs and r-l+1>=gs)
{
id=(l-1)/gs;
s+=kuai[id]*gs;
s+=sum[id];
l+=gs;
}
id=(l-1)/gs;
while(l<=r)
{
s+=a[l];
s+=kuai[id];
l++;
}
cout<<s<<'\n';
}
}
}
为了找分块卡过的大佬,竟然找到了一堆超tj的。。。
回复
共 9 条回复,欢迎继续交流。
正在加载回复...