礼物、

首先见到期望一定要想dp,看到n的范围无脑想状压,

然后我就只想到这了。

dp方程式还是比较好想的,但是我依然想不出来

略经思考   颓题解


依然不会,随便写了个式子

i状态中不含j

$f[i]=\sum_\limits{j=1}^{j<=n} {f[j]\times p[j] }(买到之前没有的) $$+(1-p[i])\times {f[i]}(由自己转移过来(买到已经买过的)) $

$+1(什么也不买)$

显然不是i吖

然后

$f[i]=\sum_\limits{j=1}^{j<=n} {f[j]\times p[j] }(买到之前没有的) $ $+$ $(1-$$\sum_\limits{j=1}^{j<=n}p[j] )$ $\times f[i]+1(店员什么也没拿)$

观察,等式右面也有fi,如果我们楞做就是高斯消元了

那么移项得

$f[i]=$ $\frac{\sum_\limits{j=1}^{j<=n}f[j]\times p[j]+1} {\sum_\limits{j=1}^{j<=n} p[j]}$

转移就完了

代码

#include<bits/stdc++.h>
#define ll long long
#define A 1<<24
double f[A],p[A];
ll n,m,sum=0,Smily;
void turn(ll x,ll n)
{
ll t=x,num=0,xx[100];
while(x) xx[num++]=x%2,x/=2;
for(ll i=num;i<n;i++)printf("0");
for(ll i=num-1;i>=0;i--)printf("%lld",xx[i]);
puts("");
}
using namespace std;
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lf%lld",&p[i],&Smily);
sum+=Smily;
}
printf("%lld\n",sum);
for(ll i=(1<<n)-2;i>=0;i--){
double now=0;
for(ll j=1;j<=n;j++){
if(!((1<<(j-1))&i))
f[i]+=f[i|(1<<(j-1))]*p[j],now+=p[j];
}
// printf("f=%lf now=%lf\n",f[i],now);
f[i]++;
f[i]/=now;
}
// for(ll i=1;i<=(1<<n)-1;i++)
// {
// printf("%lf\n",f[i]);
// }
printf("%.3lf\n",f[0]);
}

通讯

(有向图)有环不花费,没环有花费,求使所有点连通最小花费。(保证从0节点可以到达任何节点&&图是连通的)

一眼秒错解!!!!!!!

打了个缩点+kuskal,然后自己以为能AC然后完美得到10分

题解

正解,贪心+缩点。

因为保证0可以到任何节点

每次取出当前点入边最小值,得到图依然保持连通,所以贪心正确。

代码懒得放

奇袭

题解

https://blog.csdn.net/sadnohappy/article/details/52199051

https://www.cnblogs.com/12mango/p/7465667.html

耐心看完这两篇博客相信你已经大概理解了。

以下是我自己的一些理解,

首先

$n^3$算法


无脑维护前缀和

MLE+TLE

#include<bits/stdc++.h>
#define ll long long
#define A 10100
using namespace std;
ll a[A][A];
bool b[A][A];
ll n,m,ans=0;
const int L=1<<20|1;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
inline int Read(){
register int ret;
register char r;
while(r=getchar(),r<'0'||r>'9');ret=r-48;
while(r=getchar(),r>='0'&&r<='9')ret=ret*10+r-48;
return ret;
}
void dfs(ll k)
{
if(k==n) return ;
for(ll i=1;i<=n-k+1;i++)
for(ll j=1;j<=n-k+1;j++){
if(a[i+k-1][j+k-1]+a[i-1][j-1]-a[i-1][j+k-1]-a[i+k-1][j-1]==k)
ans++/*,printf("k=%lld i=%lld j=%lld a[%lld][%lld]=%lld a[%lld][%lld]=%lld a[%lld][%lld]=%lld a[%lld][%lld]=%lld\n",k,i,j,i+k-1,j+k-1,a[i+k-1][j+k-1],i-1,j-1,a[i-1][j-1],i-1,j+k-1,a[i-1][j+k-1],i+k-1,j-1,a[i+k-1][j-1])*/;
}
dfs(k+1);
}
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
ll xx=Read(),yy=Read();
b[xx][yy]++;
}
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
{a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j];}
// cout<<a[2][4]<<endl;
dfs(2);
cout<<ans+n+1<<endl;
}

$n^2$


略微思考,发现可以把它转换为一维的,行列不重复,所以可以用一个a数组存下来值 a[i]就下标代表第一行,具体存的数就代表第j列

那么我们发现从a[i]-a[j]中a中最大值减a中最小如果为j-i那么就符合题目中所说的子矩阵

维护ST表或单调队列维护,严格$n^2$

约55--64分,看你常数大小

减减枝91

$n\times log n$


一个非常玄学做法,

建议结合代码来看,虽然我知道你不想看代码

玄学二分加桶

这还是我第一次遇到这样的题

事实上该做法是$n^2$的一个优化,思路和它类似a[i]-a[j]中a中最大值减a中最小如果为j-i那么就符合题目中所说的子矩阵。

那么我们二分一个区间时有如下情况

1,当前枚举区间最大值最小值都在mid左面

2,当前枚举区间最大值最小值都在mid右面

3,最小值在左面,最大值在右面

4,最大值在右面,最小值在左面

对于1,我们要做的是扫一遍mid以左就完了,我们max-min+i就是当前区间,要判断j是否>mid 因为即使符合<=mid的情况也会在二分时解决(因为全部在左区间),我们找的最大值最小值都在mid左面,并不一定全在左面,有部分在右面

对于2,做法同1

对于3,我们首先先找到了mid以左最小,以及最大,设mid以左最小minl,最大maxl

我们定义两个指针一个minn指针,一个maxx指针,当前指针都指向mid 因为maxx<=maxl我们要满足3最大值在右面只能往右搜。我们需要找到minn>minl最大位置(因为minn往右搜只会越来越小满足单调性),maxx>ml最小位置(maxx越搜只会越来越大满足单调性)。

找到指针指向位置我们可以断定mid--maxx之间所有方案都不符合3,mid--minn之间可能符合3。

宗上那么maxx--minn之间值可能符合3;

对于”“思路和它类似a[i]-a[j]中a中最大值减a中最小如果为j-i那么就符合题目中所说的子矩阵”“  这句话 移项

maxx-r==minn-l   我们在桶里存maxx-r 然后找到minn-l对应就完了。

对于4,做法同3

以下是本人丑陋的代码

代码

#include<bits/stdc++.h>
#define ll long long
#define A 1100000
using namespace std;
ll tong[A],lmax[A],lmin[A],rmax[A],rmin[A];
ll a[A];
ll n;
ll work(ll l,ll r,ll mid){
ll w=0;
lmax[mid]=a[mid];lmin[mid]=a[mid];
rmax[mid+1]=a[mid+1];rmin[mid+1]=a[mid+1];
for(ll i=mid-1;i>=l;i--){
lmax[i]=max(lmax[i+1],a[i]);
lmin[i]=min(lmin[i+1],a[i]);
}
for(ll i=mid+2;i<=r;i++){
rmax[i]=max(rmax[i-1],a[i]);
rmin[i]=min(rmin[i-1],a[i]);
}
for(ll i=l;i<=mid;i++){
ll j=i+lmax[i]-lmin[i];
if(j>mid&&rmax[j]<lmax[i]&&rmin[j]>lmin[i]) w++;
}
ll p1=mid+1,p2=mid;
while(p1<=r&&rmax[p1]<lmax[l]) tong[rmax[p1]-p1]--,p1++;
while(p2<r&&rmin[p2+1]>lmin[l]) p2++,tong[rmax[p2]-p2]++;
for(ll i=l;i<=mid;i++){
while(p1>mid+1&&rmax[p1-1]>lmax[i]) p1--,tong[rmax[p1]-p1]++;
while(p2>mid&&rmin[p2]<lmin[i]) tong[rmax[p2]-p2]--,p2--;
w+=max(tong[lmin[i]-i],0ll);
}
for(ll i=mid+1;i<=r;i++){
tong[rmax[i]-i]=0;
}
return w;
}
ll solve(ll l,ll r){
if(l==r) return 1;
ll mid=(l+r)>>1;
ll zz=solve(l,mid)+solve(mid+1,r);
zz+=work(l,r,mid);
reverse(a+l,a+r+1);
if((r-l+1)&1) mid--;
zz+=work(l,r,mid);
reverse(a+l,a+r+1);
return zz;
}
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
ll xx,yy;
scanf("%lld%lld",&xx,&yy);
a[xx]=yy;
}
cout<<solve(1,n);
}

NOIP模拟测试4「礼物·通讯·奇袭」的更多相关文章

  1. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  4. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  5. NOIP模拟测试20「周·任·飞」

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  6. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  7. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

  8. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  9. NOIP模拟测试21「折纸&#183;不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

随机推荐

  1. mysql搭建多主一从源复制环境

    问题描述:搭建过一主多从的环境,由于数据库数据一致性要求高,有些情景会搭建一主多从的架构,搭建多主一从的模式,相对来说适合数据整合,将多个业务的库整合到一起,方便做查询,也可以当做一个监控其他主库数据 ...

  2. Go 函数详解

    一.函数基础 函数由函数声明关键字 func.函数名.参数列表.返回列表.函数体组成 函数是一种类型.函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行 函数名 ...

  3. SprintBoot使用Validation

    1.为什么要使用Validation 在开发过程中有没有使用一堆的if来判断字段是否为空.电话号码是否正确.某个输入是否符合长度等对字段的判断.这样的代码可读性差,而且还不美观,那么使用Validat ...

  4. Django(31)模板中常用的过滤器

    模版常用过滤器 在模版中,有时候需要对一些数据进行处理以后才能使用.一般在Python中我们是通过函数的形式来完成的.而在模版中,则是通过过滤器来实现的.过滤器使用的是|来使用. add 将传进来的参 ...

  5. NPM包管理器入门(附加cnpm : 无法加载文件错误解决方案)

    NPM 包管理器 1.作用: 快速构建nodejs工程 快速安装和依赖第三个模块 2.使用方法 快速构建 npm init 会得到一package.json文件 { "name": ...

  6. 登陆框select绕过

    0x00 原理   思路来自美团杯2021,本来说出题人已经把select通过正则过滤了,就不该总是往用select进行查询那方面想-> select id from users where u ...

  7. 【转载】Linux查看PCIe版本及速率【方法】PCIE的X4X8X16 查看 数量 怎么看

    Linux查看PCIe版本及速率   PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格   查看主板上的PCI插槽 # dmidecode | grep --color "P ...

  8. kvm总结复习

    一.虚拟化概念 1.虚拟化技术:在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以 ...

  9. xpath定位中starts-with、contains、text()的用法

    starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...

  10. cka 英文考试题

    ## CKA真题解析 #### 1**Set configuration context $kubectl config use-context k8s. Monitor the logs of Po ...