2023.3.28
今天的模拟赛关于位运算。上午的省选模拟赛感觉很抽象,思考了一下没有做,大概能看出来 T1 线段树 or 分块,T2 状压 dp,T3 昨天说过是个虚树。嗯嗯,不会,现在就是看题大概有个思路,但是不会写,基础的也掌握不好,容易理解错题意,这个后期需要通过做题多多练习。(T1 正解他们说是线段树分治,嗯嗯不会,太抽象了,T2 状压不会设状态)。
之前 rating 几乎炸了,今天下午的模拟赛多少骗了点分。(然而只做了一个半小时,感觉这个也需要训练,我认真做题的专注时间无法超过半个小时)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 +10;
int n;
ll m;
char ch[5];
struct{
int op;
ll t;
}a[N];
ll calc(int bit, ll now)
{
for(int i = 1; i <= n; i ++ )
{
ll x = a[i].t >> bit & 1;
if(a[i].op == 1) now &= x;
else if(a[i].op == 2) now |= x;
else now ^= x;
}
return now;
}
int main()
{
scanf("%d%lld", &n, &m);
for(int i = 1; i <= n; i ++ )
{
scanf("%s%d", ch, &a[i].t);
if(ch[0] == 'A') a[i].op = 1;
else if(ch[0] == 'O') a[i].op = 2;
else a[i].op = 3;
}
ll val = 0, ans = 0;
for(int bit = 29; bit >= 0; bit -- )
{
int res1 = calc(bit, 1);
int res0 = calc(bit, 0);
if(val + (1 << bit) <= m && res0 < res1)
val += (1 << bit), ans += res1 << bit;
else ans += res0 << bit;
}
printf("%lld", ans);
}
考场上不会,后来看的算法竞赛进阶指南(真的强大!)上的详解大概就懂了。
大概的思路是:位运算具有一个特点:计算不进位。
那么可以通过二进制的每一位填 0 或 1 构造一个最大的数,让所有的计算拆解到每一位,依次计算后统计每一位的贡献。此时只用注意条件:填 1 最优即这样填不会超出给出的范围、且在进行所有操作后能比填 0 更优(还是 1 ),然后每位统计,按位拆开处理即可。
- 八皇后加强了数据,最后两个点特判一下打表即可(否则会炸。。。题目中还注明不能打表,坑人)。另外我居然还会写八皇后!!!感人呐。
怎么说呢,二进制虽然抽象但真的强大!!!
最近的小反思:
1.阅读题意有障碍:读不懂题目 or 错误的理解题意,导致把题想难然后放弃。
2.做题的随意性太大:有时候看一眼题面,不对口味(?)就直接放弃并跳过,并且大概率题目不会再读第二遍。
3.模拟赛考场上坐不住:很难坚持到 2h 以上,一般打到一半就会很崩溃想放弃。
4.不喜欢打暴力 and 没有拿部分分的习惯:这个不好,之前养成的错误的习惯是看到一个题对味就和它死磕(然后后面的题就不管了,磕到觉得调对了为止,然后就开始摆烂。可以说我的 noip 2022 就是这么挂的,做了 2h 水了水 T1 就开始睡觉了...)。建议每个题都先写写暴力,现在还远远不及一眼正解的水平,写暴力有利于对题目深入的思考,更容易从中 get 到题目的内涵和解决题目的真正要点。另外可以骗点分,哪怕是爆搜。
说到这个,emmm我一直不会爆搜,这阵子才练起来,最暴力的暴力起码不会爆零。
其实最近有些进步了,已经能突破 100 pts 的瓶颈了。相比之前后面的题都不看,我确实有了很大的进步(认真)。但是还需继续练习各题的暴力!
一些解决方案嘛:
1.多做题,多阅读。注意积累,多写题解多交流才能学好 oi !!!
2.emmm,强迫自己打模拟赛时先把每一道题都读一遍!
3.喝水,中间可以去走廊上转转,但是集中注意力不要泄气。
4.emmmm 多练练罢,毕竟现在咱 rating 都靠这个了(悲)。
总结嘛:之前在大实几乎没打过模拟赛,现在在这边 emmmm 受到各方面的打击也在慢慢适应和进步罢。
今年省选咱也去。说给自己:希望能不忘最初的梦想,不忘曾今受过的鼓舞,不忘在旅途中看过那美丽的风景,曾遇见的温暖。很感谢在 oi 圈子里遇见这么多美好的事情,和美好的人。那么请继续坚定且自信的走下去吧!
曾一次次想放弃,一次次又坚持了下去。如果放弃了,我对不起曾今帮助过我、鼓励过我的人,更对不起我自己。
Keep going!!! Fightttttttt!!!!!!