21.10.14 test
题目 WOJ5078 到 WOJ5081
T1 Problem A \(\color{green}{100}\)
由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成环。然后要求边权和最大的最大的。那么题意就是求 \(k\) 颗最大生成树。
先把边按边权从大到小排,考虑朴素 Kruscal ,维护 \(k\) 次并查集,复杂度 \(O(km)\) 过不去。考虑同时维护 \(k\) 个并查集,那么枚举每条边,将其加入到第一个 \(u,v\) 不连通的并查集中。由于每次都要求加入到最前面的并查集,那么任意 \(u,v\) 的连通性一定是单调的,也就是前面不连通,后面联通,所以每次二分找这个并查集。
下面是我赛时的做法。
我赛时写的神秘优化也跑的飞快,估计是出题人没有想到这种优化,没有刻意卡。是对每次 \(O(k)\) 找加入的并查集的优化。有点像 Dinic 的当前弧优化,就是从上一次对 \(u,v\) 边找到的并查集的下一个开始找,显然重边越多跑的越快。
code:
#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=1e3+5;
const int M=3e5+5;
const int K=1e4+5;
struct edge{
int u,v,w,o;
}e[M];
int n,m,k;
inline bool cmp(edge a,edge b){
return a.w>b.w;
}
int vis[M];
int fa[N][K];
inline int getf(int x,int tk){
if(fa[x][tk]==x)return x;
return fa[x][tk]=getf(fa[x][tk],tk);
}
int cur[N][N];
signed main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
register int i;
n=in,m=in,k=in;
for(i=1;i<=m;++i)
e[i].u=in,e[i].v=in,
e[i].w=in,e[i].o=i;
sort(e+1,e+1+m,cmp);
for(i=1;i<=n;++i)
for(int j=1;j<=k;j++)
fa[i][j]=i;
for(i=1;i<=m;++i){
int u=e[i].u,v=e[i].v;
int t=cur[u][v]+1,f1=getf(u,t),f2=getf(v,t);
while(f1==f2&&t<k)
t++,f1=getf(u,t),f2=getf(v,t);
if(f1==f2)continue;
vis[e[i].o]=t;
fa[f2][t]=f1;
cur[u][v]=cur[v][u]=t;
}
for(i=1;i<=m;++i)
cout<<vis[i]<<'\n';
return 0;
}
T2 Problem B \(\color{red}{98}\)
由于操作只能用行来更新列,所以正确的构造方案一定是先构造出一整行黑色,然后再逐列修改。
先考虑无解,当且仅当图中没有黑色时无解。因为只要有一个黑色,将黑色对应行修改每列一定能构造出一整行黑。
判断无解之后图中一定有黑色。
考虑将每行作为要构造的整行黑之后取最小值。
如果第 \(i\) 列有黑,那么那么用这个黑一定可以构造出全黑的第 \(i\) 行;如果第 \(i\) 列没有黑,那么随便找一个有黑的行操作一次就可以让第 \(i\) 列有黑。
然后考虑第 \(i\) 行的操作数,按上述操作让第 \(i\) 列有黑。然后遍历一行,有一个白就算一次操作。将整行染黑之后再遍历每列,如果这一列全是黑就不操作,否则算一次操作。
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n;
int mp[N][N];
int line[N];
bool OK[N];
bool cisb[N];
int tans=0x7fffffff;
bool NO=true;
signed main(){
// freopen("b.in","r",stdin);
// freopen("b.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
char c;cin>>c;
mp[i][j]=(c=='#');
if(mp[i][j])OK[j]=1;
if(mp[i][j])NO=false;
}
if(NO){cout<<-1;return 0;}
for(int i=1;i<=n;i++){
cisb[i]=1;
for(int j=1;j<=n;j++)
if(!mp[j][i])cisb[i]=0;
}
for(int i=1;i<=n;i++){
int ans=n;
if(!OK[i])ans++;
for(int j=1;j<=n;j++){
if(cisb[j])ans--;
if(!mp[i][j])ans++;
}
tans=min(ans,tans);
}
cout<<tans;
return 0;
}
T3 Problem C \(\color{red}{60}\)
想了一堆关于 \(\sqrt n\) 的无用性质,终究没有注意到正解的性质。
乘积大于 \(n^m\) 的方案数等于乘积小于 \(n^m\) 的方案数。
考虑一个序列 \(p_1,p_2,\cdots,p_{2m}\),且\(p_1p_2\cdots p_{2m}=t<n^m\)
那么有 \(\frac{n}{p_1},\frac{n}{p_2},\cdots,\frac{n}{p_{2m}}\),且\(\frac{n}{p_1}\frac{n}{p_2}\cdots\frac{n}{p_{2m}}=\frac{n^{2m}}{t}>n^m\)
所以每一个乘积小于 \(n^m\) 的序列对应一个乘积大于 \(n^m\) 的序列,所以我们只需要算出乘积等于 \(n^m\) 的序列数就好了。
对于乘积等于 \(n^m\) 的数量,可以用 dp 做。题解曰,经典背包
考虑求出 \(n^m\) 的质因子也就是 \(n\) 的质因子且个数乘以 \(m\)。那么问题就是这些质因子分配到 \(2m\) 个位置的方案数。
考虑将每个质因子单独做最后乘起来就是答案。
记 \(n\) 的一个质因子为 \(p\),有 \(c\) 个。
设 \(f[i][j]\) 表示前 \(i\) 个位置一共分配了 \(j\) 个 \(p\)。显然 \(f\) 的范围是 \(2m*c*m\),\(c\) 的期望个数是 \(\log n\) ,所以状态数是 \(m^2\log n\)。
由于要求每个位置整除 \(n\),所以每个位置最多分配 \(c\) 个\(p\) ,于是转移时枚举当前位置分配了几个 \(p\),方程为:
\]
可以滚动数组滚掉第一维。
时间复杂度分析:\(p\) 的种类约为 \(\log n\),个数约为 \(\log n\),外层循环每个 \(p\),内层 dp 状态数 \(m^2\log n\),转移 \(p\) 的个数,所以总复杂度大概是 \(O(m^2(\log n)^3)\)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int mod=998244353;
int inv2=499122177;
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int n,m;
int p[100],pn;
int cnt[100];
void getp(int x){
int ans=x;
for(int i=2;i*i<=x;i++){
if(x%i==0)p[++pn]=i;
while(x%i==0)cnt[pn]++,x/=i;
}
if(x!=1)p[++pn]=x,cnt[pn]=1;
}
int f[205][6005];
int ans=1,res=1;
signed main(){
cin>>n>>m;
getp(n);
for(int i=1;i<=pn;i++)
res=res*(cnt[i]+1)%mod;
for(int l=1;l<=pn;l++){
memset(f,0,sizeof(f));
for(int i=0;i<=cnt[l];i++)
f[1][i]=1;
for(int i=2;i<=m<<1;i++){
for(int j=0;j<=cnt[l]*m;j++){
for(int k=0;k<=cnt[l];k++){
f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
}
}
}
ans=ans*f[m<<1][cnt[l]*m]%mod;
}
ans=(qpow(res,(m<<1))+ans+mod)%mod*inv2%mod;
cout<<ans;
return 0;
}
有个想法是用经典 dp 求出把 \(n\) 个数分配到 \(m\) 个方案数,然后容斥掉不合法的分配,但是写挂了。
T4 Problem D \(\color{purple}{0}\)
freoepn
,虽然改过来也是挂的
明天改。
21.10.14 test的更多相关文章
- Capture One 21 Pro 14.0.2.36中文版安装教程
Capture One 21 Pro 14.0.2.36 for windows是一款由丹麦PHASE ONE飞思公司推出的.非常专业强大的图像处理编辑工具. 下载 Capture One 21 Pr ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画
[源码下载] 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 线性动画 - ColorAnimatio ...
- 2016年12月15日 星期四 --出埃及记 Exodus 21:10
2016年12月15日 星期四 --出埃及记 Exodus 21:10 If he marries another woman, he must not deprive the first one o ...
- Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置
Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置 http://henzhai.com/tech/2012/07/w520- ...
- macOS 10.14虚拟机安装教程
windows10下安装vmware14.0以及macOS 10.14图文详解 工具/原料 windows10 vmware 14.0 macOS 10.14懒人版 mac补丁unlocker工具 ...
- OS + macOS Mojave 10.14.4 / sushi / ssh-keygen / ssh-copy-id
s 系统版本: macOS 10.14.4 (18E226) 内核版本: Darwin 18.5.0 型号名称: Mac mini 2014 型号标识符: Macmini7,1 处理器名称: Inte ...
- VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...
- APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4,Security Update 2019-002 High Sierra, Security Update 2019-002 Sierra
APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4, Security Update2019-002 High Sierra, Security Update 2019 ...
随机推荐
- windows下配置VSCode免密SSH连接Linux机器
先决条件 Windows下安装openssh软件(win10自带,可以不用搞) 从官网下载最新版本默认安装即可 VSCode安装插件 VSCode官方市场获取两个插件:"Remote - S ...
- JS预编译过程
GO和AO 变量的预编译 实例1 console.log(a); var a=1; console.log(a); 实际编译过程: 将a存入预编译对象中,赋值为undefined: 真正的赋值语句当程 ...
- RMQ区间最值查询
RMQ区间最值查询 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<= ...
- 动态规划精讲(一)LC最长公共子序列
P1439 [模板]最长公共子序列 题目描述 给出1,2,-,n 的两个排列P1 和P2 ,求它们的最长公共子序列. 输入格式 第一行是一个数 n. 接下来两行,每行为 n 个数,为自然数 1,2 ...
- CSP-J 2021 游记
今年是本人第一次参加CSP组的竞赛. Day 0 晚上复习了几套初赛试卷,做到晚上十点多结束.其实暑假已经做过不少了. Day 1 早上继续复习noip历年真题,在洛谷有题上面自己做题,一向只能考十几 ...
- qGPU on TKE - 腾讯云发布下一代 GPU 容器共享技术
背景 qGPU 是腾讯云推出的 GPU 共享技术,支持在多个容器间共享 GPU卡,并提供容器间显存.算力强隔离的能力,从而在更小粒度的使用 GPU 卡的基础上,保证业务安全,达到提高 GPU 使用率. ...
- JDBC-3(Transcation) ****
3.1 异常的使用说明 在工具类中(JDBCUtils)的方法最好声明异常(throws),以便后续实现类中去捕获这些异常. 工具类中捕获异常通常没有意义 eg:实现类中connection建立过程出 ...
- 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04
百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】
正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 \(n\)个点的一张无向图,有\(k\)条必走边,\(m\)条其他边,求从\(1\)出发经过必走 ...
- ARC122C-Calculator【乱搞,构造】
正题 题目链接:https://atcoder.jp/contests/arc122/tasks/arc122_c 题目大意 一个数对开始是\((0,0)\),每次可以选择一个数加一或者让一个数加上另 ...