A.小Z的可恶路障

题目:http://www.luogu.org/problem/show?pid=U126

题解:暴力也可以过吧。我为了保险先求了一次最短路,然后枚举这条最短路上的所有边。。。

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<string>
  12. #define inf 1000000000
  13. #define maxm 100000
  14. #define eps 1e-10
  15. #define ll long long
  16. #define pa pair<int,int>
  17. #define for0(i,n) for(int i=0;i<=(n);i++)
  18. #define for1(i,n) for(int i=1;i<=(n);i++)
  19. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  20. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  21. #define mod 1000000007
  22. using namespace std;
  23. inline int read()
  24. {
  25. int x=,f=;char ch=getchar();
  26. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  27. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  28. return x*f;
  29. }
  30. struct edge{int go,next,w,from;}e[*maxm];
  31. int n,m,tot=,q[maxm],d[maxm],head[maxm],pre[maxm];
  32. bool v[maxm],can[maxm];
  33. void ins(int x,int y,int z)
  34. {
  35. e[++tot].go=y;e[tot].from=x;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
  36. }
  37. void insert(int x,int y,int z)
  38. {
  39. ins(x,y,z);ins(y,x,z);
  40. }
  41. void spfa()
  42. {
  43. for(int i=;i<=n;++i) d[i]=inf;
  44. memset(v,,sizeof(v));
  45. int l=,r=,x,y;q[]=;d[]=;
  46. while(l!=r)
  47. {
  48. x=q[++l];if(l==maxm-)l=;v[x]=;
  49. for(int i=head[x];i;i=e[i].next)
  50. if(d[x]+e[i].w<d[y=e[i].go])
  51. {
  52. d[y]=d[x]+e[i].w;
  53. pre[y]=i;
  54. if(!v[y]){v[y]=;q[++r]=y;if(r==maxm-)r=;}
  55. }
  56. }
  57. }
  58. int main()
  59. {
  60. freopen("input.txt","r",stdin);
  61. freopen("output.txt","w",stdout);
  62. n=read();m=read();int x,y,z;
  63. for1(i,m)x=read(),y=read(),z=read(),insert(x,y,z);
  64. spfa();
  65. for(int i=pre[n];i;i=pre[e[i].from])can[i]=;
  66. int ans=,tmp=d[n];
  67. for1(i,tot)
  68. if(can[i])
  69. {
  70. e[i].w<<=;
  71. e[i^].w<<=;
  72. spfa();
  73. ans=max(ans,d[n]-tmp);
  74. e[i].w>>=;
  75. e[i^].w>>=;
  76. }
  77. printf("%d\n",ans);
  78. return ;
  79. }

B.小Z的游戏分队

题目:http://www.luogu.org/problem/show?pid=U127

题解:这题我做的比较满意,说一下我的做法:

首先i 不愿意与 j 在一组,那么我们就merge(i,j+n) merge(j+n,i) (做过食物链、关押罪犯的都知道什么意思吧。。。)

然后执行完之后整个图就分为了好多个块块,有些块之间有边相连,代表这两块一定不能在同一组里。

当然一个块最多只会和一个块相连,否则这两个块一定已经被缩成了一个块

然后怎么做呢?类似与搭建双塔,我们可以用一个二维可行性背包DP,当然应为总人数是确定的,所以可以缩成1维

状态如何转移呢?

  1. f[]=;
  2. for1(i,n)
  3. if(s[i])
  4. {
  5. if(can[i])
  6. {
  7. for3(j,n-s[i],)
  8. if(f[j])f[j+s[i]]=;
  9. }
  10. else if(b[i])
  11. {
  12. for3(j,n,)
  13. if(f[j])
  14. {
  15. f[j]=;
  16. if(j+s[i]<=n)f[j+s[i]]=;
  17. if(j+s[b[i]]<=n)f[j+s[b[i]]]=;
  18. }
  19. }
  20. }

应该很清楚了吧。如果 i 块没有边与其他块相连,那么它可以选择加进 a 组,或者不加进 a 组

否则  它与它相连的块要么一个在 a 组,要么 另一个在 a 组。

最后统计一下就ok了。

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<string>
  12. #define inf 1000000000
  13. #define maxn 100000
  14. #define maxm 500+100
  15. #define eps 1e-10
  16. #define ll long long
  17. #define pa pair<int,int>
  18. #define for0(i,n) for(int i=0;i<=(n);i++)
  19. #define for1(i,n) for(int i=1;i<=(n);i++)
  20. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  21. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  22. #define mod 1000000007
  23. using namespace std;
  24. inline int read()
  25. {
  26. int x=,f=;char ch=getchar();
  27. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  28. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  29. return x*f;
  30. }
  31. int n,fa[maxn],a[maxn],b[maxn],s[maxn];
  32. bool can[maxn],f[maxn];
  33. inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  34. inline void merge(int x,int y)
  35. {
  36. int xx=find(x),yy=find(y);
  37. if(xx!=yy)fa[yy]=xx;
  38. }
  39. int main()
  40. {
  41. freopen("input.txt","r",stdin);
  42. freopen("output.txt","w",stdout);
  43. n=read();
  44. for1(i,n*)fa[i]=i;
  45. for1(i,n)
  46. {
  47. int x=read();
  48. while(x){can[x]=;x=read();};
  49. for1(j,n)
  50. {
  51. if(!can[j]&&j!=i)
  52. {
  53. if(find(j)==find(i)||find(j+n)==find(i+n))
  54. {printf("No solution\n");return ;}
  55. merge(i,j+n);
  56. merge(j,i+n);
  57. }
  58. can[j]=;
  59. }
  60. }
  61. for1(i,n)if(find(i)==find(i+n)){printf("No solution\n");return ;}
  62. for1(i,n)s[find(i)]++;
  63. for1(i,n)can[i]=;
  64. for1(i,n)
  65. for1(j,n)
  66. if(find(i)==find(j+n))
  67. {
  68. int x=find(i),y=find(j);
  69. b[min(x,y)]=max(x,y);
  70. can[x]=can[y]=;
  71. }
  72. f[]=;
  73. for1(i,n)
  74. if(s[i])
  75. {
  76. if(can[i])
  77. {
  78. for3(j,n-s[i],)
  79. if(f[j])f[j+s[i]]=;
  80. }
  81. else if(b[i])
  82. {
  83. for3(j,n,)
  84. if(f[j])
  85. {
  86. f[j]=;
  87. if(j+s[i]<=n)f[j+s[i]]=;
  88. if(j+s[b[i]]<=n)f[j+s[b[i]]]=;
  89. }
  90. }
  91. }
  92. int ans=n,x=,y=n;
  93. for1(i,n)
  94. if(f[i])
  95. {
  96. int j=n-i;
  97. if(abs(i-j)<ans)ans=abs(i-j),x=i,y=j;
  98. }
  99. printf("%d %d\n",min(x,y),max(x,y));
  100. return ;
  101. }

C.小Z的神奇数列

题目:http://www.luogu.org/problem/show?pid=U129

题解:SXBK的出题人,硬是把我的线段树卡到和暴力一个分T_T

线段树的做法应该是显然的吧,先将数组排序,然后每次二分到要删的位置,线段树单点修改一下。

不知道出题人的标程是什么神奇的做法。

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<string>
  12. #define inf 1000000000
  13. #define maxn 1000000+10000
  14. #define maxm 5000000+10000
  15. #define eps 1e-10
  16. #define ll long long
  17. #define pa pair<int,int>
  18. #define for0(i,n) for(int i=0;i<=(n);i++)
  19. #define for1(i,n) for(int i=1;i<=(n);i++)
  20. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  21. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  22. #define mod 317847191
  23. using namespace std;
  24. inline int read()
  25. {
  26. int x=,f=;char ch=getchar();
  27. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  28. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  29. return x*f;
  30. }
  31. int n,m,a[maxn],mx[maxm],mi[maxm],ret[maxm];
  32. bool b[maxn];
  33. int find(int x)
  34. {
  35. int l=,r=n,mid;
  36. while(l<=r)
  37. {
  38. mid=(l+r)>>;
  39. if(a[mid]>x||(a[mid]==x&&b[mid]))r=mid-;
  40. else l=mid+;
  41. }
  42. b[l]=;
  43. return l;
  44. }
  45. inline void pushup(int k)
  46. {
  47. mx[k]=max(mx[k<<],mx[k<<|]);
  48. mi[k]=min(mi[k<<],mi[k<<|]);
  49. ll tmp=ret[k<<];
  50. tmp=(tmp*ret[k<<|])%mod;
  51. ret[k]=tmp;
  52. }
  53. inline void build(int k,int l,int r)
  54. {
  55. int mid=(l+r)>>;
  56. if(l==r){mx[k]=mi[k]=ret[k]=a[l];return;}
  57. build(k<<,l,mid);build(k<<|,mid+,r);
  58. pushup(k);
  59. }
  60. inline void del(int k,int l,int r,int x)
  61. {
  62. int mid=(l+r)>>;
  63. if(l==r){mx[k]=-inf;mi[k]=inf;ret[k]=;return;}
  64. if(x<=mid)del(k<<,l,mid,x);else del(k<<|,mid+,r,x);
  65. pushup(k);
  66. }
  67. int main()
  68. {
  69. freopen("input.txt","r",stdin);
  70. freopen("output.txt","w",stdout);
  71. n=read();m=read();
  72. for1(i,n)a[i]=read();
  73. sort(a+,a+n+);
  74. for1(i,n)b[i]=;
  75. build(,,n);
  76. ll ans,x,y;
  77. while(m--)
  78. {
  79. char ch[];
  80. scanf("%s",ch);
  81. if(ch[]=='D')del(,,n,find(read()));
  82. else if(ch[]=='B')printf("%d\n",mx[]);
  83. else if(ch[]=='S')printf("%d\n",mi[]);
  84. else if(ch[]=='M')
  85. {
  86. for(ans=,x=mx[],y=mi[];y;y>>=,x=(x*x)%mod)
  87. if(y&)ans=(ans*x)%mod;
  88. printf("%d\n",ans);
  89. }
  90. else printf("%d\n",ret[]);
  91. }
  92. return ;
  93. }

D.小Z的迷之阶梯

题目:http://www.luogu.org/problem/show?pid=U130

题解:出题人的声明就是在告诉我们这是道大水题吧。。。

n=200的数据范围很容易让我们想到n^3的算法,枚举上一个点o(n),枚举从该点向下退的次数o(n),

状态数o(n),n^3水过。。。

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<string>
  12. #define inf 1000000000
  13. #define maxn 100000
  14. #define maxm 500+100
  15. #define eps 1e-10
  16. #define ll long long
  17. #define pa pair<int,int>
  18. #define for0(i,n) for(int i=0;i<=(n);i++)
  19. #define for1(i,n) for(int i=1;i<=(n);i++)
  20. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  21. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  22. #define mod 1000000007
  23. using namespace std;
  24. inline int read()
  25. {
  26. int x=,f=;char ch=getchar();
  27. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  28. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  29. return x*f;
  30. }
  31. int n,a[maxn],f[maxn];
  32. int main()
  33. {
  34. freopen("input.txt","r",stdin);
  35. freopen("output.txt","w",stdout);
  36. n=read();
  37. for1(i,n)a[i]=read();
  38. f[]=;
  39. for2(i,,n)f[i]=inf;
  40. for2(i,,n)
  41. for1(j,i-)
  42. for0(k,j-)
  43. if(a[j-k]+(<<k)>=a[i])
  44. f[i]=min(f[i],f[j]+k+);
  45. printf("%d\n",f[n]==inf?-:f[n]);
  46. return ;
  47. }

CONTEST36 小Z的模拟赛(2)的更多相关文章

  1. 小X归来 模拟赛1 解析

    Problem1 单峰 小X 归来后,首先对数列很感兴趣.他想起有1类特殊的数列叫单峰数列. 我们说一个数列 {ai} 是单峰的,当且仅当存在一个位置 k 使得 ai < ai+1(i < ...

  2. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  3. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  4. 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

  5. 【0521模拟赛】小Z爱数学

    题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入 ...

  6. 【0521模拟赛】小Z爱划水

    题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...

  7. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  8. Java 第十一届 蓝桥杯 省模拟赛 小明的城堡

    小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...

  9. Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)

    小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...

随机推荐

  1. Raid1源代码分析--Barrier机制

    本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...

  2. [HNOI 2013] 消毒 (搜索,二分图匹配)

    题目大意 一个a * b * c(a * b * c <= 5000)大小的长方体中有一些点需要被覆盖,每次可以选择任意大小的长方体,覆盖其中的点,产生的代价为这个长方体长宽高中最小的那个的长度 ...

  3. java实现的23种设计模式 (个人推荐)

    http://zz563143188.iteye.com/blog/1847029 mark下,个人用,大家会也可以看看写的不错.

  4. JS(三)

    1.检查用户名中是否含有特殊字符: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  5. hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. 数据库VIEW(视图)

    视图是基于 SQL 语句的结果集的可视化的表. 视图包括行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 我们能够向视图加入 SQL 函数.WHERE 以及 JOI ...

  7. js中时间戳与日期转换-js日期操作

    常用的一些日期操作. 用js获取一个时间戳. <script type="text/javascript"> var date = new Date();//当前时间 ...

  8. rpm包安装

    RPM全称是“RedHatPackageManager”是由RedHat公司发发展起来的,本质是将软件源码包经过编译并且打包成rpm的格式,rpm文件包含的有二进制文件,配置文件,库文件等,同时RPM ...

  9. SQL每个用户最后的一条记录

    SELECT [ID] ,[UserID] ,[StartDate] ,[EndDate] ,[CreateUser] ,[CreateDate] ,[LastEditUser] ,[LastEdit ...

  10. SQL从入门到基础 - 06 限制结果集范围

    一.限制结果集行数 1. Select top 5* from T_Employee order by FSalary DESC 2. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...