SRM 551 Div1

Topcoder SRM551 Div 1 1000:SweetFruits(矩阵树+容斥) 题解: 考虑枚举哪几个水果是甜的。 发现如果枚举的数量一样,那么对答案的贡献也一样。那么可以根据枚举数量来一起处理。 枚举完数量kkk之后,甜与半甜的不连边,然后跑矩阵树,得到小等于kkk的甜的水果的生成树数量。 因为之前的已经处理过,直接减掉就好。 注意减去的时候要减去组合数,因为这k个中任意组合都会被统计。 之后问题变为了数量kkk, 值小等于vvv的个数,这个直接折半就行了。 ... 阅读详情

noip d2t3 没清数组实力滚粗,赶紧做一波SRM 冷静一下。。。。

250pts

最终答案里至少有一个点没改变位置。因此枚举没改变位置的点,然后把两边和他同色的点移过来的花费排个序,从小到大往里加,直到超过最大花费,更新一下答案。

#include <bits/stdc++.h>
using namespace std;
int n,top,cnt,sum,ans;
int st[110];
class ColorfulChocolates
{
public:
    int maximumSpread(string s,int m)
    {
        n=s.size();
        for(int i=0;i<n;i++)
        {
            top=0;cnt=0;
            for(int j=i-1;j>=0;j--)
                if(s[j]==s[i])
                    st[++top]=i-j-cnt-1,cnt++;
            cnt=0;
            for(int j=i+1;j<n;j++)
                if(s[j]==s[i])
                    st[++top]=j-i-cnt-1,cnt++;
            sort(st+1,st+1+top);
            sum=0;int j=0;
            for(j=1;j<=top;j++)
            {
                if(sum+st[j]>m)break;
                sum+=st[j];
            }
            ans=max(ans,j);
        }   
        return ans;
    }
}cls;

450pts

第一次见到450的题。
就是一个最短路,如果map[i][j]==′Y′那么i到j有一条长度为∑k<jmap[i][k]==′Y′的边,然后跑0到n-1的最短路。

#include <bits/stdc++.h>
using namespace std;
int f[55],inq[55],n,inf;
queue<int>q;
class ColorfulWolves
{
public:
    int getmin(vector<string> s)
    {
        n=s.size();
        memset(f,0x3f,sizeof(f));
        inf=f[0];inq[0]=1;f[0]=0;
        q.push(0);
        while(!q.empty())
        {
            int tmp=q.front();q.pop();
            int cnt=0;inq[tmp]=0;
            for(int i=0;i<n;i++)
                if(s[tmp][i]=='Y')
                {
                    if(f[tmp]+cnt<f[i])
                    {
                        f[i]=f[tmp]+cnt;
                        if(!inq[i])
                            q.push(i),inq[i]=1;
                    }
                    cnt++;
                }
        }
        return f[n-1]==inf ? -1:f[n-1];
    }
}cls;

1000pts

感觉这题还是挺强的。。。
大概看到40左右的数据就要想meet in the middle呀
考虑枚举最终真甜的个数k,然后第一步是求k个甜的水果,甜度和<=最大甜度 的方案数。这个可以用meet in the middle做,复杂度O(2n/2∗n)
然后求最后得到k个真甜的树的个数。可以用矩阵树定理。真甜的和真甜的,真甜的和不甜的,半甜的和不甜的,不甜的和不甜的连无向边。然后跑矩阵树定理。
不过这样跑出来是小于等于k个真甜的树的个数。
用小于k个真甜的所有容斥一下就行了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
vector<int>v1[21],v2[21];
int n,m,ans,top;
int way[51],mp[51][51],du[51],tree[51],C[51][51],st[51];
int get(int x,int y,int mx)
{
    int ret=0;
    if(x>n/2||y>n-n/2)return 0;
    for(int i=0,j=v2[y].size()-1;i<v1[x].size();i++)
    {
        while(j>=0&&v2[y][j]+v1[x][i]>mx)j--;
        ret=(ret+j+1)%mod;
    }
    return ret;
}
void ade(int x,int y)
{
    du[x]++;du[y]++;
    mp[x][y]=mp[y][x]=mod-1;
}
int qpow(int x,int y)
{
    int ret=1;
    while(y)
    {
        if(y&1)ret=(ll)ret*x%mod;
        x=(ll)x*x%mod;y>>=1;
    }
    return ret;
}
int solve(int n)
{
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        int pos=-1;
        for(int j=i;j<n;j++)
            if(mp[j][i])pos=j;
        if(pos==-1)return 0;
        if(pos!=i)cnt++;
        for(int j=0;j<n;j++)
            swap(mp[pos][j],mp[i][j]);
        for(int j=i+1;j<n;j++)
            if(mp[j][i])
            {
                int t=(ll)qpow(mp[i][i],mod-2)*mp[j][i]%mod;
                for(int k=i;k<n;k++)
                    mp[j][k]=(mp[j][k]-(ll)mp[i][k]*t%mod+mod)%mod;
            }
    }
    int ret=1;
    for(int i=0;i<n;i++)
        ret=(ll)ret*mp[i][i]%mod;
    return cnt&1 ? mod-ret:ret;
}
class SweetFruits
{
public:
    int countTrees(vector<int>val,int mx)
    {
        n=val.size();
        for(int i=0;i<=n;i++)C[i][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=i;j++)
                C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
        for(int i=0;i<n;i++)
            if(val[i]!=-1)st[top++]=val[i];
        for(int i=0;i<1<<(top/2);i++)
        {
            int cnt=0,sum=0;
            for(int j=0;j<top/2;j++)
                if(i>>j&1)cnt++,sum+=st[j];
            v1[cnt].push_back(sum);
        }
        for(int i=0;i<1<<(top-top/2);i++)
        {
            int cnt=0,sum=0;
            for(int j=0;j<(top-top/2);j++)
                if(i>>j&1)cnt++,sum+=st[j+top/2];
            v2[cnt].push_back(sum);
        }
        for(int i=0;i<=n/2;i++)
            sort(v1[i].begin(),v1[i].end());
        for(int i=0;i<=n-n/2;i++)
            sort(v2[i].begin(),v2[i].end());
        for(int i=0;i<n;i++)
            if(val[i]!=-1)m++;
        for(int i=0;i<=m;i++)
        {
            for(int j=0;j<=i;j++)
                way[i]=(way[i]+get(j,i-j,mx))%mod;
            memset(mp,0,sizeof(mp));
            memset(du,0,sizeof(du));
            for(int j=0;j<i;j++)
            {
                for(int k=j+1;k<i;k++)ade(j,k);
                for(int k=m;k<n;k++)ade(j,k);
            }
            for(int j=i;j<m;j++)
                for(int k=m;k<n;k++)ade(j,k);
            for(int j=m;j<n;j++)
                for(int k=j+1;k<n;k++)ade(j,k);
            for(int j=0;j<n;j++)mp[j][j]+=du[j];
            tree[i]=solve(n-1);
            for(int j=0;j<i;j++)
                tree[i]=(tree[i]-(ll)tree[j]*C[i][j]%mod+mod)%mod;
            ans=(ans+(ll)tree[i]*way[i]%mod)%mod;
        }
        return ans;
    }
}cls;
Topcoder SRM 100 场计划 SRM 550 Div1 250 按题意模拟,注意判断边界是否被访问时,以后的路径不能算上 SRM 550 Div1 500 一道找规律题,打个表 SRM 550 Div1 1000 矩阵快速幂题,每个位置是该位置需要多少次才能转到目标态,先让他转到目标态的贡献减去之后,剩下就只剩下自己转圈的贡献了,我们发现这样的贡献在每个位置都相同,就可以算出最大旋转次数. 然后状态就是 有多少个需要两步到... 阅读详情

相关推荐

Ubuntu20.04运行Vins-fusion

因已安装ROS noetic,eigen,opencv及ceres等库,这部分环境配置就不细讲,直接下载VINS-FUSION的代码库 下载编译 cd ~/vins-fusion/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ../ catkin_make source ~/catkin_ws/devel/setup.bash 编译时会发现一堆错误,别急,无非就是环境冲突问题,一个个解决 1)首先,ROS

xiaojinger_123的博客 1万+

SRM551 Div1 Medium

Colorful Wolves 题意: 有一只狼可以把自己的颜色在nnn种颜色之间切换,每次切换需要花费一天的时间,颜色编号为0∼n−10∼n−10∼n−1,给定n×nn×nn×n的由'Y'′Y′′Y′和'N'′N′′N′组成的字符矩阵colormapcolormapcolormap,colormap[i][j]='Y'colormap[i][j]=′Y′colormap[i][j]=′Y...

Caristra的博客 559

基于立创开源ESP32步进电机驱动板硬件设计与优化实践

本文详细介绍了基于立创开源平台的ESP32步进电机驱动板硬件设计与优化实践。重点解析了ESP32-PICO-D4与A4950驱动芯片的选型搭配、电源电路噪声隔离、PCB布局布线技巧以及保护电路设计,为开发者提供了从原理图到PCB的完整优化方案,有效提升驱动板的性能与稳定性。

7z8x2c4v6b9的博客 647

[矩阵树定理 容斥 meet in middle] Topcoder SRM 551 DIV1 Hard. SweetFruits

枚举最后的树中有多少个是truly sweet的 答案就是 ∑i=0nfi×gi \sum_{i=0}^n f_i\times g_i 其中,fif_i 表示选出 ii 个水果使其价值和不超过Limit的方案数 gig_i 是有 ii 个truly sweet的生成树个数fif_i 可以meet in middle 设图中前 ii 个点是truly sweet, i+1i+1 到 kk 是s

CE玩家 712

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6475

图像加密与解密(附matlab代码)

详细介绍了三种图像加密解密原理,并基于matlab开发了一套相应系统。

2441

srm 551

资瓷点此阅读QvQ250Description题意:一个长度最多5050的字符串,每次操作可以交换相邻的两个字符,问,经过最多MaxSwapsMaxSwaps次交换之后,最多能让多少个相同的字符连起来Solution枚举一个字符,让其他字符往这里即可,取最小即可Code#include <bits/stdc++.h> using namespace std; #define pb push_back

mlzmlz95的专栏 471

OpenHarmony自定义Launcher

OpenHarmony源码版本:4.0release开发板:DAYU / rk3568DevEco Studio版本:4.0.0.600切换分支为OpenHarmony-4.0-Release,并下载源码。

Abner_Crazy的博客 1630

SRM551

1.ColorfulBricks #include #include using namespace std; class ColorfulBricks { public: int countLayouts(string bricks) { int a[26],cnt=0; memset(a,0,sizeof(a)); int sz = bricks.size(

da_fan_shu_的专栏 402

OpenCode:终端开源AI编程助手,多模型接入与实战指南

AI编程助手正在从IDE侧边栏走向终端环境。其核心原理是让模型直接读取项目文件、执行命令、查看报错,形成从诊断到修复的完整闭环,从而解决传统插件上下文割裂的问题。技术价值在于开源透明、模型无关,既可接入OpenAI等云端服务,也能通过Ollama连接本地模型,兼顾数据安全与离线场景。在工程实践中,它适用于长时间驻留项目、自动修Bug、团队统一AI工具链等需求。OpenCode正是这样一款终端AI助手,支持灵活配置第三方API密钥,提供免费档与Go套餐,并通过Skills技能系统让模型遵循标准操作流程。同时,

weixin_28745821的博客 327

高通camera:PDAF的配置与测试

确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。

arvin_xiong的博客 2489

【矩阵树定理+容斥】Topcoder SRM 551 DIV1 Hard SweetFruits (TC12141)

【前言】 吐槽一下TC的交代码,在SRMs的练习模式那里交每提交一次分数上限会少一点,于是根本不知道过没过。在VJ上交才知道过了。 当然可能是我太菜了。 【题目】 Topcoder 给定nnn个权值,要么非负,要么为−1-1−1,你现在可以用n−1n-1n−1条边连接这些权值得到一棵树。我们称一个权值是有用的当且仅当它它和至少一个非负权值相连且它本身不为负,这棵树的权值为所有有用的权值之和。 求有...

MEET YOU FIRST TIME 338

通信原理 | 窗函数 | 矩形窗 | 汉宁窗 | 汉明窗 | 布莱克曼窗 | 补零对频谱的影响

比如,原信号是一个周期的余弦信号,又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补零并没有带来新的信息!频谱分辨率的含义是两个频率不同的信号在频率上可分,也就要求他们不能落到一个频域函数的主瓣上,所以,如果待分析的两个信号频率接近,而时域长度又短,那么在频域上他们就落在一个频域函数的主瓣内了,补再多的零也无济于事。而形状(主瓣宽度)是由补零之前的信号长度决定的,补零的作用只是细化了频域序列,并没有改变其主瓣宽度。所以,汉宁窗牺牲了分辨率,换来了旁瓣泄露的减小。

若北辰 1305

[meet in middle 矩阵树定理 容斥原理] SRM 551 div1 SweetFruits

集训队论文传送门大概就是我们先用meet in middle求出有恰好k个真甜的方案数 然后我们求这些东西的生成树个数 乘在一起的和就是答案 我们让真甜连真甜 真甜连不甜 假甜连不甜 不甜连不甜 跑一发矩阵树定理 这样只能保证这些真甜的某个子集是真甜 那么我们需要用 0~k-1 的简单容斥一下// BEGIN CUT HERE #include<conio.h> #include<sstr

雯舞 755

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[容斥原理][Meet-in-middle][Matrix-Tree定理] SRM551 Div1 Hard SweetFruits

SolutionSolutionSolution 将原问题分成两个子问题。 从所有甜的水果中选出kkk个水果作为真甜的,要求他们甜度之和不超过maxSweetnessmaxSweetnessmaxSweetness的方案数cntkcntkcnt_k 令nnn为甜的水果数目,求出组成的树的方案数treektreektree_k使得nnn个甜的水果中恰有kkk个水果为真甜的。 ans=∑k=0...

Vectorxj的博客 632

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TC SRM 551 div2 题解

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 终于在TC过了两题,可惜第三题看错了题目。 250pt:只需要判断有几种颜色即可。 class ColorfulBricks{ public: int countLayouts(string bricks){ bool

窝不是爱酱,喵~~~~ 2361

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SRM 551 DIV2

250pt 题意:   给定字符串,求使至多有一对相邻字符不同的排列数。 分析:   至多有一对就说明至多只有两种字符,答案只可能是0(多于两种字符),1(一种字符),2(两种字符)。 View Code #include <cstdlib> #include <cctype> #include <cstring&g...

dasu9538的博客 124

PTA刷题避坑指南:为什么你的‘支票面额’C程序会超时?

本文深入分析了PTA平台上'支票面额'C程序超时的常见原因,包括逻辑运算符误用、循环范围错误和缺少提前终止机制。通过详细的调试技巧和优化方案,帮助编程初学者避免类似错误,提升刷题效率。文章特别强调了PTA刷题中的关键注意事项和实用调试方法。

weixin_33747129的博客 305

【TopCoder SRM 551 Div2】Solutions

【250】   Beaver Bindu has some colored bricks. Each color is described by an uppercase letter. Bricks of each color all look exactly the same. You are given a string bricks. Each character of bricks r...

weixin_33928137的博客 173

SRM 551 div2

错过了。。。当练习做的。 250pt 略   500pt 怎么开始就没敢写暴力呢。。。。看别人的思路,挺巧妙的。Orz class ColorfulChocolates { public: int maximumSpread(string c, int m) { int l = c.length(), i, j, num, cnt; i...

weixin_34253539的博客 105

TC SRM551 DIV2 500 ColorfulChocolates 暴力

题目大意:给一个由A-Z组成的字符串,最大转换maxSwaps次,问连续相同字符串最多多少。 代码: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ

小白滴acm之路 533

SRM 551 div2 950(DP, 环形+优化)

题意: 把n个蛋糕(最多3种颜色)按1…n放成一圈。 要求相邻的蛋糕颜色不同,求有多少种放法。 思路: f[i][j][k][first][last]f[i][j][k][first][last] 表示A, B, C各有i, j, k且第一个是first, 最后一个位last的方法数。 边界: i+j+k = 1, return 1 i+k+j = 2, return first =

slowlight93的专栏 608
上一篇: bzoj 4296 [PA2015]Mistrzostwa 宽搜 并查集
下一篇: hdu5307 He is Flying FFT
make_it_for_good
博客等级 码龄11年 13粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值