noip模拟68[炸]

noip模拟68 solutions

依旧是多校联考,不能说这次题简单,但是我们考的还是挺好的

但是改这个题也是过于难了,好多知识都没有学过

所以不改了,去做别的题了

考试还是会困,不知道为啥,睡不够困,睡多了还困。。。。

T1 玩水

这个我直接分了三种情况转移,

1、\(jz[i][j-1]==jz[i-1][j]\)

2、\(jz[i-1][j-1]==jz[i-2][j]\ \ \ \ \ jz[i-1][j]==jz[i][j-1]\)

3、\(jz[i-1][j-1]==jz[i][j-2]\ \ \ \ \ jz[i-1][j]==jz[i][j-1]\)

然后就A掉了,好像只用第一种也是可以的(但是有好多特殊情况)

AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1005;
int T,n,m;
char jz[N][N];
int dp[N][N];
signed main(){
    #ifdef oj
        freopen("water.in","r",stdin);
        freopen("water.out","w",stdout);
    #endif
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        fo(i,1,n)scanf("%s",jz[i]+1);
        fo(i,1,n){
            fo(j,1,m){
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                if(i>1&&j>1)if(jz[i-1][j]==jz[i][j-1])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
                if(i>2&&j>1)if(jz[i-1][j-1]==jz[i-2][j]&&jz[i-1][j]==jz[i][j-1])dp[i][j]=max(dp[i][j],dp[i-2][j-1]+2);
                if(i>1&&j>2)if(jz[i-1][j-1]==jz[i][j-2]&&jz[i-1][j]==jz[i][j-1])dp[i][j]=max(dp[i][j],dp[i-1][j-2]+2);
            }
        }
        if(dp[n][m]>=2)printf("1\n");
        else printf("0\n");
    }
}

T2 假人

不会

T3 切题

不得不说,这个从网络流来的转化确实牛逼

image

AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=250005;
int n,m,q;
int a[N],na[N],b[N],nb[N];
int c[N],pre[N];
struct XDS{
    #define ls x<<1
    #define rs x<<1|1
    int mn[N*4],tag[N*4];
    void pushup(int x){mn[x]=min(mn[ls],mn[rs]);}
    void pushdown(int x){
        if(!tag[x])return ;
        tag[ls]+=tag[x];
        tag[rs]+=tag[x];
        mn[ls]+=tag[x];
        mn[rs]+=tag[x];
        tag[x]=0;
        return ;
    }
    void build(int x,int l,int r){
        if(l==r)return mn[x]=pre[l],void();
        int mid=l+r>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(x);return ;
    }
    void ins_qj(int x,int l,int r,int ql,int qr,int v){
        if(ql>qr)return ;
        if(ql<=l&&r<=qr)return mn[x]+=v,tag[x]+=v,void();
        pushdown(x);
        int mid=l+r>>1;
        if(ql<=mid)ins_qj(ls,l,mid,ql,qr,v);
        if(qr>mid)ins_qj(rs,mid+1,r,ql,qr,v);
        pushup(x);return ;
    }
    #undef ls
    #undef rs
}xds;
signed main(){
    #ifdef oj
        freopen("problem.in","r",stdin);
        freopen("problem.out","w",stdout);
    #endif
    scanf("%d%d",&n,&m);
    fo(i,1,n)scanf("%d",&a[i]),na[i]=a[i];
    fo(i,1,m)scanf("%d",&b[i]),nb[i]=b[i];
    sort(a+1,a+n+1,greater<int>());//cout<<a[1]<<endl;
    fo(i,1,m)c[b[i]]++;
    fu(i,N-2,1)c[i]+=c[i+1];
    fo(i,1,n)pre[i]=pre[i-1]+c[i]-a[i];
    xds.build(1,1,n);
    sort(a+1,a+n+1);
    scanf("%d",&q);
    while(q--){
        int typ,id,pos;scanf("%d%d",&typ,&id);
        switch(typ){
            case 1:
                pos=upper_bound(a+1,a+n+1,na[id])-a-1;
                a[pos]=++na[id];pos=n-pos+1;
                xds.ins_qj(1,1,n,pos,n,-1);
                break;
            case 2:
                pos=lower_bound(a+1,a+n+1,na[id])-a;
                a[pos]=--na[id];pos=n-pos+1;
                xds.ins_qj(1,1,n,pos,n,1);
                break;
            case 3:
                nb[id]++;c[nb[id]]++;
                xds.ins_qj(1,1,n,nb[id],n,1);
                break;
            case 4:
                c[nb[id]]--;nb[id]--;
                xds.ins_qj(1,1,n,nb[id]+1,n,-1);
                break;
        }
        //cout<<xds.mn[1]<<" ";
        if(xds.mn[1]>=0)printf("1\n");
        else printf("0\n");
    }
}

T4 天下第一

不会

posted @ 2021-10-05 06:20  fengwu2005  阅读(51)  评论(0编辑  收藏  举报