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

  莫队。
  这题就两个点:

  1. 莫队询问区间的子区间信息往往转化为前缀之间的cnt计数。
  2. 考虑到异或的自反性 \(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\)

posted @ 2023-08-30 14:00  ussumer  阅读(20)  评论(0)    收藏  举报