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 切题
不得不说,这个从网络流来的转化确实牛逼
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 天下第一
不会
QQ:2953174821