全部评论 13

  • 置顶

    怎么一群P话佬。

    4天前 来自 上海

    0
  • 建议:

    .语言为c++
    .不要注释和多余空格(缩进的空格要有)
    .变量/函数等名字取首字母,变量名简短,不要特殊函数(不是自定义
    .一定用<bits/stdc++.h>
    .数组大小要额外+5~500(整十整百数)
    .输入输出一定用cout/cin
    .同数据类型的变量要写在同一行,要在全局!!!
    .要写using namespace std;
    .注意:即将写'{'时不要额外换行
    .缩进为4个空格
    .数组循环从1开始
    .不要有多余空格,但要有四格缩进
    .不用写“ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);”[如有雷同纯属巧合
    

    (还记得我今天给你发的雷霆语句吗)

    2天前 来自 山西

    1
  • 权值树

    #include<bits/stdc++.h>
    using namespace std;
    int sum[10000005];
    int a[10000005];
    vector<int> v;
    int man(int l,int r,int x,int y,int rp){//区间求和
        if(y<l||r<x)return 0;
        if(x<=l&&y>=r)return sum[rp];
        int mid=(l+r)/2;
        int a=man(l,mid,x,y,rp*2);
        int b=man(mid+1,r,x,y,rp*2+1);
        return a+b;
    }
    void manba(int l,int r,int x,int y,int rp){//单点修改
        if(l==x&&r==x){
            sum[rp]+=y;
            return;
        }
        int mid=(l+r)/2;
        if(x<=mid) manba(l,mid,x,y,rp*2);
        if(x>mid) manba(mid+1,r,x,y,rp*2+1);
        sum[rp]=sum[rp*2]+sum[rp*2+1];
    }
    int manbaout(int l,int r,int x,int rp){//单点查询
        if(l==r)return sum[rp];
        int mid=(l+r)/2;
        if(x<=mid) return manbaout(l,mid,x,rp*2);
        else return manbaout(mid+1,r,x,rp*2+1);
    }
    int wcis(int l,int r,int k,int rp){//按排名查找函数(寻找第 k 小)
        if(l==r)return r;
        int mid=(l+r)/2;
        if(k<=sum[rp*2]) return wcis(l,mid,k,rp*2);
        else return wcis(mid+1,r,k-sum[rp*2],rp*2+1);
    }
    int frv(int x,int m){//前驱查找
        int k=man(1,m,1,x-1,1);
        if(!k) return -1;
        return wcis(1,m,k,1);
    }
    
    int bav(int x,int sum,int m){//后继查找
        int k=man(1,m,1,x,1)+1;
        if(k>sum) return -1;
        return wcis(1,m,k,1);
    }
    int main(){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            v.push_back(a[i]);
        }
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        int m=v.size();
        int sum=0;
        for(int i=1;i<=n;i++){
            int x=a[i];
            int idx=lower_bound(v.begin(),v.end(),x)-v.begin()+1;
            if(i==1){
                cout<<x<<endl;
                manba(1,m,idx,1,1);
                sum++;
                continue;
            }
            if(manbaout(1,m,idx,1)>0){
                cout<<0<<endl;
                manba(1,m,idx,1,1);
                sum++;
                continue;
            }
            int fr=frv(idx,m);
            int ba=bav(idx,sum,m);
            int ans;
            if(fr==-1)ans=v[ba-1]-x;
            else if(ba==-1)ans=x-v[fr-1];
            else ans=min(x-v[fr-1], v[ba-1]-x);
            cout<<ans<<e
    

    4天前 来自 广东

    1
  • 线段树区修

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int a[1000005],sum[4000005],b[4000005];
    void man(int x){
        sum[x]=sum[x*2]+sum[x*2+1];
    }
    void manba(int x,int y,int c){
        if(x==y){
            sum[c]=a[x];
            return;
        }
        int mid=(x+y)/2;
        manba(x,mid,2*c);
        manba(mid+1,y,2*c+1);
        man(c);
    }
    void wcis(int c,int l,int r){//push_bown
        b[c*2]+=b[c];
        b[c*2+1]+=b[c];
        sum[c*2]+=b[c]*l;
    	sum[c*2+1]+=b[c]*r;
    	b[c]=0;
    }
    void manbaout(int x,int y,int d,int l,int r,int c){//区间查询
        if(x<=l&&y>=r){
    		sum[c]+=d*(r-l+1);
    		b[c]+=d;
    		return;
    	}
        int mid=(l+r)/2;
        wcis(c,mid-l+1,r-mid);
        if(x<=mid){
            manbaout(x,y,d,l,mid,c*2);
        }
        if(y>mid){
            manbaout(x,y,d,mid+1,r,c*2+1);
        }
        man(c);
    }
    int wcismbo(int x,int y,int l,int r,int c){//区间修改
    	if(x<=l&&y>=r){
            return sum[c];
        }
    	int mid=(l+r)/2,ans=0;
    	wcis(c,mid-l+1,r-mid);
    	if(x<=mid){
    		ans+=wcismbo(x,y,l,mid,c*2);
        }
    	if(y>mid){
            ans+=wcismbo(x,y,mid+1,r,c*2+1);
        }
    	return ans;
    }
    signed main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        manba(1,n,1);
        for(int i=1;i<=m;i++){
            int a,b,c,d;
            cin>>a;
            if(a==1){
                cin>>b>>c>>d;
                manbaout(b,c,d,1,n,1);
            }else{
                cin>>b>>c;
                cout<<wcismbo(b,c,1,n,1)<<endl;
            }
        }
        return 0;
    }
    
    

    4天前 来自 广东

    1
  • 线段树单修

    #include<bits/stdc++.h>
    using namespace std;
    int a[100005],sum[400005];
    void man(int x){//求值
        sum[x]=sum[x*2]+sum[x*2+1];
    }
    void manba(int l,int r,int rp){//建树
        if(l==r){
            sum[rp]=a[l];
            return ;
        }
        int mid=(l+r)/2;
        manba(l,mid,rp*2);
        manba(mid+1,r,rp*2+1);
        man(rp);
    }
    int manbaout(int l,int r,int x,int y,int rp){//查询
    	if(x<=l&&y>=r)return sum[rp];
    	int ans=0;
    	int mid=(l+r)/2;
    	if(x<=mid) ans+=manbaout(l,mid,x,y,rp*2);
    	if(y>mid) ans+=manbaout(mid+1,r,x,y,rp*2+1);
    	return ans;
    }
    void wcis(int l,int r,int x,int y,int rp){//更改
        if(l==x&&r==x){
            sum[rp]=y;
            return ;
        }
        int mid=(l+r)/2;
        if(x<=mid) wcis(l,mid,x,y,rp*2);
        if(x>mid) wcis(mid+1,r,x,y,rp*2+1);
        man(rp);
    }
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        memset(sum,127,sizeof(sum));
        manba(1,n,1);
        for(int i=1;i<=m;i++){
            int a,b,c;
            cin>>a>>b>>c;
            if(a==1){
                cout<<manbaout(1,n,b,c,1)<<endl;
            }else{
                wcis(1,n,b,c,1);
            }
        }
        return 0;
    }
    //模板,适用于查询x,y区间所有权值和,改变第x个数为y
    
    

    4天前 来自 广东

    1
  • 其实单点修改可以把区间修改的左右区间填成你要修改的那个点。这样就不用再写一个函数了 QAQ

    3天前 来自 浙江

    0
  • 提个意见,格式上的。每一段字之间隔一个换行会更好

    3天前 来自 浙江

    0
  • 考试我直接收藏帖子直接copy

    4天前 来自 浙江

    0
  • %%%nin zen me zhe me qiang!

    4天前 来自 浙江

    0
  • %%%nin zen me zhe me qiang!

    4天前 来自 广东

    0
  • 来学 12,14,16,19

    5天前 来自 浙江

    0
  • 你咋这么强

    5天前 来自 浙江

    0
  • 怎么收藏帖子

    5天前 来自 浙江

    0

热门讨论