【纪中集训】2019.08.10【NOIP提高组】模拟 A 组TJ
T1
Description
Solution
- 有待填坑……
T2
Description
- 给定一个\(h(≤10)\)层、\(n(≤10)\)行、\(m(≤10)\)列的由泥土组成的立方体,挖开\((i,j,k)\)的泥土代价为\(a[i,j,k](\in[0,65536))\),挖开后就可以随意走这个点。一开始在第0层随便一个点,每次可以挖开他正下方、以及他同一层的四连通相邻点。
- 第\(z\)层有\(K[z](≤9)\)个点必须经过。
- 求最小代价。
Solution
- 分层斯坦纳树。但此题有些特殊,它是有向边,如果直接做则斯坦纳树的第一种转移(即状态不同的转移)应该是要枚举一条边的;因此我们可以不连边,而是走到一个点就加上它的点权。
- 注意到还要考虑其他层的影响;因此我们可以自上而下(自下而上也是一样)地做,每层都新建一个特殊必经点,表示它当前层上面所有层的总和,然后要根据它第一次走到的点来定夺附加点权。
- 这样做的话,时间复杂度就是\(O(nm\sum_{z=1}^h2^{K[z]})\)的了。
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MIN(x,y) if(x>y)x=y
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int H=11,N=H*H,inf=0x3f3f3f3f;
int h,n,m,n1,a[H][N],K,x,y,X[H],f[1024][N],g[N],hd,tl,d[N*N],ans;
bool p[N];
bool go(int x,int y) {return x%m^1&&y==x-1||x%m&&y==x+1||y==x-m||y==x+m;}
void spfa(int dep,int S)
{
while(hd<tl)
{
int x=d[++hd];
fo(y,1,n1)
if(!x||go(x,y))
{
int len=a[dep][y]+(!x&&dep>1?g[y]:0);
if(f[S][y]>f[S][x]+len)
{
f[S][y]=f[S][x]+len;
if(!p[y])
{
p[d[++tl]=y]=1;
if(f[S][d[h+1]]>f[S][y]) swap(d[hd+1],d[tl]);
}
}
}
p[x]=0;
}
}
int main()
{
freopen("treasure.in","r",stdin);
freopen("treasure.out","w",stdout);
scanf("%d%d%d",&h,&n,&m), n1=n*m;
fo(dep,1,h) fo(i,1,n1) scanf("%d",&a[dep][i]);
fo(dep,1,h)
{
memset(f,63,sizeof f);
scanf("%d",&K);
fo(i,1,K) scanf("%d%d",&x,&y), X[i]=(x-1)*m+y, f[0][X[i]]=f[1<<i-1][X[i]]=a[dep][X[i]];
X[++K]=0, f[0][0]=f[1<<K-1][0]=0;
fo(S,1,(1<<K)-1)
{
for(int s=(S-1)&S; 233; s=(s-1)&S)
{
fo(x,1,n1) MIN(f[S][x],f[s][x]+f[S^s][x]-a[dep][x]);
if(!s) break;
}
hd=tl=0;
fo(i,0,n1) if(f[S][i]<inf) p[d[++tl]=i]=1;
spfa(dep,S);
}
fo(i,1,n1) g[i]=f[(1<<K)-1][i];
}
ans=inf;
fo(i,1,n1) MIN(ans,g[i]);
printf("%d",ans);
}
T3
Description
- 给定无限平面网格图上的\(N(≤100000)\)个黑格,其余格为白。保证所有黑格四连通,所有白格四连通。
- 在一个黑格时,一步可以走到与它四连通相邻的黑格。
- 求所有黑格两两间的最小步数。
Solution
- 这是IOI2012T4,顾昱洲写的TJ里有一种DP解法,但那种方法有些繁琐;这里讲一种撵爆顾昱洲更为简单的方法。
- 考虑将黑格按横坐标剖分,即把一块横坐标相同且相邻的黑格压成一个点;如果有两块横坐标不同但相邻的黑格,就在它们对应的新点之间连边。这样一定会形成一棵树,我们可以直接在上面搞事情。
- 但如果直接遍历这棵重构树求答案,我们并不知道对于之前的黑格,它走下来需要左右移动多少次(即纵坐标更改多少次),强行记录的话又过于繁琐。有一个很妙的思路是:我们可以把横坐标和纵坐标对答案的贡献分开处理。比如处理横坐标对答案的贡献时,就不管它左右移动,每次只上下移动,那就很好做了。
- 时间复杂度的话,不算排序是\(O(n)\)的。
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fi first
#define se second
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef pair<int,int> P;
const int N=11e4,v[2]={-1,1};
int n,cnt,L[N],R[N],X[N],tot,a[N],sz[N];
P p[N];
struct edge{int v,t;}e[N<<1];
long long ans;
inline bool con(int x,int y) {return X[x]+1==X[y]&&L[x]<=R[y]&&L[y]<=R[x];}
inline void link(int x,int y)
{
e[++tot]=(edge){y,a[x]}, a[x]=tot;
e[++tot]=(edge){x,a[y]}, a[y]=tot;
}
void dfs(int x,int f)
{
sz[x]=R[x]-L[x]+1;
for(int i=a[x],y; y=e[i].v; i=e[i].t) if(y^f) dfs(y,x),sz[x]+=sz[y];
ans+=1ll*sz[x]*(n-sz[x]);
}
void work()
{
sort(p+1,p+n+1);
cnt=0;
fo(i,1,n) if(p[i-1].fi<p[i].fi||p[i-1].se+1<p[i].se) R[cnt]=p[i-1].se, L[++cnt]=p[i].se, X[cnt]=p[i].fi;
R[cnt]=p[n].se;
int j=1;
memset(a,tot=0,sizeof a);
fo(i,1,cnt)
{
if(j>cnt) break;
for(; j<=cnt&&(X[j]<=X[i]||X[j]==X[i]+1&&!con(i+1,j)&&L[j]<=R[i]); j++) if(con(i,j)) link(i,j);
if(con(i,j)) link(i,j);
}
dfs(1,0);
}
int main()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
scanf("%d",&n);
fo(i,1,n) scanf("%d%d",&p[i].fi,&p[i].se);
work();
fo(i,1,n) swap(p[i].fi,p[i].se);
work();
printf("%lld",ans%int(1e9));
}
【纪中集训】2019.08.10【NOIP提高组】模拟 A 组TJ的更多相关文章
- 【纪中集训2019.3.12】Mas的仙人掌
题意: 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...
- 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)
题目 描述 \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...
- 【纪中集训2019.3.23】Deadline
题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...
- 【纪中集训2019.3.23】IOer
题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...
- 【纪中集训2019.3.11】Cubelia
题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...
- 【纪中集训2019.3.12】Z的礼物
题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...
- 【纪中集训2019.3.13】fft
题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...
- 「中山纪中集训省选组D1T1」最大收益 贪心
题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 纪中集训 Day 0?
好吧昨天的等到今天才来写,现在超不想刷题,来写下blog吧= = 坐了近10H的火车终于来到了中山市 火车上在看空之境界,等有时间补下动画吧= = 到了宿舍各种不习惯(现在才发现还是母校好QAQ)然后 ...
随机推荐
- Oracle 包的学习
(1)包是一种数据库对象,相当于一个容器.将逻辑上相关的过程.函数.变量.常量和游标组合成一个更大的单位.用户可以从其他 PL/SQL 块中对其进行引用 (2)包类似于C++和JAVA语言中的类,其中 ...
- 09-排序2 Insert or Merge(25 分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 【SPOJ1811】Longest Common Substring(后缀自动机)
题意:给定两个仅含小写字母的字符串,求他们最长公共子串的长度 n<=250000 思路: #include<bits/stdc++.h> using namespace std; t ...
- IPC机制总结
IPC机制: 1. 多进程概念: 2. 序列化机制和Binder: 3. 进程间通信:Bundle.文件共享.AIDL.Messenger.ContentProvider.Socket: 操作系统的设 ...
- C#后台获取post参数
public static string GetQueryString(string key) { if (HttpContext.Current.Request[key] == null) retu ...
- R中unlist函数的使用
买的书里面实例讲的不清不楚,所以看帮助文档了 用法:unlist(x, recursive = TRUE, use.names = TRUE) 帮助文档讲x可以是向量或者列表,如果是向量,则原样返回, ...
- tom
题目描述 众所周知,Tom 猫对香肠非常感兴趣.有一天,Tom 家里的女主人赏给了Tom 一大堆香肠.这些香肠太多了,以至于Tom 一顿吃不完,于是它把这些香肠串成了一棵树,树的每个节点上都有一个香肠 ...
- [CSP-S模拟测试]:小奇的仓库(warehouse)(树形DP)
题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目描述 喵星系有$n$个星球,星球以及星球间的航线形成一棵树.从星球$a$到星球$b ...
- python利用eval方法提升dataframe运算性能
eval方法可以直接利用c语言的速度,而不用分配中间数组,不需要中间内存的占用. 如果包含多个步骤,每个步骤都要分配一块内存 import numpy as npimport pandas as pd ...
- linux: 如何查看端口占用?
查看端口占用 $: netstat -anp | grep 8888 tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 13404/python3 tcp 0 1 172 ...