2024 暑假友谊赛-热身1

[ABC102D] Equal Cut - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:找在区间[2,n-1]中找到i,j,k三个点,把序列分割成4个区间:[1,i],[i+1,j],[j+1,k],[k+1,n] 暴力的做法是枚举i,j,k加上前缀和是o(n^3)的 key:"考虑枚举处于中间的j,然后用i平衡左两个区间,用k右两个区间" 如果想四个区间总和的极差最小,那么i和k肯定是处于平衡点中.i尽量平衡左两个区间,k尽量平衡右两个区间. 因为在枚举j,第二个区间是增长的,第一个区间是不变的,那么i需要往右靠 类似的,那么第三个区间是减少的,第四个区间是不变的,那么k也需要往右靠 i和k都要根据每次j的移动,找到平衡点.而新的平衡点肯定是在原本的基础上往右移动或不动.!@

int n;
int pre[200005];
题意:把序列分为四个连续的区间,使得max(sum1,sum2,sum3,sum4)-min(sum1,sum2,sum3,sum4)最小
思路:找在区间[2,n-1]中找到i,j,k三个点,把序列分割成4个区间:[1,i],[i+1,j],[j+1,k],[k+1,n]
暴力的做法是枚举i,j,k加上前缀和是o(n^3)的
key:"考虑枚举处于中间的j,然后用i平衡左两个区间,用k右两个区间"
如果想四个区间总和的极差最小,那么i和k肯定是处于平衡点中.i尽量平衡左两个区间,k尽量平衡右两个区间.
因为在枚举j,第二个区间是增长的,第一个区间是不变的,那么i需要往右靠
类似的,那么第三个区间是减少的,第四个区间是不变的,那么k也需要往右靠
i和k都要根据每次j的移动,找到平衡点.而新的平衡点肯定是在原本的基础上往右移动或不动.!@
[ABC102D] Equal Cut
https://www.luogu.com.cn/problem/AT_arc100_b
void solve(){           D       区间..补题补题
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>pre[i];
        pre[i]+=pre[i-1];
    }
    int ans=1e15;
    int i=1,j=2,k=3;
    while(j<=n-1){     j<=n-1
        这里是前两个区间在作差,如果i移动前的区间差值比i移动后的区间差值大,那么i进行移动,两个区间的差值便缩小了
        i往右移动时,区间一在递增,区间二在递减,这样总会存在一个最小的区间差值.后两个区间同理.
        while(i+1<j&&abs(pre[j]-pre[i]-pre[i])>abs(pre[j]-pre[i+1]-pre[i+1])) i++;     加绝对值
        while(k+1<n&&abs(pre[n]-pre[k]-(pre[k]-pre[j]))>abs(pre[n]-pre[k+1]-(pre[k+1]-pre[j]))) k++;
        ans=min(ans,max({pre[i],pre[j]-pre[i],pre[k]-pre[j],pre[n]-pre[k]})
                    -min({pre[i],pre[j]-pre[i],pre[k]-pre[j],pre[n]-pre[k]}));
        j++;
    }
    cout<<ans;
}

[ABC297G] Constrained Nim 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

不能暴力求了,得推导公式(not easy)..或者暴力求sg打表找规律(更可能实现)
通过打表找规律发现,不同的l,r,计算sg(x)的公式为sg(x)=(x%(l+r))/l;
规律..不好发现..但是也不是说完全不能发现...循环的部分x%(l+r)是好发现的.但是除以L就没发觉了..
int n,l,r;
int sg[55];
int getSG(int x){
    if(sg[x]!=-1) return sg[x];
    vector<int> vis(55,0);
    for(int i=max(x-r,0ll);i<=x-l;i++) vis[getSG(i)]=1;
    int mex=0;
    while(vis[mex]) mex++;
    return sg[x]=mex;
}
这题有2e5堆石子,每堆石子有1e9个石头,每次可以取[l,r]个,并且l,r取值最大也是1e9。数据范围这么大怎么求sg?
不能暴力求了,得推导公式(not easy)..或者暴力求sg打表找规律(更可能实现)
通过打表找规律发现,不同的l,r,计算sg(x)的公式为sg(x)=(x%(l+r))/l;
规律..不好发现..但是也不是说完全不能发现...循环的部分x%(l+r)是好发现的.但是除以l就没发觉了..
[ABC297G] Constrained Nim 2
https://www.luogu.com.cn/problem/AT_abc297_g
void solve(){          nim
//    cin>>l>>r;
//    for(int i=0;i<=50;i++) sg[i]=-1;  init
//    sg[0]=0;
//    for(int i=1;i<=50;i++) getSG(i);
//    for(int i=0;i<=50;i++) cout<<sg[i]<<" ";
    cin>>n>>l>>r;
    int ans=0;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        ans^=( (x%(l+r))/l );
    }
    if(ans!=0) cout<<"First";
    else cout<<"Second";
}

还没补出来的题:

Unlucky Numbers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)--数位dp

[ABC297G] Constrained Nim 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)--sg函数--已补2024.8.3

[ABC108D] All Your Paths are Different Lengths - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)-紫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值