1.礼物(JZOJ 4685
(gift.cpp\c\pas)
【问题描述】
夏川的生日就要到了。作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物。
商店里一共有种礼物。夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得)。
每次,店员会按照一定的概率Pi(或者不拿出礼物),将第i种礼物拿出来。季堂每次都会将店员拿出来的礼物买下来。没有拿出来视为什么都没有买到,也算一次购买。
众所周知,白毛切开都是黑的。所以季堂希望最后夏川的喜悦值尽可能地高。
求夏川最后最大的喜悦值是多少,并求出使夏川得到这个喜悦值,季堂的期望购买次数。
【输入格式】
第一行,一个整数N,表示有N种礼物。
接下来N行,每行一个实数Pi和正整数Wi,表示第i种礼物被拿出来的概率和可以获得喜悦值。
【输出格式】
第一行,一个整数表示可以获得的最大喜悦值。
第二行,一个实数表示获得这个喜悦值的期望购买次数,保留3位小数。
【输入输出样例】
gift.in
gift.out
3
0.1 2
0.2 5
0.3 7

14
12.167
【数据范围】
对于10%的数据,N = 1
对于30%的数据,N ≤ 5
对于100%的数据,N ≤ 20 ,0 < Wi ≤ 10^9 ,0 < Pi ≤ 1且ΣPi ≤ 1
注意:本题不设spj
题解:

没怎么做过期望dp,考完改错都改了半天。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=22;
int ans=0,n,w[MAXN];
ll tot=0;
double p[MAXN];
double f[1<<MAXN];
int main() {freopen("gift.in","r",stdin);freopen("gift.out","w",stdout);scanf("%d",&n);for (register int i=0;i<n;++i) scanf("%lf%d",&p[i],&w[i]),tot+=w[i];printf("%I64d\n",tot);for (register int S=1;S<(1<<n);++S) {double sp=0.0,sf=0.0;for (int i=0;i<n;++i) {if (S&(1<<i)) {sp+=p[i];sf+=p[i]*f[S^(1<<i)];}}f[S]=(1.0+sf)/sp;}printf("%.3lf\n",f[(1<<n)-1]);return 0;
}

2.通讯(hdu 3072
(message.cpp\c\pas)
【问题描述】
“这一切都是命运石之门的选择。”
试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮)。
为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯网络,传达到所有分部。
SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线路有一个固定的通讯花费Ci。
为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向另一个与它有线路的部门传递(可能存在多条通信线路)。我们定义总费用为所有部门传递消息的费用和。
幸运的是,如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费。
由于资金问题(预算都花在粒子对撞机上了),SERN总部的工程师希望知道,达到目标的最小花费是多少。
【输入格式】
多组数据,文件以2个0结尾。
每组数据第一行,一个整数N,表示有N个包括总部的部门(从0开始编号)。然后是一个整数M,表示有M条单向通讯线路。
接下来M行,每行三个整数,Xi,Yi,Ci,表示第i条线路从Xi连向Yi,花费为Ci。
【输出格式】
每组数据一行,一个整数表示达到目标的最小花费。
【输入输出样例】
message.in
message.out
3 3
0 1 100
1 2 50
0 2 100
3 3
0 1 100
1 2 50
2 1 100
2 2
0 1 50
0 1 100
0 0

150
100
50
【样例解释】
第一组数据:总部把消息传给分部1,分部1再传给分部2.总费用:100+50=150.
第二组数据:总部把消息传给分部1,由于分部1和分部2可以互相传递消息,所以分部1可以无费用把消息传给2.总费用:100+0=100.
第三组数据:总部把消息传给分部1,最小费用为50.总费用:50.
【数据范围】
对于10%的数据,保证M=N-1
对于另30%的数据,N ≤ 20 ,M ≤ 20
对于100%的数据,N ≤ 50000 ,M ≤ 10^5 ,Ci ≤ 10^5 ,数据组数 ≤ 5
数据保证一定可以将信息传递到所有部门。

题解:tarjan缩点完之后,由于整个图一定连通,所以直接贪心,每个点直接选取最小入边即可。考试时脑抽写个并查集也是吃饱了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=5e4+2,MAXM=1e5+2;
int n,m,head[MAXN],edge=0;
struct EDGE {int u,v,w,nxt;
}e[MAXM];
int dfn[MAXN],low[MAXN],bel[MAXN],tim,snt;
bool ins[MAXN];
stack<int> S;
int ans[MAXN];
ll res=0;
inline void init() {tim=edge=snt=0;res=0;memset(head,-1,sizeof(head));memset(dfn,0,sizeof(dfn));memset(ans,127,sizeof(ans));while (!S.empty()) S.pop();
}
inline int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x*f;
}
inline void adde(int u,int v,int w) {e[edge].nxt=head[u],e[edge].u=u,e[edge].v=v,e[edge].w=w,head[u]=edge++;
}
void dfs(int p) {S.push(p);dfn[p]=low[p]=++tim;ins[p]=true;for (int i=head[p];~i;i=e[i].nxt) {int v=e[i].v;if (!dfn[v]) {dfs(v);low[p]=min(low[p],low[v]);}else if (ins[v]) low[p]=min(low[p],dfn[v]);}if (dfn[p]==low[p]) {++snt;while (!S.empty()) {int t=S.top();S.pop();bel[t]=snt;ins[t]=false;if (t==p) break;}}
}
int main() {freopen("message.in","r",stdin);freopen("message.out","w",stdout);while (~scanf("%d%d",&n,&m)&&(n||m)) {init();for (register int i=0;i<m;++i) {int u=read(),v=read(),w=read();adde(u,v,w);}for (register int i=0;i<n;++i)if (!dfn[i]) dfs(i);for (register int i=0;i<m;++i) {int u=bel[e[i].u],v=bel[e[i].v];if (u^v) ans[v]=min(ans[v],e[i].w);}//图一定连通,用个*的并查集,每个点直接贪心最小入边即可for (int i=1;i<=snt;++i)if (bel[0]^i)res+=ans[i];printf("%I64d\n",res);}return 0;
}

3.奇袭(codeforces 526F)
(raid.cpp\c\pas)
【问题描述】
由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上
要迎来最终的压力测试——魔界入侵。
唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量
是远远不够的。所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族。
在UW的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前
发动一次奇袭,袭击魔族大本营!
为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族
大本营进行侦查,并计算出袭击的难度。
经过侦查,你绘制出了魔族大本营的地图,然后发现,魔族大本营是一个N
×N的网格图,一共有N支军队驻扎在一些网格中(不会有两只军队驻扎在一起)。
在大本营中,每有一个k×k(1≤k≤N)的子网格图包含恰好k支军队,我们袭
击的难度就会增加1点。
现在请你根据绘制出的地图,告诉爱丽丝这次的袭击行动难度有多大。
【输入格式】
第一行,一个正整数N,表示网格图的大小以及军队数量。
接下来N行,每行两个整数,Xi,Yi,表示第i支军队的坐标。
保证每一行和每一列都恰有一只军队,即每一个Xi和每一个Yi都是不一样
的。
【输出格式】
一行,一个整数表示袭击的难度。
【输入输出样例】
raid.in raid.out
5
1 1
3 2
2 4
5 5
4 3

10
【样例解释】
显然,分别以(2,2)和(4,4)为左上,右下顶点的一个子网格图中有3支军队,
这为我们的难度贡献了1点。
类似的子网格图在原图中能找出10个。
【数据范围】
对于30%的数据, N ≤ 100
对于60%的数据, N ≤ 5000
对于100%的数据, N ≤ 50000

CDQ分治,每个区间分四种情况讨论,好像也可以用线段树实现,我的代码是按照codeforces 526F写的,所以开了3e5的数组。
下面是来自出题人的题解:
显然,题目可化简为:给定 N 个数的一个排列,问这个序
列中有多少个子区间的数恰好是连续的。
进一步可以化为:有多少种情况使得,相邻的 k 个数中最大
值和最小值的差小于等于 k-1。
大致有两种解法,一种是分治,一种是线段树
这里主要讲一下分治的解法。
考虑分治,对于当前分治区间[L,R],记区间中点为 mid。当
前区间的答案就是Ans[L..mid]+Ans[mid+1..R]+跨过中点的合
法区间数,然后就分为两种情况了:
1.最小值和最大值在同侧。
2.最小值和最大值在异侧。
下面只考虑最值同在左,和最小值在左,最大值在右的情况。
其余两种是对称的。
对于最值同在左侧的情况,我们枚举左边界在哪,然后可以
计算出右边界的位置,在判断是否合法,统计答案。时间复杂度:
O(N).
对于最小值在左侧,最大值在右侧的情况,如果一个区间满
足我们所要求的关系的话,就一定有:
max(a[mid +1]…a[right]) - min(a[left]…a[mid]) = right - left
移项可得
max(a[mid +1]…a[right]) - right = min(a[left]…a[mid]) - left
然后可以用单调栈/来完成这个任务。时间复杂度:O(N).
如果加一些黑科技可以大大减少代码量,但是复杂度会多一
个 log。
总的时间复杂度:O(NlogN)/O(NlogN^2)
简单提一下,线段树解法的思路大致也是维护一个单调栈,
然后进行区间修改和查询,统计答案。
时间复杂度:O(NlogN).

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=3e5+2;
int n,mn[MAXN],mx[MAXN],a[MAXN],t[MAXN*4];
ll ans=0;
void divide(int l,int r) {if (l==r) return ;int mid=(l+r)>>1,p1,p2;mn[mid]=mx[mid]=a[mid];mn[mid+1]=mx[mid+1]=a[mid+1];for (int i=mid-1;i>=l;--i) mx[i]=max(a[i],mx[i+1]),mn[i]=min(a[i],mn[i+1]);for (int i=mid+2;i<=r;++i) mx[i]=max(a[i],mx[i-1]),mn[i]=min(a[i],mn[i-1]);p1=mid+1,p2=mid+1;for (int i=mid;i>=l;--i) {int j=i+mx[i]-mn[i];if (j>mid&&j<=r&&mx[j]<mx[i]&&mn[j]>mn[i]) ++ans;//min,max|while (p2<=r&&mn[p2]>mn[i]) ++t[mx[p2]-p2+MAXN],++p2;//legalwhile (p1<=r&&mx[p1]<mx[i]) --t[mx[p1]-p1+MAXN],++p1;//illegalans+=max(t[mn[i]-i+MAXN],0);//min|max}for (int i=l;i<=r;++i) t[mx[i]-i+MAXN]=0;p1=mid,p2=mid;for (int i=mid+1;i<=r;++i) {int j=i-mx[i]+mn[i];if (j<=mid&&j>=l&&mx[j]<mx[i]&&mn[j]>mn[i]) ++ans;//max,min|while (p2>=l&&mn[p2]>mn[i]) ++t[mx[p2]+p2+MAXN],--p2;//legalwhile (p1>=l&&mx[p1]<mx[i]) --t[mx[p1]+p1+MAXN],--p1;//illegalans+=max(t[mn[i]+i+MAXN],0);//max|min}for (int i=l;i<=r;++i) t[mx[i]+i+MAXN]=0;divide(l,mid),divide(mid+1,r);
}
inline int read() {int x=0;char c=getchar();while (c<'0'||c>'9') c=getchar();while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x;
}
int main() {freopen("raid.in","r",stdin);freopen("raid.out","w",stdout);
//  printf("memory==%d\n",sizeof(a)<<2);n=read();for (int i=1;i<=n;++i) {int x=read(),y=read();a[x]=y;}divide(1,n);printf("%lld\n",ans+n);return 0;
}

9.2NOIP模拟赛相关推荐

  1. 11.2NOIP模拟赛

    /* 根右左遍历后最长上升子序列 */ #include<iostream> #include<cstdio> #include<cstring> #include ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  4. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  5. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  8. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

最新文章

  1. 2015年企业如何避免索尼式的安全悲剧?
  2. golang mongodb or条件_MongoDB的学习,操作命令详细介绍
  3. 招聘│微软云计算英雄帖来了,快接招!
  4. Faker库:一个数据造假的神库
  5. 操作系统基础:进程知识笔记(三)
  6. 服务器系统日志有哪些centos,CentOS 分析服务器日志命令
  7. mysql datetime 后面带了很多0_面试官:MySQL 表设计要注意什么?
  8. 实战案例丨使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步
  9. 无废话C#设计模式系列文章
  10. itemCF matlab算法,推荐系统初探:ItemCF算法实现知乎问题推荐
  11. Linux学习笔记4 - Linux常用命令
  12. UDS(ISO14229)诊断服务功能及描述完结篇
  13. c计算机软考中级考什么,计算机软考中级考试内容
  14. CPU飙高原因及解决方案
  15. Ubuntu下用Emacs编写D语言程序
  16. JavaScript做浏览器检测
  17. 初级会计报名-IE浏览器攻略
  18. BZOJ1064【NOI2008】【假面舞会】
  19. Sigmoid函数以及传统线性函数
  20. 【vn.py】CTP首次登陆修改密码 之 接口调用法

热门文章

  1. 圆形或者椭圆形交通标志图像匹配模板
  2. 证明多元函数极限不存在的一个解法
  3. 考研高等数学基础篇武忠祥第一章函数极限连续思维导图
  4. EXCEL数据有效性前置校验的两种方式
  5. CAD快捷键相关笔记《①》
  6. 一看就懂的var、let、const三者区别
  7. 【数据结构与算法】之深入解析“摘樱桃II”的求解思路与算法示例
  8. python学习笔记霍兰德人格分析与错误解决
  9. 1053. 交换一次的先前排列
  10. opencv 的norm_opencv norm