礼物、

首先见到期望一定要想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. 基于linux信号的timeout装饰器

    在做基于ray的分布式任务处理时,偶尔遇到由于ray集群不稳定导致的长时间连接不上,进而导致程序卡死,无法向后端返回任务状态的情况.但是ray的初始化函数本身未实现超时机制,因此设计基于多线程+信号的 ...

  2. 第一章 FreeBSD之系统安装

    一.默认选择 >>[Boot Multi User],按回车键 二.默认选择 >> [Install] 三.选择默认的键盘设置 >>[Select] 四.配置主机名 ...

  3. 并发容器-CopyOnWriteSet

    CopyOnWriteSet 该容器与CopyOnWriteArrayList相似,也是读取时不加锁,任意线程可以读.写入时加锁创建一个新的容器,然后写入新元素. 内部用CopyOnWriteArra ...

  4. Smss.exe加载win32k.sys过程总结

    windows操作系统初始化 windows操作系统再初始化的过程中,当内核完全初始化而且各个组件也已经准备好后会加载一个个用户进程smss.exe(会话管理器),此进程会接着调用NtSetSyste ...

  5. 普里姆算法(Prim)

    概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...

  6. 强哥ThinkPHP学习笔记

    TP框架:1.模板引擎2.MVC设计模式3.常用操作类 模板引擎和框架区别1.模板引擎只是框架中用来做php和html分离 MVC设计模式M model 数据模型V view 视图C control ...

  7. TrueCrypt与CryptSetup双系统全盘加密(图文)

    http://blog.topsec.com.cn/truecrypt%E4%B8%8Ecryptsetup%E5%8F%8C%E7%B3%BB%E7%BB%9F%E5%85%A8%E7%9B%98% ...

  8. k8s健康检查(9)

    一.默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readines ...

  9. 9.10 nohup:用户退出系统进程继续工作

    nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端.        无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out文件 ...

  10. githubssh配置