【题解】NOIP2017 提高组 简要题解

小凯的疑惑(数论)

不讲

时间复杂度

大力模拟

奶酪

并查集模板题

宝藏

最优解一定存在一种构造方法是按照深度一步步生成所有的联通性。

枚举一个根,随后设\(dp(i,j)\)表示最大深度为\(i\)且当前联通的集合是\(j\)的最小答案。预处理\(dis(u,j)\)表示当\(j\)集合内的点都存在时,\(u\)到这些点的最短的最短边。

转移:

\[dp(i,j)=\min \{dp(i-1,j),dp(i-1,s)+(i-1)\times \sum_{u\in j-s} dis(u,s)\}
\]

你会问这样不能保证连边的时候深度为\(i-1\)啊,可能更小啊?

但是这样不会影响最优解。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} const int maxn=13;
const int inf=0x3f3f3f3f;
int e[maxn][maxn];
int dp[maxn][1<<maxn];
int dis[maxn][1<<maxn];
int n,m,rt;
int cnt=0; int main(){
memset(e,0x3f,sizeof e);
memset(dp,0x3f,sizeof dp);
n=qr(); m=qr();
for(int t=1,t1,t2;t<=m;++t)
t1=qr(),t2=qr(),e[t1][t2]=e[t2][t1]=min(e[t1][t2],qr());
const int K=(1<<n)-1;
for(int t=0;t<=K;++t)
for(int g=1;g<=n;++g){
if(t<<1>>g&1) continue;
int f=inf;
for(int k=1;k<=n;++k)
if(t<<1>>k&1) f=min(f,e[g][k]);
dis[g][t]=f;
}
int ans=inf;
for(int rt=1;rt<=n;++rt){
memset(dp,0x3f,sizeof dp);
dp[1][1<<rt>>1]=0;
for(int t=2;t<=n;++t){
for(int i=1;i<=K;++i){
dp[t][i]=dp[t-1][i];
for(int l=i;l;--l&=i){
int c=l^i,ret=0;
if(dp[t-1][c]>=dp[t][i])continue;
bool f=0;
for(int g=1;g<=n;++g)
if(l<<1>>g&1){
if(dis[g][c]>=inf){ret=inf; break;}
else ret+=dis[g][c];
if(dp[t-1][c]+(t-1)*ret>=dp[t][i]) {f=1;break;}
}
if(f)continue;
dp[t][i]=min((ll)dp[t][i],dp[t-1][c]+(t-1ll)*ret);
}
}
ans=min(ans,dp[t][K]);
}
ans=min(ans,dp[1][K]);
}
printf("%d\n",ans);
return 0;
}

列队

不会

好像会线段树动态开点做法,没写

写了

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mid ((l+r)>>1)
using namespace std; typedef long long ll;
const int maxn=3e5+5,maxm=6e6+5;
int n,m,q,rt[maxn],ls[maxm],rs[maxm],seg[maxm],cnt;
ll id[maxn<<1];
vector<ll> e[maxn];
int que(const int&k,const int&l,const int&r,int&pos){
if(!pos)pos=++cnt,seg[pos]=r-l+1;
--seg[pos];
if(l==r)return l;
int g=ls[pos]?seg[ls[pos]]:mid-l+1;
return g>=k?que(k,l,mid,ls[pos]):que(k-g,mid+1,r,rs[pos]);
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>m>>q;
for(int t=1;t<=n;++t) id[t]=1ll*t*m;
for(int t=n+1,N=n+q,M=m+q,x,y,ans;q--;cout<<id[t++]<<'\n'){
cin>>x>>y;
if(y==m) id[t]=id[ans=que(x,1,N,rt[0])];
else id[t]=(ans=que(y,1,M,rt[x]))<m?(x-1ll)*m+ans:e[x][ans-m], e[x].push_back(id[que(x,1,N,rt[0])]);
}
return 0;
}

【题解】NOIP2017 提高组 简要题解的更多相关文章

  1. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  2. NOIP2017提高组day2T1题解(奶酪)

    题目链接:奶酪 这道题还是很水的,在下拿了满分. 并没有用什么高级的算法,我讲一下基本思路. 我们把每个洞都视为一个节点. 我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张 ...

  3. NOIP2017[提高组] 宝藏 题解

    解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...

  4. 题解 [NOIP2017 提高组]宝藏

    传送门 这是蓝书上状压的例题啊,怎么会出现在模拟赛里 不过就算原题我也没把握写对 核心思路: 先令\(dp[s]\)为当前状态为\(s\)时的总花费最小值,\(cnt[s][i]\)为这个方案中由根节 ...

  5. [NOIp2017提高组]列队

    [NOIp2017提高组]列队 题目大意 一个\(n\times m(n,m\le3\times10^5)\)的方阵,每个格子里的人都有一个编号.初始时第\(i\)行第\(j\)列的编号为\((i-1 ...

  6. JZOJ 5196. 【NOIP2017提高组模拟7.3】B

    5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  7. JZOJ 5197. 【NOIP2017提高组模拟7.3】C

    5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  8. JZOJ 5195. 【NOIP2017提高组模拟7.3】A

    5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  9. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

随机推荐

  1. 如何用Chrome浏览器下载网页音乐视频

    打开网页,先让要下载的视频播放,右键单击选择审查元素(F12),选择上方的Network选项,按F5刷新,这个时候我们可以看到框架中Size下的不少文件数据数字正在变大,按size降序排列.点击表格的 ...

  2. js中字符串拼接html

    1.使用转义字符 ": " " "+userName+" " " 效果:"userName" 2. 单引号中拼 ...

  3. 使用DataX同步MaxCompute数据到TableStore(原OTS)优化指南

    概述 现在越来越多的技术架构下会组合使用MaxCompute和TableStore,用MaxCompute作大数据分析,计算的结果会导出到TableStore提供在线访问.MaxCompute提供海量 ...

  4. Laravel5.1 实现第三方登录认证教程之 - 微信登录

    https://laravel-china.org/topics/2451/laravel51-implementation-of-the-third-party-login-authenticati ...

  5. localStorage、sessionStorage、cookie的区别

    localStorage: 存储的内容大概20MB 不同浏览器不能共享,但是在同一浏览器的不同窗口中可以共享 永久生效,它的数据是存储的硬盘上,并不会随着页面或者浏览器的关闭而清楚,需手动清除 ses ...

  6. Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例

    从某种意义上说,服务提供者有点类似HTTP控制器,HTTP控制器用于为相关路由注册提供统一管理,而服务提供者用于为相关服务容器提供统一绑定场所,此外服务提供者还可以做一些初始化启动操作.Laravel ...

  7. js实现点击隐藏图片

    方法一: 把图片的display设为none,触发点击事件时,display变为block <style> img { width: 400px;height: 300px; displa ...

  8. java 集合之HashMap的三种遍历

    HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. 这周我们只需记住三种遍历方法 1.通过keySet()获取键,再利用hashmap里面的.get(key)方法通过键获取 ...

  9. ASP.NET一般登陆逻辑分享(01)

  10. 【js】Vue 2.5.1 源码学习 (八)响应式入口observe

    大体思路(七) 本节内容: deps 依赖收集的数组对象 => Dep 构造函数 /** ==> observe() * var ob * ==> if --isObject * = ...