首先做了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】的更多相关文章

  1. 【BZOJ4456】[Zjoi2016]旅行者 分治+最短路

    [BZOJ4456][Zjoi2016]旅行者 Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北的道路,这些道路两两相交形 ...

  2. 【BZOJ4455】小星星(动态规划,容斥)

    [BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...

  3. 【BZOJ4456】旅行者(最短路,分治)

    [BZOJ4456]旅行者(最短路,分治) 题面 BZOJ Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北 的道路,这些 ...

  4. 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  5. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋

    Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...

  6. 【无旋式treap】例题

    [bzoj3223]文艺平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[ ...

  7. 【Python】【面向对象】

    """# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...

  8. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  9. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  10. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

随机推荐

  1. 20145213《Java程序设计》第八周学习笔记

    20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...

  2. ZendStudio如何汉化

    点击工具栏的help,看图 点击 Install New Sofaware...   看图 然后.... 在地址(12.0的版本):http://download.eclipse.org/techno ...

  3. windows一个目录下最大文件数目

    对于FAT16文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte): 卷的最大体积是4GB:每个卷上最多可以保存的文件数量是65,536个 ( ...

  4. Mysql之高可用

    使用缓存Memcache, 1,可使用Hash算法由客户端决定路由到哪个Memcache服务器上:客户端完全不用关心数据存储在哪个Memcache服务器上:完全隔离了客户端与服务端:由于是Hash,在 ...

  5. codevs 1080 线段树练习

    链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...

  6. mac版的PS和DW破解版安装

    到网上找到破解版的安装文件,一般是一个dmg安装文件,和一个补丁文件,安装的时候,要先断网,然后点击软件,选试用安装,安装完毕后,不要打开软件,直接关闭掉,然后到应用程序里找到软件图标,右击打开包文件 ...

  7. Mac系统下使用VirtualBox虚拟机安装win7--第四步 安装虚拟机硬件扩展包支持

    如 果想要在虚拟机上使用连接在 Mac 上的硬件外设,比如 U 盘,iPhone 等,需要我们在 Virtual Box 官网下载一个硬件支持扩展安装包.同样地,我们先打开虚拟机的下载页面: http ...

  8. probe函数何时调用的

    转自:http://blog.csdn.net/xiafeng1113/article/details/8030248 Linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名 ...

  9. linux后台运行和关闭、查看后台任务

    转自:http://www.cnblogs.com/kaituorensheng/p/3980334.html fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.&a ...

  10. “init terminating in do_boot” Windows10 Rabbit MQ fails to start

    在Windows 10环境下安装rabbitmq-server-3.6.2后,CMD中运行命令:rabbitmq-plugins enable rabbitmq_management 报错: { , ...