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

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. 使用SSH 工具 Xshell 6连接CentOS 7.4

    在使用Xshell 6连接 服务CentOS 7.4之前,首先你要配置好服务器,如果没有配置好服务器的,请访问: (一)小白教小白配置 服务器 好了,开始正文! 首先准备,SSH 工具 Xshell ...

  2. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  3. 至强E3-1200 系列部分参数

    1155 Xeon E3-1275V2(E1) Ivy Bridge 3.5GHz BLK 100MHz 8MB 77W All 1155* Xeon E3-1270V2(E1) Ivy Bridge ...

  4. JS删除对象属性

    项目中有些属性使用之后需要重置 var user = {}; user.name = "123"; user.age="30"; console.log(use ...

  5. appium常见问题04_查看andriod内置浏览器webview版本

    方法一:手机上设置中查看 设置-->应用程序管理-->全部-->Android System WebView 方法二:adb指令查看(前提,已安装android sdk环境) 1,w ...

  6. Spring Cloud的简单介绍

    参考地址: https://mp.weixin.qq.com/s/wG4CTLORnvemkjUsZ7YP6Q 从一个例子开始 对于这样的"大"问题,通常需要拆解成小问题来回答.要 ...

  7. fiddler接口知识

    1. 访问接口时经常会出现乱码的情况,需要fiddler解码操作 2.域名过滤

  8. go语言统计字符个数

    具体代码如下: package main import "fmt" func main() { m := make(map[rune]int, 1) var input strin ...

  9. 这么简单的 Redis 面试题都不懂,怎么拿offer?

    来源:mp.weixin.qq.com/s/daBkliC8dAT_zYyoLiS7WA 随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点.而缓存的使用成为一个重点.redis 作为缓 ...

  10. [fw]GDT是在分段中為了相容real mode 跟 protected mode的產物

    在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型: 在R ...