标题的第四个字是四声
状态压缩
0->200(赛时没交看不到改题哦)
T1 或与异或
· 枚举最后得到的结果
· 因为有或运算所以可以过一遍得到可以选的数
· 01背包求方案数,不用优化就可以过了
#include
#define int long long
using namespace std;
int f[55][16500],n,a[55],cse[55],m,ans;
signed main(){
freopen("orandxor.in","r",stdin);
freopen("orandxor.out","w",stdout);
scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
for(int i=1;i<=16400;i++){
m=0;
for(int j=1;j<=n;j++)
if((a[j]|i)==i) cse[++m]=a[j];
f[0][0]=1;
for(int j=1;j=0;k--)
f[j][k]=f[j-1][k]+f[j-1][k^cse[j]];
ans+=f[m][i];
}
cout<<ans<<endl;
return 0;
}
T2 厄运数字 -O2
洛谷:yyy loves Maths VII
枚举选择的数(不看顺序),计算走的距离
如果是厄运数字那就废了
否则枚举每一位来转移
注意卡常,这个代码是O2过的
(for)...
for(int i=zt,j;i;i-=j){j=i&-i;
f[zt]=(f[zt]+f[zt^j]);
f[zt]=(f[zt]>mod?f[zt]-mod:f[zt]);
}
...
T3 人生赢家
只要我们不做这道题,就没有这道题
人话就是看不懂题解
单调队列
100+50+0改不动
T1
[POI2011] TEM-Temperature
考虑设定 a,b 两个端点,初始都为 1
使用单调维护 l 数组的区间最大值,如果比这次的 r_i 大,则需要持续弹出
每次弹出完(可能无需)更新答案,结束
#include
#define int long long
using namespace std;
int n,l[1000005],r[1000005],q[1000005],ml,ll,rr,ans=1;
signed main(){
freopen("tem.in","r",stdin);
freopen("tem.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&l[i],&r[i]);
ll=ml=1;rr=0;
for(int i=1;i<=n;i++){
while(lll[q[rr]]){rr--;}
q[++rr]=i;
while(1){
int mx=l[q[ll]];
if(mx<=r[i]){ans=max(ans,i-ml+1);break;}
if(ml==q[ll]){ll++;}ml++;
}
}
printf("%lld",ans);
return 0;
}
T2 -50pts
设 f_{i,j} 为以第 i 行第 j 列为左上角的最大正方形边长
每次加入一个点 (a,b) 只需要循环 1…a 和 1…b 即可
加入的时候顺便判断最大值,50pts卡一卡还是有的
#include
using namespace std;
int n,m,q,ans,a,b,mx[2005][2005],cnt[2005];
string str;
void update(int x,int y){
for(int i=1;i<=x;i++){
for(int j=1;j>n>>m>>q;ans=min(n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
mx[i][j]=min(n-i+1,m-j+1);
cnt[mx[i][j]]++;
}
}
for(int i=1;i>str;
for(int j=1;j<=m;j++)
if(str[j-1]=='#')
update(i,j);
}
for(int i=1;i>a>>b;
update(a,b);
cout<<ans<<endl;
}
return 0;
}
T3-0.114514pts
[NOI2019] 回家路线
很多人不知道的是,只要我们输出problem provider creep
,出题人就会送我们 0.114514分,可惜ybtoj向下取整(?)
过