首页 > 其他分享 >『比赛记录』ABC 372

『比赛记录』ABC 372

时间:2024-09-22 20:46:06浏览次数:5  
标签:ch 比赛 Review 然后 st record ABC 372

赛时差点改出了 F,遂写比赛记录纪念。


delete .

ABC 的 T1 一般都直接看完样例就莽的,比如这个就一眼是将字符串中的 . 删去然后输出其他的。

Review record.

B. 3^A

发现 \(M\) 范围很小,可以直接处理出值域内所有三的不同次幂,然后从大的开始减即可。

因为把 \(5\times 10^5\) 当成 \(5\times 10^4\) 然后范围算小了怒吃一发罚时。

Review record.

C. Count ABC Again

单点修改数子串,暴力维护即可。开始先找出来每个串并标记,修改后再判一下就行。

因为判掉标记后没有再搜一次标记然后怒吃一发罚时。

Review record.

D. Buildings

这次的 D 居然不是浪费生命的小模拟。

发现正着很难实现正确复杂度,因为每次的起始高度不同会导致答案不同,硬性修改复杂度就到 \(\mathcal{O(n^2)}\) 了。于是倒着考虑,开始想的是维护一个单调不上升子序列,后来 5k 说假了。然后发现这是一个裸的单调栈,维护一个递减的单调栈,插入元素前栈的大小就是答案。

Review record.

E. K-th Largest Connected Components

一眼启发式合并。看到要求有序想到平衡树了,但一不想打二不太会打于是想别的。然后突然想到之前启发式合并好多就用 set 碾过去了,然后就尝试了一下,学了两个新函数:

  • 合并两个 set 容器:
st[1].insert(st[2].begin(),st[2].end())
  • 取出第 k 个元素(升序):
set<int>::iterator it;
it=st[1].begin();
advance(it,k);

然后并查集稍微维护一下,就 TLE 了,怒吃一发罚时。

5k 提醒 \(k\le 10\),即每个容器维护前十大的元素即可,多了就删点,然后就过了。

Review record.

F. Teleporting Takahashi 2

有点诈骗感的题。

发现 \(m\le 50\),而和这 \(m\) 条边无关的其他点只有一条路能走,这意味着到这些点时只有一种选择,那么我们完全可以将这些点合并到其他有价值的点上去,这样缩完图之后最多只有 \(101\) 个点,范围很小,思路就容易出了。

方案这类问题一般采取 dp 的办法。设 \(f_{i,j}\) 表示在点 \(i\) 花费为 \(j\) 的方案数,外层枚举花费,内层枚举缩完后的每个点,根据连边情况转移,状态转移方程为:

\[f_{v,i}+=f_{j,i-w}\ \ \ (i\ge w) \]

其中 \(v\) 为与 \(j\) 连接的边的终点,\(w\) 为边权。

发现最后有可能停在被合并的点上,于是我们记录每条有缩点的边的边权,最后特殊处理一下即可。

然后是细节处理。

缩点上,考虑记录每条边的出度入度,都为 \(0\) 的就合并掉,遇到其他的点就遇上一个缩完的点连边,记得连最后一个点和起点 \(1\) 的那条边!

dp 边界 \(f_{1,0}=1\),比较易得,其他就是取模问题等小事了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
const int Ratio=0;
const int N=2e5+5,NN=105;
const int mod=998244353;
int n,m,k,tot=1;// 缩后图中点个数
int ds[N],rpre[N],ff[NN];
// 每点度数 映射:原点->缩后点 缩点边权
ll f[NN][N],ans;
struct edge{int u,v;}e[55];
int hh[NN],ne[NN<<1],to[NN<<1],w[NN<<1],cnt;
namespace Wisadel
{
    void Wadd(int u,int v,int va)
    {
        to[++cnt]=v;
        w[cnt]=va;
        ne[cnt]=hh[u];
        hh[u]=cnt;
    }
    short main()
    {
        memset(hh,-1,sizeof hh);
        n=qr,m=qr,k=qr;
        for(int i(1);i<=m;i++) e[i].u=qr,e[i].v=qr,ds[e[i].u]++,ds[e[i].v]++;
        rpre[1]=1;
        int ddd=1,las=1;
        for(int i(2);i<=n;i++)
        {
            if(!ds[i]) ddd++;// 没用的点使边权++
            else rpre[i]=++tot,ff[las]=ddd,Wadd(las,tot,ddd),las=tot,ddd=1;
            // 记录有关变量 连边
        }
        Wadd(las,1,ddd),ff[las]=ddd;
        // 处理最后一个点和边
        for(int i(1);i<=m;i++)
        {
            int u=rpre[e[i].u],v=rpre[e[i].v];
            Wadd(u,v,1);
        }
        f[1][0]=1;
        for(int i(1);i<=k;i++) for(int j(1);j<=tot;j++)
        {// dp
            for(int ee=hh[j];ee!=-1;ee=ne[ee])
            {
                int v=to[ee],va=w[ee];
                if(i>=va)
                    f[v][i]=(f[v][i]+f[j][i-va])%mod;
            }
        }
        for(int i(1);i<=tot;i++)
        {
            ans=(ans+f[i][k])%mod;
            for(int j=1;j<=ff[i]-1;j++) ans=(ans+f[i][k-j])%mod;
            // 计算没到缩点的情况的答案
        }
        printf("%lld\n",ans);
        return Ratio;
    }
}
signed main(){return Wisadel::main();}

Review record.

感觉打的还可以,5k 的鼓舞起了大作用。

再有 20min 可能就改出 F 了,改出 F 可能就上青了,上青了就去打 ARC 没空写这些了。那就是实力还不够吧,再沉淀沉淀,总会有结果的。

集训快乐。


完结撒花~

image

标签:ch,比赛,Review,然后,st,record,ABC,372
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18425155

相关文章

  • ABC372 F 题解
    F-TeleportingTakahashi2先把问题转化一下:把环断开成链,复制\((K+1)\)层,每走一步就相当于前进一层:可以想到一个简单的dp:设\(f(i,j)\)表示走到第\(i\)层第\(j\)个位置的方案数。初始化:\(f(0,1)=1\),其它均为\(0\),表示Takahashi从第\(0\)层的\(1\)位置......
  • ABC372 Review
    ABC372ReviewA语言基础题B类似于二进制拆分,就像跳LCA的时候一样,尽可能多地选大的即可。C一个位置的字母被改变仅仅会对相邻两个位置之类的答案产生影响,暴力统计即可。D对于每一个\(i\)去暴力地统计\(j\)显然是不可行的,所以可以转而想一想每个\(j\)会对答案产生多......
  • 题解:AT_abc372_f [ABC372F] Teleporting Takahashi 2
    题意给出一个\(n\)个点的有向图,点\(i\)连向点\((i+1)\),点\(n\)连向点\(1\)。再给你\(m\)条额外边。你的初始位置为\(1\),问你移动\(k\)步的不同方案数(仅当路径不同时两个方案不同)。思路先想怎样暴力转移,显然移动\(k\)步到达一个点的方案数为所有跟这个点连边的移......
  • 题解:AT_abc372_e [ABC372E] K-th Largest Connected Components
    博客内食用更佳这道题的\(k\le10\)其实没什么用,代码区别仅在于手写平衡树和使用内置容器。这道题让查询与一个节点相连的所有点的信息,所以不难想到并查集。又因为让查询第\(k\)大,所以不难想到平衡树和线段树启发式合并。至此思路明显。我们对并查集中的每个节点开一个平......
  • 题解:AT_abc372_c [ABC372C] Count ABC Again
    博客内食用更佳乍一看好像是数据结构。我们结合题目所求内容考虑。对于每次修改,能对答案产生影响的最多只能是当前字符向前和向后延伸\(2\)个元素所构成的长为\(5\)的子串。那么我们先\(\mathcal{O}(n)\)计算出来初始答案。每次修改的时候,不妨先把\(i-2\simi\)和\(i-......
  • AtCoder Beginner Contest 372(A - F)
    A:直接输出。B:把\(M\)三进制拆分,最多10位,每位最多为2,\(N\le20\)足够了。C:暴力修改,每次只产生\(O(1)\)影响。D:预处理st表,二分每个\(j\)会断哪些\(i\)产生贡献,差分一下。E:启发式合并平衡树,\(k\)更大也能做。F:只保留有特殊边经过的点,把\(i,j\)之间的\(j-i......
  • 南沙C++信奥老师解一本通题:1372:小明的账单
    ​ 【题目描述】小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单…在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的......
  • 【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓
    系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接5.板子调试6.程序设计7.算法学习8.编写exe9.检测标准10.项目举例11.职业规划文章目录方案一、改DMA中断方案二、改数据类型方案三、改数据长度后记方案一、改DMA中断每个DMA通道都可以在DMA传......
  • 2024华为杯|重磅更新优化|研究生数学建模ABCDEF思路、代码、论文助攻|持续优化更新中.
    赠与读者华为杯比赛25号才结束,不要太着急喔,会慢慢持续更新滴。......
  • 2024华为杯|重磅更新优化|研究生数学建模ABCDEF思路、代码、论文助攻|持续优化更新中.
    赠与读者华为杯比赛25号才结束,不要太着急喔,会慢慢持续更新滴。......