T1

题意:有 \(n\) 个点,有 \(m\) 条边,每次加入一条到图中

每个点的度数大于零且都是偶数的子图的个数

考试直接判断两点是否出现,出现则更新

其实只要改成并查集判断即可

原理:其实就是让你找环及其组合个数,

若两点原本相连,此时多一条边,则 \(ans\) 变为 \(2ans+1\)

这点不难。若删去任意一边,新的边与剩下的组成 \(ans\) 个环,这条边与新的边又有一个环

#include<bits/stdc++.h>
using namespace std;
const int N=200005,M=300005;
int n,m,fa[N];
long long ans;
int fnd(int x) {
while(fa[x]^x)x=fa[x]=fa[fa[x]];
return x;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1,u,v;i<=m;i++) {
scanf("%d%d",&u,&v);
u=fnd(u),v=fnd(v);
if(u^v)fa[u]=v;
else ans=(ans<<1|1)%1000000009;
printf("%lld\n",ans);
}
}

T2

有 \(n\times m\) 的方阵,有 \(T\) 个特殊点,两个相邻的点或首尾都可交换

问能不能使每行或每列的特殊点个数一样,

都可以一样输出 both ,只有行可以输出 row ,列可以输出 column ,不行输出 impossible

可以发现若 \(T\mod n=0\) 则行成立, \(T\mod m=0\) 则列可以。而且行和列互不干扰

还有一点:肯定是相邻两行互换,然后推到下一行

那么可以把行个数看成 \(n\) 堆纸牌,于是成了——环状均分纸牌

怎么做?设 \(b_i=a_i-\dfrac{T}{n},s_i=\sum_1^i b_i\)

那么从 \(k\) 开始推,\(i\) 到 \(i+1\) 的答案就是 \(|s_i-s_k|\) 总代价是 \(\sum_{i=1}^n |s_i-s_k|\)

发现当 \(s_k\) 为中位数时最小,所以排序,然后 \(s_k=s_{mid}\) 算答案即可

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
int n,m,T,x[N],y[N],mi;
LL t[N],s[N],ans;
void mer(int l,int r) {
if(l>=r)return;
register int mid=l+r>>1,i=l,j=mid+1,k=l-1;
mer(l,mid),mer(mid+1,r);
for(;i<=mid && j<=r;)
if(s[i]<s[j])t[++k]=s[i++];
else t[++k]=s[j++];
for(;i<=mid;)t[++k]=s[i++];
for(;j<=r;)t[++k]=s[j++];
for(int C=l;C<=r;C++)s[C]=t[C];
}
int main() {
scanf("%d%d%d",&n,&m,&T);
if(T%n==0&&T%m==0)printf("both ");
else if(T%n==0)printf("row ");
else if(T%m==0)printf("column ");
else return printf("impossible"),0;
for(int i=1,a,b;i<=T;i++)
scanf("%d%d",&a,&b),x[a]++,y[b]++;
if(T%n==0) {
for(int i=1;i<=n;i++)s[i]=s[i-1]+x[i]-T/n;
mer(1,n),mi=n+1>>1;
for(int i=1;i<=n;i++)ans+=abs(s[i]-s[n+1>>1]);
}
if(T%m==0) {
for(int i=1;i<=m;i++)s[i]=s[i-1]+y[i]-T/m;
mer(1,m);
for(int i=1;i<=m;i++)ans+=abs(s[i]-s[m+1>>1]);
}
printf("%lld",ans);
}

T3

题意:构造一个最长的 01 串使得形成的环中从任意一点顺时针 \(k\) 个连起来的数互不相同

搜索+剪枝,没了

T4

题意:有 \(n\) 个挑战,第 \(i\) 个挑战胜利的百分比是 \(p_i\) ,其类型为 \(a_i\)

若 \(a_i=-1\) 赢了会得到挂件,消耗 1 空间;若 \(a_i\ge0\) 则赢了获得 \(a_i\) 的空间

初始有 \(K\) 空间,必须赢 \(L\) 局才能结束,问能结束且获得所有挂件的概率

设 \(f_{i,j,k}\) 为到第 \(i\) 场比赛空间为 \(j\) 赢了 \(k\) 局的概率

发现其实挂件最多 \(n\) 个,空间超过 \(n\) 就没用了,空间问题解决了

然后按照 \(a\) 排序,保证最后的空间 \(\ge 0\) 。

最后转移, \(f_{i,j,k}=f_{i-1,j-a_i,k-1}\times p_i+f_{i-1,j,k}\times(1-p_i)\)

其实就是赢得概率和输的概率之和

答案是 \(\sum_j\sum_{k=L}^n f_{n,j,k}\)

#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=205;
int n,L,K,x[N],xp;
db p[N],f[N][205][N],ans;
void sor(int l,int r) {
register int i=l,j=r,mid=x[l+r>>1];
while(i<=j) {
while(x[i]>mid)i++;
while(x[j]<mid)j--;
if(i<=j) {
swap(x[i],x[j]);
swap(p[i],p[j]);
i++,j--;
}
}
if(i<r)sor(i,r);
if(j>l)sor(l,j);
}
int main() {
scanf("%d%d%d",&n,&L,&K);
for(int i=1;i<=n;i++)scanf("%lf",&p[i]),p[i]/=100.0;
for(int i=1;i<=n;i++)scanf("%d",&x[i]),xp+=(x[i]<0);
f[0][K][0]=1;
sor(1,n);
for(int i=1;i<=n;i++) {
for(int j=0;j<=200;j++) {
for(int k=0;k<=n;k++) {
f[i][j][k]=f[i-1][j][k]*(1-p[i]);
if(k && j-x[i]>=0)f[i][j][k]+=f[i-1][min(200,j-x[i])][k-1]*p[i];
}
}
}
for(int i=0;i<=200;i++)
for(int j=L;j<=n;j++)ans+=f[n][i][j];
printf("%.6lf",ans);
}

总结

T1:深入思考

T2:环状均分纸牌

T3:暴力别打炸

T4:概率 dp 不要慌

2021.06.19【NOIP提高B组】模拟 总结的更多相关文章

  1. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  2. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  3. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  4. 2021.03.06【NOIP提高B组】模拟 总结

    T1 看起来十分复杂,打表后发现答案是 \(n*m\mod p\) 具体的证明... 原式的物理意义,就是从坐标原点(0,0),用每一种合法的斜率, 穿过坐标[1 ~ n , 1 ~ m]的方阵中的整 ...

  5. [JZOJ5817] 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

  6. [JZOJ5818] 【NOIP提高A组模拟2018.8.15】 做运动

    Description 一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长. 幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来 ...

  7. 【NOIP提高A组模拟2018.8.14】 区间

    区间加:差分数组修改 O(n)扫描,负数位置单调不减 #include<iostream> #include<cstring> #include<cstdio> # ...

  8. [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)

    传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...

  9. [jzoj 5781]【NOIP提高A组模拟2018.8.8】秘密通道 (最短路)

    传送门 Description 有一副nm的地图,有nm块地,每块是下列四种中的一种: 墙:用#表示,墙有4个面,分别是前面,后面,左面,右面. 起点:用C表示,为主角的起点,是一片空地. 终点:用F ...

  10. [jzoj 5778]【NOIP提高A组模拟2018.8.8】没有硝烟的战争 (博弈论+dp)

    传送门 Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x ...

随机推荐

  1. 微信小程序animation动画2种方法

    这里介绍 2 种方法一种是常规的小程序方法操作,另一种是引入动画库 1. 常规动画操作设置 wxml: <view> <view bindtap="clickMe" ...

  2. java集合(arraylist详解)

    一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类 ...

  3. 【转载】【zabbix】自定义监控项key值

    [转载]https://www.cnblogs.com/zhenglisai/p/6547402.html [zabbix]自定义监控项key值   说明: zabbix自带的默认模版里包括了很多监控 ...

  4. 《头号玩家》AI电影调研报告(五)

    4.VR自由行走跑步机 电影中,它可以让玩家朝任意方向无限奔跑并保持在平台最中央,还可以模拟上台阶和走斜坡的情况.而下面这件VR跑步装备,可以让你在游戏世界穿行自如. 奥地利创意公司Cyberith公 ...

  5. 【C++】二叉树的遍历(前中后)- 迭代法

    力扣题目:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 今天自己琢磨了很久如何不用递归将二叉树的遍历写出来,于是乎写出 ...

  6. caioj 1001: [视频]实数运算1[水题]

    题意:输入两个实数a和b,输出它们的和 题解:简单题不写题解了-- 代码: #include <cstdio> double a, b; int main() { while (~scan ...

  7. spring-注入list集合对象(值是对象)

    1.创建stu类 public class Stu { // //1.数组类型 // private String[] courses; // // //2.list集合属性 // private L ...

  8. python关于变量介绍

    python变量 一.变量分为两种解释 1.随时可以变化的量 称之为变量 (变化多端嘛) 2.不会被变化的量 称之为常量 (常常不动嘛) #我们学习的python中没有真正定义的常量 #只有在绑定一个 ...

  9. LevelDB 学习笔记1:布隆过滤器

    LevelDB 学习笔记1:布隆过滤器 底层是位数组,初始都是 0 插入时,用 k 个哈希函数对插入的数字做哈希,并用位数组长度取余,将对应位置 1 查找时,做同样的哈希操作,查看这些位的值 如果所有 ...

  10. [翻译] 使用 TensorFlow 进行分布式训练

    本文以两篇官方文档为基础来学习TensorFlow如何进行分布式训练,借此进入Strategy世界.