站外题求调
  • 板块学术版
  • 楼主Amidst
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/24 15:55
  • 上次更新2024/7/24 16:37:03
查看原帖
站外题求调
495469
Amidst楼主2024/7/24 15:55

HDU 4027 Can you answer these queries?

Vjudge HDU

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,m,x,y,cnt=0;
int tr[400005],a[100005];
inline int _Read()
{
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-f;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        s=s*10+ch-48;
        ch=getchar();
    }
    return s*f;
}
void Build(int l,int r,int iid)
{
    if(l==r)
    {
    	tr[iid]=a[l];
        return;
    }
    int mid=l+r>>1;
    Build(l,mid,iid<<1);
    Build(mid+1,r,iid<<1|1);
    tr[iid]=tr[iid<<1]+tr[iid<<1|1];
    return;
}
void Update(int l,int r,int x,int iid)
{
    if(l==r)
    {
        tr[iid]=floor(sqrt(1.0*tr[iid]));
        return;
    }
    int mid=l+r>>1;
    if(x<=mid)
        Update(l,mid,x,iid<<1);
    else
        Update(mid+1,r,x,iid<<1|1);
    tr[iid]=tr[iid<<1]+tr[iid<<1|1];
    return;
}
int Query(int l,int r,int x,int y,int iid)
{
    if(x<=l&&r<=y)
    	return tr[iid];
    int mid=l+r>>1;
    int ans=0;
    if(x<=mid)
		ans+=Query(l,mid,x,y,iid<<1);
    if(y>mid)
		ans+=Query(mid+1,r,x,y,iid<<1|1);
    return ans;
}
int main()
{
	while(~scanf("%d",&n))
	{
		memset(tr,0,sizeof tr);
		memset(a,0,sizeof a);
	    for(int i=1;i<=n;i++)
	    	a[i]=_Read();
	    Build(1,n,1);
	    m=_Read();
	    printf("Case #%d:\n",++cnt);
	    for(int i=1;i<=m;i++)
	    {
	    	int op;
	    	op=_Read();
	        x=_Read();
	        y=_Read();
	        if(!op)
	        	if(Query(1,n,x,y,1)!=y-x+1)
	        		for(int i=x;i<=y;i++)
						Update(1,n,i,1);
	        else
	        	printf("%d\n",Query(1,n,x,y,1));
	    }
	}
    return 0;
}
2024/7/24 15:55
加载中...