• 【洛谷P4145】花神游历各国


    题目大意:给定一个长度为 N 的序列,支持区间开根,区间求和。

    题解:对于区间开根操作,可以发现任何一个位置的值开根至多 6 次就会变成 1。因此即使是整个区间开根,暴力修改6次后,所有的点的权值均小于等于1,即 (O(6n)) 时间之后,再修改对序列的值已经不会产生影响,因此忽略后面的开根操作即可,这可以通过维护一个区间最大值来实现。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    
    int n,m;
    long long a[maxn];
    struct node{
    	#define ls(x) t[x].lc
    	#define rs(x) t[x].rc
    	int lc,rc;
    	long long sum,mx;
    }t[maxn<<1];
    int tot,root;
    inline void pushup(int o){
    	t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);
    	t[o].sum=t[ls(o)].sum+t[rs(o)].sum;
    }
    int build(int l,int r){
    	int o=++tot;
    	if(l==r)return t[o].sum=t[o].mx=a[l],o;
    	int mid=l+r>>1;
    	ls(o)=build(l,mid),rs(o)=build(mid+1,r);
    	return pushup(o),o;
    }
    void modify(int o,int l,int r,int x,int y){
    	if(l==r){t[o].sum=t[o].mx=sqrt(t[o].sum);return;}
    	int mid=l+r>>1;
    	if(y<=mid){if(t[ls(o)].mx>1)modify(ls(o),l,mid,x,y);}
    	else if(x>mid){if(t[rs(o)].mx>1)modify(rs(o),mid+1,r,x,y);}
    	else{
    		if(t[ls(o)].mx>1)modify(ls(o),l,mid,x,mid);
    		if(t[rs(o)].mx>1)modify(rs(o),mid+1,r,mid+1,y);
    	}
    	pushup(o);
    }
    long long query(int o,int l,int r,int x,int y){
    	if(l==x&&r==y)return t[o].sum;
    	int mid=l+r>>1;
    	if(y<=mid)return query(ls(o),l,mid,x,y);
    	else if(x>mid)return query(rs(o),mid+1,r,x,y);
    	else return query(ls(o),l,mid,x,mid)+query(rs(o),mid+1,r,mid+1,y);
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    	root=build(1,n);
    	scanf("%d",&m);
    	while(m--){
    		int opt,x,y;
    		scanf("%d%d%d",&opt,&x,&y);
    		if(x>y)swap(x,y);
    		if(opt==0)modify(root,1,n,x,y);
    		else printf("%lld
    ",query(root,1,n,x,y));
    	}
    	return 0;
    } 
    
  • 相关阅读:
    Windowsforms 中对文件操作
    ADO.net增删改的使用
    ADO.net数据访问
    可空类型
    FineUI 页面跳转
    ASP.NET页面之间传递值的几种方式
    C# Find() 与 FindAll()方法的使用
    在Sql中将 varchar 值 '1,2,3,4,5,6' 转换成数据类型 int
    DataSet、DataTable、DataRow、DataColumn区别及使用实例
    C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10591812.html
Copyright © 2020-2023  润新知