CSP2021

· · 个人记录

10.23

if(opt==1){
    x=read(),v=read();
    pos=find(a[x],x);
    a[x]=v;
    if(v==b[pos].w){
        continue;
    }else if(v<b[pos].w){
        tmp=find1(v);
        b[pos].w=v;
        sort(b+tmp,b+pos+1,cmp);
    }else{
        tmp=find2(v);
        b[pos].w=v;
        sort(b+pos,b+tmp+1,cmp);
    }
}

T2 由于我写了两种算法(正解&暴力)但是正解写挂了,注释起来,一共有 250 行。

不算写挂的,光是有用的也有 100 行:

#include<bits/stdc++.h>
using namespace std;

int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}

const int MAXN=8005;
int n,q,a[MAXN];
struct node{
    int w,num;
}b[MAXN];

bool cmp(node x,node y){
    if(x.w==y.w)return x.num<y.num;
    return x.w<y.w;
}

int find(int x,int numm){
    int l=1,r=n,mid,ans=0,ansl=0,ansr=0;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w>=x)ansl=mid,r=mid-1;
        else l=mid+1;
    }
    l=1,r=n;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w>x)ansr=mid,r=mid-1;
        else l=mid+1;
    }
    if(ansr)ansr--;
    else ansr=n;
    l=ansl,r=ansr;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].num<=numm)ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}

int find1(int x){
    int l=1,r=n,mid,ans=1;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w<x)ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}

int find2(int x){
    int l=1,r=n,mid,ans=n;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w>x)ans=mid,r=mid-1;
        else l=mid+1;
    }
    return ans;
}

int main(){
    //freopen("sort.in","r",stdin);
    //freopen("sort.out","w",stdout);
    n=read(),q=read();
    for(int i=1;i<=n;++i){
        a[i]=read();
        b[i].w=a[i];
        b[i].num=i;
    }
    sort(b+1,b+n+1,cmp);
    int opt,x,v,pos,tmp;
    while(q--){
        opt=read();
        if(opt==1){
            x=read(),v=read();
            pos=find(a[x],x);
            a[x]=v;
            if(v==b[pos].w){
                continue;
            }else if(v<b[pos].w){
                tmp=find1(v);
                b[pos].w=v;
                sort(b+tmp,b+pos+1,cmp);
            }else{
                tmp=find2(v);
                b[pos].w=v;
                sort(b+pos,b+tmp+1,cmp);
            }
        }else{
            x=read();
            cout<<find(a[x],x)<<endl;
        }
    }
    return 0;
}
/*
3 4
3 2 1
2 3
1 3 2
2 2
2 3
*/
/*
#include<bits/stdc++.h>
using namespace std;

int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}

const int MAXN=8005;
int n,q,a[MAXN];
struct node{
    int w,num;
}b[MAXN];

bool cmp(node x,node y){
    return x.w<y.w;
}

int find(int x,int numm){
    int l=1,r=n,mid,ans=0,ansl=0,ansr=0;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w>=x)ansl=mid,r=mid-1;
        else l=mid+1;
    }
    l=1,r=n;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].w>x)ansr=mid,r=mid-1;
        else l=mid+1;
    }
    if(ansr)ansr--;
    else ansr=n;
    l=ansl,r=ansr;
    while(l<=r){
        mid=l+r>>1;
        if(b[mid].num<=numm)ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}

int main(){
    freopen("sort.in","r",stdin);
    //freopen("sort.out","w",stdout);
    n=read(),q=read();
    for(int i=1;i<=n;++i){
        a[i]=read();
        b[i].w=a[i];
        b[i].num=i;
    }
    sort(b+1,b+n+1,cmp);
    int opt,x,v,pos,tmp;
    q=10;
    while(q--){
        opt=read();
        if(opt==1){
            x=read(),v=read();
            pos=find(a[x],x);
            tmp=pos;
            if(v==b[pos].w)continue;
            else if(v<b[pos].w){
                for(int i=pos;i>=1;--i){
                    if(b[i].w==v){
                        if(b[i].num<x){
                            tmp=i+1;
                            break;
                        }
                    }else if(b[i].w<v){
                        tmp=i+1;
                        break;
                    }
                }
                //[tmp,pos-1]->[tmp+1,pos]
                for(int i=pos-1;i>=tmp;--i){
                    b[i+1].w=b[i].w;
                    b[i+1].num=b[i].num;
                }
                b[tmp+1].w=v;
                b[tmp+1].num=x;
            }else{
                for(int i=pos;i<=n;++i){
                    if(b[i].w==v){
                        if(b[i].num>x){
                            tmp=i-1;
                            break;
                        }
                    }else if(b[i].w>v){
                        tmp=i;
                        break;
                    }
                }
                //[pos+1,tmp]->[pos,tmp-1]
                for(int i=pos;i<=tmp-1;++i){
                    b[i].w=b[i+1].w;
                    b[i].num=b[i+1].num;
                }
                b[tmp-1].w=v;
                b[tmp-1].num=x;
            }
            a[x]=v;
        }else{
            x=read();
            cout<<find(a[x],x)<<endl;
        }
    }
    return 0;
}
*/
/*
10 10
877332633 234569527 229171089 600324455 1458624 887548760 574229391 234569527 202374341 849045846
2 7
1 2 234569527
1 4 600324455
2 6
2 9
2 6
2 3
1 5 246345024
1 6 856960762
2 7

*/

中午睡觉。

代码里写的是 (

我自己也知道是 (

输入时输入的是 <

。。。。。。

要是有这 1h T1 肯定冲出来了。

中间抽空看了一下 T4 的题意,感觉不可做。

晚上吃完饭回家去测 pj 和 tg。

洛谷的 pj 挂成狗。

100+92+65+30=287

很离谱。

T2 的稍微优化是有作用的,同学的直接 sort 只有 76

T3 挂了,有可能是这个原因:link,但还是似乎有数据能卡掉我 T3,考场上也没时间检查了。

T4 只有 30,而且 30 的很离谱:

别人的 30

我的 30

jsk 还比洛谷少,只有 100+76+65+0=241,而且 T3 也是这几个点挂了:

我感觉 T3 用的可能是同样的数据?

优化并没有起作用。

T4 boom 0 了,但是考场上大样例都过了。。。

T4:可能是没注意格式吧。

看官方结果吧,可能在 [241,322] 之间?

然后测 tg,先去 InfOJ 上测的:

40+10+28+0=78

垫底喽,不知道官方数据几分。

洛谷上也有了,m1 和 m2 差的较大可以把我卡掉一些分......

T2 还是 10 分,可能 T2 用的可能是同样的数据?

后面发现我 T1 调挂的线段树好像可以过?

妈的浪费时间在 T2 暴力上了还挂了,白扔 100 分。

反正爆蛋了,几乎没有给自己留下充足的思考时间,全在调暴力,浪费时间在调代码上,蓝勾没了。

先读清楚题意再写!留下充足的思考时间!

提高代码能能力!提高调试能力!

合理分配时间!出考场才发现就花了 20 分钟打暴力的 T3 不是很难,合理分配时间是可以冲出来的!

从臆想中的 100+15+100+0 掉到了爆蛋哈哈哈不愧是我正式赛没有一次发挥好!

草普及 T4 n^2 暴力都能有 70,我是输在了没对拍上吗,垃圾样例