社区讨论

被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 条回复,欢迎继续交流。

正在加载回复...