8.30
今天也先是校内OJ的题
因子
突然想起来好像以后不在学校了也用不了这个链接。
不管了。
被我\(O(n^2\sqrt{a[i]})\)水过了,我不好评价。
做法是钦定一个必选的点然后对它求质因数,直接枚举其他的点能否在这个质因数下选。
移除石子
做法依旧有点问题,只有90分。
我先对所有点对按x,y升序排序。这样我就可以在框正方形的时候对右下区域无限制。
但是这个有问题, 你会遇到多个在同一列的点,然后前面一个点又很高,那么按照之前的逻辑这个就会框入不止一个点。
我们可以直接对这种情况特判:把所有的在这个对应列的点录入,然后重新按照y降序排序。
这样保证先框入小矩阵的.
很遗憾,还是不对.
我不好说,大概是三个全选的情况,这个也要特判,就是矩阵左移0.1让他少选入一个
抓内鬼
这个题目是你可以先去写部分分,然后确定做法.
我们发现对于 \(u_i \in \{1,n\} 或 v_i \in \{1,n\}\)
我们可以直接 1 放 U, n 放 P,然后后面无论怎么放都是必然被抓住的。
那么对于一般图这个也是对的。
把所有的 U 都塞入 1 的周围,满了就是得解了,未满就是 P 来得解。
因为\(d[1]+d[n]<=n\)所以说一定得解
异或序列
这个的\(O(n^4)\)的做法是裸的,然后想怎么\(O(n^2)\)
由于原来的状态不好再去优化了,我们要更改状态。
设\(dp[i]是指以i结尾的答案数量.那么有转移\)
F(j,1,i-1)(dp[i]+=dp[j])%=mod;
F(j,1,i-1){
int k=i^j;
if(k<j)dp[i]=(dp[i]-dp[k]+mod)%mod;
}
然后考虑\(O(nlogn)\)的做法:
第一部分的枚举显然可以前缀和.
我们考虑在后一部分也利用上这个前缀和.
\(实际上,这个k是一个连续段,当100000可以时,100000-111111都是可以的\)
(dp[i]+=s[i-1])%=mod;
int x=i,b=1;
while(x>1){
if(x&1)dp[i]=(dp[i]-s[(b<<1)-1]+s[b-1]+mod)%mod;
x>>=1;
b<<=1;
}
s[i]=(s[i-1]+dp[i])%mod;
接下来是自己练的题
解方程
哈希题,就是暴力哈希,交了几次没过是没注意到最后\(i=0\)时不用乘 \(x\) 。
XOR and Favorite Number
莫队。
这题就两个点:
- 莫队询问区间的子区间信息往往转化为前缀之间的cnt计数。
- 考虑到异或的自反性 \(a \oplus b ==c \rightarrow a == c\oplus b\) , 那么你的\(add/del\)就很好做了。
美好的每一天
首先考虑本题的性质,你可以发现问的就是只有一个数出现奇数次或者没有数出现奇数次。
接下来就是本题的一个突破口了。
为了每个字母能够不冲突地统计信息,直接二进制状压。
就是说 $a \rightarrow 0 ,b \rightarrow 1…… z \rightarrow 25 $
出现过奇数次就是1.
后面就很好说了,和上题是一样的,贴个代码方便解释:
void add(int x){
for(int i=0;i<=25;++i){
tot+=cnt[(1<<i)^s[x]];
}
tot+=cnt[s[x]];
cnt[s[x]]++;
}
void del(int x){
cnt[s[x]]--;
tot-=cnt[s[x]];
for(int i=0;i<=25;++i){
tot-=cnt[(1<<i)^s[x]];
}
}
注意空间问题,\(\oplus\)的值域会超过\(1<<25\) , 开\(1<<26\)。

浙公网安备 33010602011771号