样例输入不完,请教各位巨佬

P2801 教主的魔法

xlxl @ 2019-07-16 16:31:06

#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
int QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(int x){
    int l=(x-1)*h+1;
    int r=min(x*h,x);
    for(int i=l;i<=r;i++){
        b[i]=a[i];
    }
    sort(b+l+1,b+r+1);
}
void modify(long long x,long long y,int d){
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++){
            a[i]+=d;
        }
    }
    else{
        for(int i=x;i<=pos[x]*h;i++){
            a[i]+=d;
        }
        for(int i=(pos[y]-1)*h+1;i<=y;i++){
            a[i]+=d;
        }
        for(int i=pos[x]+1;i<=pos[y]-1;i++){
            add[i]+=d;
        }
    }
}
long long find(int x,int v){
    int l=(x-1)*h+1;
    int r=min(x*h,x);
    int mid=(l+r)/2;
    while(l<=r){
        if(a[mid]<v)
            l=mid+1;
        else{
            r=mid-1;
        }
    }
}
long long found(long long x,long long y,long long z){
    int ans=0;
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++){
            if(a[i]+add[pos[i]]>=z){
                ans++;
            }
        }
    }
    for(int i=x;i<=pos[x]*h;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(int i=(pos[y]-1)*h+1;i<=y;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(int i=pos[x]+1;i<=pos[y]-1;i++){
        ans+=find(i,z-add[i]);
    }
}
int main(){
    cin>>n>>m;
    h=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pos[i]=(i-1)/h+1;
        b[i]=a[i];
    }
    if(n%h!=0)
        gg=n/h+1;
    else
        gg=n/h;
    for(int i=1;i<=gg;i++){
        Blocking(i);
    }
    for(int i=1;i<=m;i++){
        cin>>tot>>u>>v>>QMQ;
        if(tot=='M'){
            modify(u,v,QMQ);
        }
        else{
            cout<<found(u,v,QMQ)<<endl;
        }
    }
    return 0;
}

by xlxl @ 2019-07-16 16:42:46

#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
int QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(int x){
    int l=(x-1)*h+1;
    int r=min(x*h,n);
    for(int i=l;i<=r;i++){
        b[i]=a[i];
    }
    sort(b+l,b+r+1);
}
void modify(long long x,long long y,int d){
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++){
            a[i]+=d;
        }
    }
    else{
        for(int i=x;i<=pos[x]*h;i++){
            a[i]+=d;
        }
        for(int i=(pos[y]-1)*h+1;i<=y;i++){
            a[i]+=d;
        }
        for(int i=pos[x]+1;i<=pos[y]-1;i++){
            add[i]+=d;
        }
    }
}
long long find(int x,int v){
    int l=(x-1)*h+1;
    int r=min(x*h,n);
    int mid=(l+r)/2;
    while(l<=r){
        if(a[mid]<v)
            l=mid+1;
        else{
            r=mid-1;
        }
    }
}
long long found(long long x,long long y,long long z){
    int ans=0;
    if(pos[x]==pos[y]){
        for(int i=x;i<=y;i++){
            if(a[i]+add[pos[i]]>=z){
                ans++;
            }
        }
    }
    for(int i=x;i<=pos[x]*h;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(int i=(pos[y]-1)*h+1;i<=y;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(int i=pos[x]+1;i<=pos[y]-1;i++){
        ans+=find(i,z-add[i]);
    }
}
int main(){
    cin>>n>>m;
    h=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pos[i]=(i-1)/h+1;
        b[i]=a[i];
    }
    gg=ceil(n/h);
    for(int i=1;i<=gg;i++){
        Blocking(i);
    }
    for(int i=1;i<=m;i++){
        cin>>tot>>u>>v>>QMQ;
        if(tot=='M'){
            modify(u,v,QMQ);
        }
        else{
            cout<<found(u,v,QMQ)<<endl;
        }
    }
    return 0;
}

无输出。。【可怜】


by 薇草王不留行 @ 2019-07-16 17:27:36

@xlxl 你的tot输入时会把其他的输入吞掉,;

cin>>tot>>u>>v>>QMQ;

应写成


    scanf("%s%d%d%d",tot,&u,&v,&QMQ);

by xlxl @ 2019-07-17 08:34:55

@薇草王不留行 会有空格啊


by xlxl @ 2019-07-17 08:35:22

@薇草王不留行 tot只有一个字符


by 薇草王不留行 @ 2019-07-17 08:45:25

前面的话当我没说, @xlxl 你的find码错了,循环出不来


by xlxl @ 2019-07-17 09:33:06

@薇草王不留行 还是不对,二分蒙了

#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
long long QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(long long x){
    long long l=(x-1)*h+1;
    long long r=min(x*h,n);
    for(long long i=l;i<=r;i++){
        b[i]=a[i];
    }
    sort(b+l,b+r+1);
}
void modify(long long x,long long y,long long d){
    if(pos[x]==pos[y]){
        for(long long i=x;i<=y;i++){
            a[i]+=d;
        }
    }
    else{
        for(long long i=x;i<=pos[x]*h;i++){
            a[i]+=d;
        }
        for(long long i=(pos[y]-1)*h+1;i<=y;i++){
            a[i]+=d;
        }
        for(long long i=pos[x]+1;i<=pos[y]-1;i++){
            add[i]+=d;
        }
    }
}
long long find(long long x,long long v){
    long long l=(x-1)*h+1;
    long long r=min(x*h,n);
    long long tmp=r;
    while(l<=r){
        long long mid=(l+r)/2;
        if(b[mid]<v)
            r=mid-1;
        else{
            l=mid+1;
        }
    }
    return tmp-l+1;
}
long long found(long long x,long long y,long long z){
    long long ans=0;
    if(pos[x]==pos[y]){
        for(long long i=x;i<=y;i++){
            if(a[i]+add[pos[i]]>=z){
                ans++;
            }
        }
    }
    for(long long i=x;i<=pos[x]*h;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(long long i=(pos[y]-1)*h+1;i<=y;i++){
        if(a[i]+add[pos[i]]>=z){
            ans++;
        }
    }
    for(long long i=pos[x]+1;i<=pos[y]-1;i++){
        ans+=find(i,z-add[i]);
    }
    return ans;
}
int main(){
    cin>>n>>m;
    h=sqrt(n);
    for(long long i=1;i<=n;i++){
        cin>>a[i];
        pos[i]=(i-1)/h+1;
        b[i]=a[i];
    }
    gg=ceil(n/h);
    for(long long i=1;i<=gg;i++){
        Blocking(i);
    }
    for(long long i=1;i<=m;i++){
        cin>>tot>>u>>v>>QMQ;
        if(tot=='M'){
            modify(u,v,QMQ);
        }
        else{
            cout<<found(u,v,QMQ)<<endl;
        }
    }
    return 0;
}

|