今天的考试题改自闭了……所以滚来写陈年题解。

A.*****贪婪*****

RT,出题人告诉我们这题要贪心。

最优的策略一定是拖到必须断的时候再断开(虽然并不知道为什么)。

如果一段序列满足题目中的性质,那么一定有$gcd(a_i-a_{i-1},a_{i+1}-a_i,...)$不为1且$a_i,a_{i+1},...$各不相同。所以维护每段的相邻两项差值的gcd,遇到不符合或者重复的元素就ans++。set写起来比较方便。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<cmath>
using namespace std;
const int N=;
int n,a[N],ans=;
set<int> b;
int gcd(int x,int y)
{
if(!y)return x;
return gcd(y,x%y);
}
int now;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
b.insert(a[]);
for(int i=;i<=n;i++)
{
now=gcd(now,abs(a[i]-a[i-]));
if(now==||b.count(a[i]))
{
ans++;
now=;
b.clear();b.insert(a[i]);
}
else b.insert(a[i]);
}
cout<<ans<<endl;
return ;
}

B.**见证*******

RT,出题人让我们见证$n^2$过500000。

没有打std中的离线dfs序解法,直接用有向边代表包含关系,每次询问暴力dfs统计答案即可。注意K=1要特判建双向边。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int n,m,cnt;
const int N=;//change it!
int head[N],nxt[N],to[N],tot,vis[N];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
bool dfs(int x,int f,int aim)
{
if(x==aim)return ; for(int i=head[x];i;i=nxt[i])
{
if(to[i]!=f)
if(dfs(to[i],x,aim))return ;
}
return ;
}
int main()
{
n=read();m=read();cnt=n;
while(m--)
{
int opt=read();
if(!opt)
{
int op=read(),K=read(),now=++cnt;
if(K==)
{
int tmp=read();
add(now,tmp);add(tmp,now);
}
else if(op==)
{
for(int i=;i<=K;i++)
add(now,read());
}
else if(op==)
{
for(int i=;i<=K;i++)
add(read(),now);
}
}
else if(opt==)
{
int x=read(),y=read(); printf("%d\n",dfs(x,,y));
}
}
return ;
}

C.**堆积******

RT,出题人告诉我们要用到堆。

暴力dp的方程可以一眼切掉:$dp[i]=\min \limits _{j=max(0,i-K)}^{i-1} dp[j]+max(sum[i]-sum[j],b[j])$

对于所有j,$dp[j]+b[j]$和$dp[j]-sum[j]$都是定值

所以用两个堆,分别维护二者。要求的$dp[i]=min(heap1.top,heap2.top+sum[i])$

首先检查第一个栈,如果取出的j比i-K小,pop掉继续取。如果取出的比$dp[j]-sum[j]+sum[i]$小,把它加进第二个堆里,pop掉。

就这样取到合法的为止,第二个堆也是一样。

时间复杂度$O(nlogn)$

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
#define pa pair<ll,int>
int n,K;
const int N=;
int a[N],b[N];
ll sum[N],dp[N];
priority_queue<pa,vector<pa>,greater<pa> >q1,q2;
int main()
{
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),sum[i]=sum[i-]+1LL*a[i];
for(int i=;i<n;i++)
scanf("%d",&b[i]);
memset(dp,0x3f,sizeof(dp));
dp[]=;
q1.push(make_pair(dp[]+1LL*b[],));
for(int i=;i<=n;i++)
{
ll val1=0x7ffffffffff,val2=0x7ffffffffff;
while(!q1.empty())
{
ll val=q1.top().first;int id=q1.top().second;
if(id<i-K)
{
q1.pop();continue;
}
if(val<dp[id]-sum[id]+sum[i])
{
q2.push(make_pair(dp[id]-sum[id],id));q1.pop();
continue;
}
val1=min(val1,val);
break; } while(!q2.empty())
{
ll val=q2.top().first;
int id=q2.top().second;
if(id<i-K)
{
q2.pop();continue;
}
val2=min(val2,val);
break; }
dp[i]=min(val1,val2+sum[i]);
//cout<<i<<' '<<dp[i]<<endl;
q1.push(make_pair(dp[i]+b[i],i));
}
cout<<dp[n]<<endl;
return ;
}

[NOIP模拟26]题解的更多相关文章

  1. HZOJ 20190819 NOIP模拟26题解

    考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...

  2. noip模拟26[肾炎黄·酱累黄·换莫黄]

    \(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...

  3. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  4. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  5. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  6. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  7. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  8. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  9. NOIP模拟26

    把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...

随机推荐

  1. vue中的文件上传和下载

    文件上传 vue中的文件上传主要分为两步:前台获取到文件和提交到后台 获取文件 前台获取文件,主要是采用input框来实现 <el-dialog :title="addName&quo ...

  2. Qt/Qte/Qtopia三者的区别

    Qt泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux),Qt Windows, Qt Mac 等,但这只是相对于二进制来说的.Qt作为一个跨平台的GUI 框 ...

  3. GH001 on github

    remote: warning: GH001: Large files detected. You may want to try Git Large File Storage - https://g ...

  4. 高并发之CAS机制和ABA问题

    什么是CAS机制 CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换 CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B. 看如下几个例子: pac ...

  5. 《单词的减法》state1~state17(第三遍学习记录)

    2016.05.24 state 8 curse/curve dedication 多用于奉献和献身 disastrous disruptive distract state 9 domestic/d ...

  6. Python中的内置函数和匿名函数

    1. 内置函数 print用法 def print(self, *args, sep=' ', end='\n', file=None): # known special case of print ...

  7. SSL certificate problem: self signed certificate

    执行Git命令时出现各种 SSL certificate problem 的解决办法 2014年10月11日 10:45:40   比如我在windows下用git clone gitURL 就提示  ...

  8. PyQt5实战1-搭建conda环境

    一.安装Anaconda 下载地址:https://repo.anaconda.com/archive/Anaconda3-2019.03-Windows-x86_64.exe 软件版本:Anacon ...

  9. String类可以被继承吗?我们来聊聊final关键字!

    String类可以被继承吗?我们来聊聊final关键字! String在java基础知识中绝对是个重点知识,关于String的一些问题也是非常的多,而且牵涉到内存等高级知识,在面试中也是经常被考察的一 ...

  10. Nhibernet Get方法获取数据后,修改字段,未保存,但是数据库的数据却同步了

    首先,对象是在session中取得的,所以这个对象已经和数据库同步了,或者说相关联了如果你的session中的对象发生变法,提交事务后,数据库中的数据也会更新未保存更改,不要以为session就不会在 ...