社区讨论
被Linux偷家了
P4145上帝造题的七分钟 2 / 花神游历各国参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lowxowk1
- 此快照首次捕获于
- 2023/11/13 21:22 2 年前
- 此快照最后确认于
- 2023/11/13 23:24 2 年前
30pts,win 下自测大样例能过,但是在教练的 Linux 环境下跑出了奇怪的东西。大概是越界什么的,对这种情况没什么经验,望大家指教!
CPP#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,m,a[N],L[N],R[N],id[N],s[N];
bool vis[N];
void blockd(ll x)
{
if (vis[x]) return;
vis[x]=1,s[x]=0;
for (ll i=L[x];i<=R[x];i++)
{
a[i]=sqrt(a[i]);
s[x]+=a[i];
if (a[i]>1) vis[x]=0;
}
}
void updat(ll x,ll y)
{
ll l=id[x],r=id[y];
if (l==r)
{
for (ll i=x;i<=y;i++)
{
s[l]-=a[i];
a[i]=sqrt(a[i]);
s[l]+=a[i];
}
return;
}
for (ll i=l+1;i<r;i++) blockd(i);
for (ll i=x;i<=R[l];i++)
{
s[l]-=a[i];
a[i]=sqrt(a[i]);
s[l]+=a[i];
}
for (ll i=L[r];i<=y;i++)
{
s[r]-=a[i];
a[i]=sqrt(a[i]);
s[r]+=a[i];
}
}
ll query(ll x,ll y)
{
ll l=id[x],r=id[y],res=0;
if (l==r)
{
for (ll i=x;i<=y;i++) res+=a[i];
return res;
}
for (ll i=x;i<=R[l];i++) res+=a[i];
for (ll i=L[r];i<=y;i++) res+=a[i];
for (ll i=l+1;i<r;i++) res+=s[i];
return res;
}
int main()
{
// freopen("P4145_1.in","r",stdin);
// freopen("dd.out","w",stdout);
cin.tie(0),cout.tie(0);
cin>>n;
for (ll i=1;i<=n;i++) cin>>a[i];
ll len=sqrt(n);
for (ll i=1;i<=len;i++)
{
L[i]=R[i-1]+1;
R[i]=len*i;
}
if (R[len]<n) L[++len]=R[len-1]+1,R[len]=n;
for (ll i=1;i<=len;i++)
{
for (ll j=L[i];j<=R[i];j++) id[j]=i,s[i]+=a[j];
}
// for (ll i=1;i<=len;i++) cout<<L[i]<<" "<<R[i]<<"\n";
ll k,l,r;
cin>>m;
while (m--)
{
cin>>k>>l>>r;
if (l>r) swap(l,r);
if (!k) updat(l,r);
else cout<<query(l,r)<<"\n";
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...