5.2总结

今天又是考的非常糟糕的一天

t1看错题了,想了半个小时没想出来55分,气而转t2,想完60分以后,想正解,我**了,竟然没想起来s={a,z}|{A,Z},还以为s里随便取的,然后是t3,看了一眼好像见过,但是好像没写,推了一会dp感觉不能做,就看t4去了,t4想了很长时间,一直以为是组合数+构造什么的,质因子数==2想了一会头疼就算了,一看表就9点多了,回去看t1,打了暴力过不了样例,仔细一看题,发现一直都看错题了,hehe,赶紧写完55分一看9.44,想了一会以为是什么神仙数据结构,就走额,很快把第二题暴力打完就走了,t3暴力都不会,赶紧走额,打了t4的暴力,还行,打完就11.20了,无意间发现质因子数==2的情况可以打表,但是来不及了,于是赶紧打了10的几次方的表,就交了

反思:

看题看错,太**了。

没有思路,就再看一眼题面,看着像打表的就先写,注意数据里的标出来的特殊信息

题解:

t1:

发现 a[i] 对于答案的贡献就是它被包含的次数,经过手推,发现只有当区间长度为奇数,并且是区间的第一个数,第三个数,第r-l+1个数时才有贡献,套一个树状数组就行了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],n;
int c[N][2];
void add(int x,int v)
{
    int k=x&1;
    while(x<=n)
    {
        c[x][k]^=v;
        x+=x&-x;
    }
}
int query(int x)
{
    if(x<0) return 0;
    int res=0;
    int k=x&1;
    while(x)
    {
        res^=c[x][k];
        x-=x&-x;
    }
    return res;
}
int main()
{
//    freopen("xor.in","r",stdin);
//    freopen("xor.out","w",stdout);
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) add(i,a[i]);
    int l,r,ok;
    while(m--)
    {
        scanf("%d %d %d",&ok,&l,&r);
        if(ok==1) add(l,a[l]^r),a[l]=r;
        else {
            if((r-l+1)%2==0) {
                printf("0\n");
                continue;
            }
            printf("%d\n",query(r)^query(l-2));//保持 奇偶性 
        }
    }
    return 0;
}

t2:

hehe,map记一下差分数组就行了

t3:

奇怪的dp

f[c][x][y][z] 当前点是颜色c,已经用了x个颜色0,y个颜色1,z个颜色2

不同颜色转移一下就好了,注意两个状态之间转移的贡献不是直接走过去

t4:

奇怪的爆搜

明天再说吧

原文地址:https://www.cnblogs.com/xsm098/p/14726209.html