\(6.14\ YZBOI\)模拟赛\(solution\)

本来不想写题解来着。。。毕竟是自己找的题还是写一写吧

上午为了整活,就把赛制改成\(IOI\)赛制了,于是乎拯救了大家的\(70pts\)代码。

三道巨水的题。。。\(bz\)迅速就\(AK\)了。。。

\(T1\ Delta\)

比较直观的想,肯定是找一个少的的完全图划分了,又发现平方具有传递性,就变成维护联通块了

#include<bits/stdc++.h>
#define int long long
#define MAXN 5005
using namespace std;
int n,a[MAXN],fa[MAXN],ans[MAXN];
bool vis[MAXN];
int Find(int x)
{
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
fa[i]=i;
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]*a[j]>0)
{
if((int)sqrt(a[i]*a[j])*(int)sqrt(a[i]*a[j])!=a[i]*a[j]) continue;
int fi=Find(i);
int fj=Find(j);
if(fi==fj) continue;
fa[fi]=fj;
}
}
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
int num=0;
for(int j=i;j<=n;j++)
{
if(a[j]!=0&&vis[Find(j)]==false)
{
vis[Find(j)]=true;
num++;
}
if(num==0) ans[num+1]++;
else ans[num]++;
}
}
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<" ";
}
}

\(T2 Add\)

线性规划会吧,模拟会吧,单纯形法会吧,转对偶会吧,那么这就是一道水题了

#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
const double eps=1e-9;
const int INF=1000000000;
double a[1005][MAXN],b[MAXN],v,c[MAXN];
int m,n;
void solve(int l,int e)
{
b[l]/=a[l][e];
for(int i=1;i<=n;++i) if(i!=e) a[l][i]/=a[l][e];
a[l][e]=1/a[l][e];
for(int i=1;i<=m;++i)
{
if(i!=l&&abs(a[i][e])>eps)
{
b[i]-=b[l]*a[i][e];
for(int j=1;j<=n;++j)
{
if(j!=e) a[i][j]-=a[l][j]*a[i][e];
}
a[i][e]=-a[i][e]*a[l][e];
}
}
v+=c[e]*b[l];
for(int i=1;i<=n;++i)
{
if(i!=e) c[i]-=c[e]*a[l][i];
}
c[e]=-c[e]*a[l][e];
}
void simplex()
{
int l,e;
while(true)
{
for(e=1;e<=n;++e)
{
if(c[e]>eps) break;
}
if(e>n) break;
double t=INF;
for(int i=1;i<=m;++i)
{
if(a[i][e]>eps&&b[i]/a[i][e]<t)
{
l=i;
t=b[i]/a[i][e];
}
}
solve(l,e);
}
}
int main()
{
//关于转对偶
//n,m交换
//把b(限制的和)变成c(系数),把c变成b
//把矩阵a转置
//然后单纯形求一个最小即可
cin>>m>>n;
for(int i=1;i<=m;++i) scanf("%lf",&b[i]);
for(int i=1,l,r;i<=n;++i)
{
scanf("%d%d",&l,&r);
for(int j=l;j<=r;++j) ++a[j][i];
scanf("%lf",&c[i]);
}
simplex();
printf("%.0lf\n",v);
return 0;
}

\(T3\ Times\)

我记得这道题是我省选前一天为了帮忙\(debug\)写的

考虑最优解必然是在最小生成树上的,然后考虑从大往小删除边,我们需要保证删边之后每个联通块至少有一个守卫,那么大概就是我们对每个守卫匹配一个边去割掉,而且不存在交叉,那么就可以很直观的用费用流来表示

#include<bits/stdc++.h>
#define MIN 0xcfcfcfcfcfcfcfcf
#define INF 2147483647
#define int long long
#define MAXN 1000005
using namespace std;
struct node
{
int u,v,w;
}lu[MAXN];
int head[MAXN],cost[MAXN],val[MAXN],nxt[MAXN],to[MAXN],tot=1;
int dis[MAXN],fa[MAXN],Sum,s,t,n,m,k;
bool vis[MAXN],in[MAXN];
vector<pair<int,int> >rd[MAXN];
int Find(int x)
{
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
int R(int x)
{
return x+n+n;
}
int ru(int x)
{
return x;
}
int chu(int x)
{
return x+n;
}
void add(int u,int v,int w,int cts)
{
tot++; to[tot]=v; val[tot]=w; cost[tot]=cts; nxt[tot]=head[u]; head[u]=tot;
swap(u,v),w=0,cts*=-1;
tot++; to[tot]=v; val[tot]=w; cost[tot]=cts; nxt[tot]=head[u]; head[u]=tot;
}
bool bfs(int s,int t)
{
memset(dis,0xcf,sizeof(dis));
queue<int>q;
dis[s]=0;
in[s]=true;
q.push(s);
while(q.size())
{
int now=q.front();
q.pop();
in[now]=false;
for(int i=head[now];i;i=nxt[i])
{
int y=to[i];
if(val[i]&&dis[y]<dis[now]+cost[i])
{
dis[y]=dis[now]+cost[i];
if(!in[y]) in[y]=true,q.push(y);
}
}
}
// cout<<"dis: "<<dis[t]<<"\n";
return dis[t]!=MIN;
}
int dfs(int now,int ed,int flow)
{
if(now==ed) return flow;
vis[now]=true;
int rest=flow;
for(int i=head[now];i&&rest;i=nxt[i])
{
int y=to[i];
if(dis[y]!=dis[now]+cost[i]||!val[i]||vis[y]) continue;
int k=dfs(y,ed,min(val[i],rest));
val[i]-=k;
val[i^1]+=k;
rest-=k;
if(!k) dis[y]=INF;
}
vis[now]=false;
return flow-rest;
}
void dfs_tree(int now,int pre,int Cst)
{
if(pre)add(chu(now),ru(pre),1,0);
add(chu(now),t,1,Cst);
for(int i=0;i<rd[now].size();i++)
{
int y=rd[now][i].first;
if(y==pre) continue;
dfs_tree(y,now,rd[now][i].second);
}
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&lu[i].u,&lu[i].v,&lu[i].w);
}
sort(lu+1,lu+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int fu=Find(lu[i].u);
int fv=Find(lu[i].v);
if(fu!=fv)
{
fa[fu]=fv;
rd[fu].push_back(make_pair(fv,lu[i].w));
rd[fv].push_back(make_pair(fu,lu[i].w));
// cout<<"add: "<<fu<<" "<<fv<<" "<<lu[i].w<<"\n";
Sum+=lu[i].w;
}
}
s=n+n+k+1;
t=n+n+k+2;
for(int i=1,num;i<=k;i++)
{
add(s,R(i),1,0);
scanf("%lld",&num);
for(int j=1,cun;j<=num;j++)
{
scanf("%lld",&cun);
add(R(i),ru(cun),1,0);
}
}
for(int i=1;i<=n;i++)
{
add(ru(i),chu(i),1,0);
}
for(int i=1;i<=n;i++)
{
if(Find(i)==i)
{
Sum+=INF;
dfs_tree(i,t,INF);
}
}
int z=0;
while(bfs(s,t))
{
int v=dfs(s,t,INF);
z+=v;
Sum-=v*dis[t];
}
if(z!=k)
{
cout<<-1;
return 0;
}
if(Sum>=INF)
{
cout<<-1;
return 0;
}
cout<<Sum<<"\n";
}

6.14 YZBOI模拟赛solution的更多相关文章

  1. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  2. 【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)

    \(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据 ...

  3. 【2019.8.14 慈溪模拟赛 T2】黑心老板(gamble)(2-SAT)

    \(2-SAT\) 考虑每个点只能选择\(R\)或\(B\),可以看作选\(0\)或\(1\). 然后对于给出的关系式,若其中一个位置满足关系式,另两个位置就必须不满足关系式,这样就可以对于每个关系式 ...

  4. PAT团体程序设计天梯赛 - 模拟赛

    由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 ...

  5. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  6. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  7. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  8. GDOI模拟赛Round 1

    GDOI模拟赛Round 1 数据结构 题目描述:给出一个长度为\(n\)的序列,支持两种操作: 1.对某段区间都加上一个数 2.给出\(p.k\),求下面表示式对\((10^9+7)\)取模 \[\ ...

  9. 3.27模拟赛 sutoringu(后缀数组)

    \(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...

随机推荐

  1. Spring Security之用户名+密码登录

    自定义用户认证逻辑 处理用户信息获取逻辑 实现UserDetailsService接口 @Service public class MyUserDetailsService implements Us ...

  2. CentOS下Python管理

    一.升级Python 查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 查看Python版本 python -V ...

  3. 200 行代码实现基于 Paxos 的 KV 存储

    前言 写完[paxos 的直观解释]之后,网友都说疗效甚好,但是也会对这篇教程中一些环节提出疑问(有疑问说明真的看懂了 ),例如怎么把只能确定一个值的 paxos 应用到实际场景中. 既然 Talk ...

  4. 从URL输入到页面展现到底发生什么?DNS 解析&TCP 连接

    DNS 解析:将域名解析成 IP 地址 TCP 连接:TCP 三次握手 发送 HTTP 请求 服务器处理请求并返回 HTTP 报文 浏览器解析渲染页面 断开连接:TCP 四次挥手 一.什么是URL? ...

  5. cut-列过滤

    列过滤命令. 语法 cut [选项] 要过滤的字符串 选项 -f 以字段为单位进行分割 -c 以字符为单位进行分割 -b 以字节为单位进行分割 -d 以分割符为单位进行分割,分隔符可以是"冒 ...

  6. Javaer 面试必背系列!超高频八股之三色标记法

    可达性分析可以分成两个阶段 根节点枚举 从根节点开始遍历对象图 前文提到过,在可达性分析中,第一阶段 "根节点枚举" 是必须 STW 的,不然如果分析过程中用户进程还在运行,就可能 ...

  7. [自制操作系统] 第05回 CPU的三种模式

    目录 一.前景回顾 二.实模式和保护模式 一.前景回顾 在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader. ...

  8. 高通sensor理解

    .1.高通为什么引入adsp? 2.adsp sensor 是如何工作起来的? 3.adsp 和ap 是如何通信的? 4.adsp 架构组成 解答: 1.高通在msm8960之前sensor 是挂在p ...

  9. Maven + SSM环境搭建

    Maven + SSM 之前Maven+SSM都是照着搭建的,自己想写点什么的时候发现搭建的过程不清楚. 于是花了时间边整理思路边搭建,并把搭建过程记录下来. 视频看来终觉浅,还是需要自己动手实践,捋 ...

  10. RPA应用场景-考勤审批

    场景概述 考勤审批 所涉系统名称 考勤系统,微信 人工操作(时间/次) 5分钟 所涉人工数量 43 操作频率 不定时 场景流程 1.客户领导长期出差,又不想对考勤系统做深度开发: 2.员工请假后,领导 ...