[NOIP模拟26]题解
今天的考试题改自闭了……所以滚来写陈年题解。
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]题解的更多相关文章
- HZOJ 20190819 NOIP模拟26题解
考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...
- noip模拟26[肾炎黄·酱累黄·换莫黄]
\(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- HZOJ 20190818 NOIP模拟24题解
T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- NOIP模拟26
把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...
随机推荐
- AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]
地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...
- [CSP-S模拟测试]:画作(BFS+数学)
题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...
- php开发面试题---禁用cookie之后,如何使用session
php开发面试题---禁用cookie之后,如何使用session 一.总结 一句话总结: 在每个url后面自动加上PHPSESSID的值即可,用户禁止cookie后,服务器仍会将sessionId以 ...
- slideshare原本是一个专业的幻灯片存储与展示的网站
slideshare就是其中一个.slideshare原本是一个专业的幻灯片存储与展示的网站,它支持扩展名为ppt.pps和odp三种格式的幻灯片,用户上传成功以后slideshare会提供给用户一个 ...
- linux 组合命令
统计home目录下面有多少文件 ls -l /home|grep '^-'|wc -l
- java构造器内部多态方法
public class TestC { public static void main(String []args) { new Graph(5); }}class Grp{ void draw() ...
- Centos7从零开始】Centos 下硬盘分区的最佳方案
https://www.cnblogs.com/chen1970/p/11071590.html 在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题: 第一点也 ...
- [题解]Print a 1337-string...-数学(codeforces 1202D)
题目链接:https://codeforces.com/problemset/problem/1202/D 题意: 构造一串只由 ‘1’,‘3’,‘7’ 组成的字符串,使其 ‘1337’ 子序列数量为 ...
- Asp.net core 使用log4net作为日志组件,记录日志到本地。
原文:Asp.net core 使用log4net作为日志组件,记录日志到本地. GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.D ...
- Java面试宝典(6)混合(前端 + 数据库)
包括html & JavaScript & Ajax部分/Java web部分/数据库部分 三. html&JavaScript&ajax部分 1. 判断第二个日期比第 ...