Preface

  • 今天的B组题确实比A组难多了。。。

T1

Description

  • 有一个长为\(n(n\in[1,2*10^5])\)的01串,有\(m(m\in[1,10^5])\)个限制\(a_i、b_i\),表示限定区间\([a_i,b_i]\)中有且只有1个1。
  • 求最多的1的数目。无解输出-1。

Solution

  • 这题可以DP。但我们有一种更加巧妙也方便的方法——差分约束。(我好像是第一次打这东西)
  • 一个标准的差分约束系统是有一个未知数列\(x_{1..n}\),有若干个形如\(x_i-x_j≤k\)的限制,求\(x_n-x_0\)的最大值。它的实现是建图,跑最短路。拿限制\(x_i-x_j≤k\)举例,我们从\(j\)向\(i\)连一条长为\(k\)的边,那么最短路满足\(dis_j+k≥dis_i\),则将\(dis\)代入\(x\)即可。
  • 回到这题,我们可以对原串的前缀和构造差分约束系统。对于一个限制\(a、b(a≤b)\),我们可以视为有两个限制:\(s_b-s_{a-1}≤1\),\(s_{a-1}-s_b≤-1\);当然它还有隐限制\(s_i-s_{i-1}≤1\),\(s_{i-1}-s_i≤0\)。
  • 建出了图后,我们就跑spfa。但囿于可能有负环,我们可以考虑在spfa中运行太久便确认负环存在,输出-1并退出程序。

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std; const int N=21e4,M=4*N;
int i,n,m,a,b,tov[M],len[M],nex[M],las[N],dis[N],h,t,d[10*M];
double start;
bool p[N]; void read(int&x)
{
char c=getchar(); x=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) x=x*10+(c^48);
} inline void link(int x,int y,int z) {static int tot=0; tov[++tot]=y,len[tot]=z,nex[tot]=las[x],las[x]=tot;} void spfa()
{
fo(i,1,n) dis[i]=1e9;
h=0, p[d[t=1]=0]=1;
while(h<t)
{
a=d[++h];
for(i=las[a];i;i=nex[i])
if(dis[b=tov[i]]>dis[a]+len[i])
{
dis[b]=dis[a]+len[i];
if(!p[b])
{
if(++t>=10*M) {puts("-1"); exit(0);}
p[d[t]=b]=1;
if(dis[d[h+1]]>dis[b]) swap(d[h+1],d[t]);
}
}
p[a]=0;
}
} int main()
{
read(n), read(m);
fo(i,1,n) link(i-1,i,1), link(i,i-1,0);
fo(i,1,m)
{
read(a), read(b);
link(a-1,b,1), link(b,a-1,-1);
}
spfa();
printf("%d",dis[n]);
}

T2

Description

  • 给定一棵\(N(N\in[1,10^5])\)个点的树,树边有黑白两种颜色。
  • 对于一条路径,令一个非起点/终点的点为休息点。定义平衡路径为起点到休息点、休息点到终点的分路径上都满足黑边数等于白边数的路径。
  • 求平衡路径数。

Solution

  • 这题一眼树形DP;但仔细考虑后发现树形DP状态太大,转移太复杂。
  • 于是考虑点分治。
  • 我们以每个分治中心为根,计算贡献。那么有两种可能:一种是穿过根的路径;一种是一个端点在根上的路径(后者一定不能忘了考虑!!!)。

  • 对于前者,我们可以计算根子树内每个点到根的距离(白边为-1,黑边为1)。然后我们要记录每个点到根路径上是否有合法的休息点,这个只要它们的距离一样即可。
  • 然后我们合并两个路径,这可根据休息点的位置分类讨论。而合并的路径须满足两者到根距离互为相反数。
  • 具体实现可以用桶。

Code

  • 这题真心不难打,也就1K多一点。但我弱调了半天
#include <bits/stdc++.h>
#define max(x,y) (x>y?x:y)
#define fo(i,a,b) for(i=a;i<=b;i++)
#define rep(x) for(int i=las[x],y;y=tov[i];i=nex[i])if(y!=fa&&!lG[y])
using namespace std;
typedef long long ll; const int N=51e4;
int i,j,n,a,b,len[N],tov[N],nex[N],las[N],sz[N],siz[N],ms[N],dis[N],ed[N],d[N],d1[N],c[N],ck[N];
bool k[N],lG[N];
ll ans; int getG(int x,int fa,int n)
{
sz[x]=1,ms[x]=0;
rep(x)
{
int G=getG(y,x,n);
if(G) return G;
sz[x]+=sz[y];
if(ms[x]<sz[y]) ms[x]=sz[y];
}
return max(ms[x],n-sz[x])<=n/2 ? x : 0;
} void getdis(int x,int fa,int n)
{
ans+=(dis[x]==2*n&&k[x])+(k[x]||dis[x]==2*n?c[4*n-dis[x]]:ck[4*n-dis[x]]);
siz[d[++d[0]]=x]=1;
ed[dis[x]]++;
rep(x)
{
k[y]=ed[dis[y]=dis[x]+len[i>>1]];
getdis(y,x,n), siz[x]+=siz[y];
}
ed[dis[x]]--;
} void solve(int G,int n)
{
if(n<5) return;
G=getG(G,0,n);
int fa=0;
rep(G)
{
dis[y]=2*n+len[i>>1];
getdis(y,G,n);
do
{
y=d[d[0]];
c[dis[y]]++, ck[dis[y]]+=k[y];
d1[++d1[0]]=y;
k[y]=0;
}while(--d[0]);
}
while(d1[0]) {int y=d1[d1[0]--]; c[dis[y]]=ck[dis[y]]=0;}
lG[G]=1;
rep(G) solve(y,siz[y]);
} int main()
{
scanf("%d",&n);
fo(i,1,n-1)
{
scanf("%d%d%d",&a,&b,&len[i]);
if(!len[i]) len[i]=-1;
tov[i*2]=b, nex[i*2]=las[a], las[a]=i*2;
tov[i*2+1]=a,nex[i*2+1]=las[b],las[b]=i*2+1;
}
solve(1,n);
printf("%lld",ans);
}

T3

  • 这题就不用说了吧。悬线法+暴力DP直接切穿。。。

【纪中集训】2019.07.11【NOIP提高组】模拟 B 组TJ的更多相关文章

  1. 【纪中集训2019.3.11】Cubelia

    题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...

  2. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  3. 【纪中集训2019.3.23】Deadline

    题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...

  4. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  5. 【纪中集训2019.3.23】IOer

    题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...

  6. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  7. 【纪中集训2019.3.12】Z的礼物

    题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...

  8. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  9. 纪中集训总结 && 新学期目标

    于是紧接着又发了第二篇. 关于这次去完纪中以后的感想,写完后总觉得少了些什么,因此就发一篇小目标集合来凑数补充一下吧. Part I:图论 这方面我去之前就是很有自信,事实证明像基础的最短路.生成树什 ...

  10. 纪中集训 Day 0?

    好吧昨天的等到今天才来写,现在超不想刷题,来写下blog吧= = 坐了近10H的火车终于来到了中山市 火车上在看空之境界,等有时间补下动画吧= = 到了宿舍各种不习惯(现在才发现还是母校好QAQ)然后 ...

随机推荐

  1. 怀旧浪潮来袭,小霸王游戏、windows95......曾经的经典哪些能戳中你的心怀?

    随着前两天上架的 Rewound 在 iPhone 上复刻了 iPod Classic为大家掀起一场怀旧浪潮,那么除了 Rewound还有什么经典?今天我们就来怀旧一下那些曾经的经典.80经典小霸王游 ...

  2. UNP学习 Unix域协议

    Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API的一种方法. 当客户和服务器在同一台主机上时,Unix域协议是这套 ...

  3. nucleus plus学习总结

    前言:     最近一直都在看nucleus plus,之前看过一些linux内核的一些东西,但都是停留在文字上,代码看的很少,这个nucleus plus内核的代码量不大,看过source code ...

  4. null-ouc 小组冲刺阶段博客目录

    null-ouc Beta冲刺阶段博客目录 github:https://github.com/orgs/OUC-null/people  一.Scrum Meeting 1. [第十周会议记录](h ...

  5. 75 OpenCV编译、图像处理等

    0 引言 记录图像处理的一些经验和使用OpenCV 等库的注意事项. 1 opencv中的坐标系 一图以蔽之~ 2 opencv 3.4.0 + opencv_contrib + qt编译 主要参考了 ...

  6. toleft时设置TabSequence属性为tsReversetoright时设置TabSequence属性为tsStandard

    使用这2人控件时,属性taborientation设为toleft时有个问题,具体如下设为toleft时tab会跑到左侧,这时的tab上的文字是反的.当设置为toright时,tab在右侧,这时的ta ...

  7. Linux v4l2编程(摄像头信息采集)

    基于Linux3.4.2,自己做一点儿视频信息采集及网络传输的小实验,边做边学,一些基础知识同步整理..... 1. 定义 V4L2(Video For Linux Two) 是内核提供给应用程序访问 ...

  8. 用FastDFS一步步搭建图片服务器(单机版)

    一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 1.简介 ...

  9. 政府网站综合防护系统(网防G01)

    政府网站综合防护系统,简称“网防G01”,是首款专门针对政府网站及服务器等关键信息基础资源进行综合防护的产品,由公安部第一研究所和计算机病毒防治技术国家工程实验室(北京)研发. 网防G01的架构 由服 ...

  10. join()和split()

    一.join()方法 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 如序列为字典,只连接字典里的键 序列里的元素也需要是字符串,如果不为字符串,则会报错 二. ...