zjoi2016 day1【bzoj4455】【bzoj4456】
首先做了T2的旅行者,看到bz上面过的人数比较多。。
考试的时候完全没有想太多。一闪而过了分块思想,然后就没有然后了。。
大视野上面有题解,竟然是一个初中生写的。。?
正解其实是“分治”,每次选择中轴线,不会势能分析,感觉考场上想出来也肯定不敢打。。
#include<cstdio> #include<algorithm> #define inf 1000000000 #define N 100010 using namespace std; int dis[N],ans[N],q[N],id[N],vet[N],head[N],next[N],pri[N]; int edgenum,cas,cnt,n,m; struct node{int x1,y1,x2,y2,id;}a[N],b[N]; void add(int u,int v,int w) { edgenum++;vet[edgenum]=v;next[edgenum]=head[u]; head[u]=edgenum;pri[edgenum]=w; //printf("%d %d %d\n",u,v,w); } void push_down(int k) { <=cnt) { ],k3=q[k*+]; +<=cnt&&dis[k1]>dis[k3]&&dis[k3]<dis[k2]) { id[k1]=k*+;id[k3]=k;swap(q[k],q[k*+]); k=k*+; }else if(dis[k1]>dis[k2]) { id[k1]=k*;id[k2]=k;swap(q[k],q[k*]);k=k*; }else break; } } void push_up(int k) { >&&dis[q[k]]<dis[q[k/]]) { id[q[k]]=k/;id[q[k/]]=k;swap(q[k],q[k/]); k=k/; } } void dijk(int sta,int x1,int x2,int y1,int y2) { cnt=;q[]=sta;id[sta]=;dis[sta]=; for(int i=x1;i<=x2;i++) for(int j=y1;j<=y2;j++) { )*m+j; if(u!=sta){dis[u]=inf;q[++cnt]=u;id[u]=cnt;} } while(cnt) { ];q[]=q[cnt--];id[q[]]=;push_down();int e=head[u];//printf("reng=%d\n",u); ) { ,yy=v%m;)yy=m;)xx--; //printf("ok=%d %d %d\n",v,xx,yy); if(xx>=x1&&xx<=x2&&yy>=y1&&yy<=y2) if(dis[v]>dis[u]+pri[e]) { dis[v]=dis[u]+pri[e]; //printf("ok=%d %d %d\n",u,v,dis[v]); push_up(id[v]); } e=next[e]; } } //printf("sta=%d\n",sta); for(int i=x1;i<=x2;i++) for(int j=y1;j<=y2;j++) { )*m+j; //printf("dis=%d %d\n",u,dis[u]); } } void solve(int x1,int x2,int y1,int y2,int l,int r) { if(l>r)return;int mid; if(x2-x1>y2-y1) { mid=(x1+x2)>>; for(int i=y1;i<=y2;i++) { )*m+i;dijk(u,x1,x2,y1,y2); for(int j=l;j<=r;j++) { )*m+a[j].y1,u2=(a[j].x2-)*m+a[j].y2; int t=dis[u1]+dis[u2]; ans[a[j].id]=min(ans[a[j].id],t); } } ,k=r+; for(int i=l;i<=r;i++)if(a[i].x1<mid&&a[i].x2<mid)b[++j]=a[i];else if(a[i].x1>mid&&a[i].x2>mid)b[--k]=a[i]; ,y1,y2,l,j); ,x2,y1,y2,k,r); }else { mid=(y1+y2)>>; for(int i=x1;i<=x2;i++) { )*m+mid;dijk(u,x1,x2,y1,y2); for(int j=l;j<=r;j++) { )*m+a[j].y1,u2=(a[j].x2-)*m+a[j].y2; int t=dis[u1]+dis[u2]; ans[a[j].id]=min(ans[a[j].id],t); } } ,k=r+; for(int i=l;i<=r;i++)if(a[i].y1<mid&&a[i].y2<mid)b[++j]=a[i];else if(a[i].y1>mid&&a[i].y2>mid)b[--k]=a[i]; ,l,j); ,y2,k,r); } } int main() { freopen("4456.in","r",stdin); freopen("4456.out","w",stdout); scanf("%d %d",&n,&m); ;i<=n;i++) ;j<m;j++) { )*m+j,v=(i-)*m+j+;scanf("%d",&x); add(u,v,x);add(v,u,x); } ;i<n;i++) ;j<=m;j++) { )*m+j,v=i*m+j;scanf("%d",&x); add(u,v,x);add(v,u,x); } scanf("%d",&cas); ;i<=cas;i++) { scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2); a[i].id=i;ans[i]=inf; } solve(,n,,m,,cas); ;i<=cas;i++)printf("%d\n",ans[i]); }
T3 star小星星
考场的时候竟然没想到状压。。。。好想撞墙呀。。。。
40感觉很好拿。。。。(雾
一开始并不是很能理解题解里“映射”的概念,后来是一边写代码一边想的,感觉这种习惯不太好
个人理解:所有点映射到全集的方案数-所有点映射到某个点集的方案数+所有点映射到某个点集的方案数++--……
这里关于“所有点映射到***的方案数”很好实现,一个树形DP就可以了
比较难想的是这个容斥,感觉容斥功底弱爆了。。。。O(2^n n^3)算了一下感觉不太对(要跑6s?)
但是A得很轻易啊。。。。。最后别忘了数组要开大,否则。。。边表爆炸
#include<cstdio> #include<algorithm> #define ll long long #define N 45 using namespace std; ,cnt; int vet[N],next[N],n,m,map[N][N],head[N],a[N]; ll dp[N][N],bin[N],sum,ans; void add(int u,int v) { edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum; } void dfs(int u,int fa) { int e=head[u]; ) { int v=vet[e]; if(v!=fa)dfs(v,u); e=next[e]; } ;i<=cnt;i++) { dp[u][i]=;e=head[u]; ) { ;if(v==fa){e=next[e];continue;} ;j<=cnt;j++) if(map[a[i]][a[j]])tmp+=dp[v][j]; dp[u][i]*=tmp;)break; e=next[e]; } } } int main() { freopen("4455.in","r",stdin); int u,v; scanf("%d%d",&n,&m); ;i<=m;i++) { scanf(; }bin[]=; ;i<=n;i++)bin[i]=bin[i-]<<; ;i<n;i++) { scanf("%d%d",&u,&v);add(u,v);add(v,u); } ans=; ;i<bin[n];i++) { sum=cnt=;;k<=n;k++)])a[++cnt]=k; dfs(,);;k<=cnt;k++)sum+=dp[][k]; )ans-=sum;else ans+=sum; //printf("%lld\n",ans); } printf("%lld",ans); }
zjoi2016 day1【bzoj4455】【bzoj4456】的更多相关文章
- 【BZOJ4456】[Zjoi2016]旅行者 分治+最短路
[BZOJ4456][Zjoi2016]旅行者 Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北的道路,这些道路两两相交形 ...
- 【BZOJ4455】小星星(动态规划,容斥)
[BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...
- 【BZOJ4456】旅行者(最短路,分治)
[BZOJ4456]旅行者(最短路,分治) 题面 BZOJ Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北 的道路,这些 ...
- 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...
- 【无旋式treap】例题
[bzoj3223]文艺平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[ ...
- 【Python】【面向对象】
"""# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
随机推荐
- 多线程编程4 - NSOperationQueue
一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...
- Struts2之OGNL
一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...
- ***PHP中error_reporting()用法详解(含codeigniter框架中屏蔽错误提示的解决方案)
php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看. e ...
- Solr入门之(4)配置文件solr.xml
<?xml version="1.0" encoding="UTF-8" ?> <!-- This is an example of a si ...
- 免费电子书:C#代码整洁之道
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:<Clean Code(代码整洁之道)>是一本经典的著作,那么对于编写整洁 ...
- 在VS 2015中边调试边分析性能
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...
- 关于UltraISO打开iso文件后只有部分文件问题
背景:在安装CentOS 7的时候,用UltraISO打开之后,只有一个EFI文件,刻完U盘,却无法引导. 之前还以为偶没下载全,就又下了一遍,还好偶搞得的NetInstall,要不然就呵呵了. 解决 ...
- Sublime Text3 配置Node.js运行命令
在Sublime Text中可以很容易配置新的编译运行命令,下面的截图是汉化版的中文菜单,英文菜单请直接对照. 首先需要在本地安装Node,默认的Node会加入到系统的环境变量,这样执行Node命 ...
- JQuery EasyUI validatebox(验证框)
JQuery EasyUI validatebox(验证框) http://www.easyui.info/archives/602.html
- 两个本地(localhost)html文件之间的传值
什么是iframe? iframe 元素会创建包含另外一个文档的内联框架(即行内框架).可以理解为把iframe解释成“浏览器中的浏览器“ 在IE中: document.frames[i].docum ...