考试过程:

照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连样例都手模不出来,完了凉了,然后又看了一个半小时的题,还是没看懂心态爆炸,然后匆匆打了T1T3暴力,还自我感觉良好,觉得这么难的题,拿个150pts左右应该rank10没啥问题叭,然后出分,T1T2A了一片,然后我还暴力挂分,然后在第二机房成功倒数。

反思:

还是思考的太少啊,对题目的难度评估出现很大偏差,考试时还有时走思,这布星啊,这状态真tm差

题解:

T1 嚎叫响彻在贪婪的厂房:

其实很简单,用STL可以过掉(map或set都行,主要作用还是判重),比较显然的贪心,就是能不断就不断,感性理解一下即可,证明也挺简单的叭我就不证了我才不会说是我不会证呢考场上想到这个了,但是还是sb的打了dp,真zz啊,改了STL就能过啊。STL这些东西还是要学的啊很好用的啊

 #include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
map<int,int> mp;
int a[N];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
int ans=;int l=;
while(l<=n){
int r=l+;
int k=abs(a[r]-a[l]);
mp[a[l]]=;
while((r<=n)&&(gcd(abs(a[r]-a[l]),k)!=)&&(mp.count(a[r])==)){
mp[a[r]]=;
r++;
k=gcd(abs(a[r]-a[l]),k);
}
r--;l=r+;ans++;mp.clear();
}
printf("%d",ans);
}

T1

T2 主仆见证了 Hobo 的离别:

考试时根本没看懂题,浪费一个半小时,然后就成功爆零滚粗,思博出题人语文比我还差啊艹

实际上这题只要,建边跑个dfs序,然后判一下k==1建双向边即可。实际上因为数据水直接在线dfs理论复杂度$O(n^2)$就可以水过于是旁边zkt大佬就hack别人AC代码hack了一下午233

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int first[N],nex[N<<],to[N<<],tot,fr[N];
int fa[N];
int judge;
void add(int a,int b){
to[++tot]=b,nex[tot]=first[a],first[a]=tot;fr[tot]=a;
}
void dfs(int x,int fa,const int tar){//cout<<x<<" "<<endl;
if(x==tar) {judge=;return ;}
for(int i=first[x];i;i=nex[i]){
int y=to[i];
if(y==fa) continue; dfs(y,x,tar);
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int qsum=;
for(int i=;i<=m;++i){
int opt;
scanf("%d",&opt);
if(opt==){
int op,kk;n++;
scanf("%d%d",&op,&kk);
for(int j=;j<=kk;++j){//cout<<id<<endl;
int x;
scanf("%d",&x);
if(kk==){
fa[n]=x,fa[x]=n;
add(n,x);add(x,n);
break;
}
if(op) {add(x,n);fa[x]=n;}
else {add(n,x);fa[n]=x;}
}
}
else{
judge=;
int a,b;
scanf("%d%d",&a,&b);
dfs(a,,b);//cout<<"M"<<endl;
printf("%d\n",judge);
}
}
}

T2

T3 征途堆积出友情的永恒:

其实是比较有难度的题,但是50pts暴力和30pts骗分很好打,我明明打对了骗分还是没分啊艹

正解是堆优化dp,首先考虑暴力转移式子$f[i]=min(f[j]+max(sum[i]-sum[j],b[j]))$

我们注意到对于固定的$j$,$f[j]-sum[j]$和$f[j]+b[j]$是固定不变的,所以考虑从这两个量入手,因为我们每次只要最小的,所以用两个堆分别维护一下就好了,具体实现方法是,首先要把两个堆中不满足距离小于k的点pop掉,然后把第一个堆中小于第二个堆顶$+sum[i]$ 的点pop掉并加入第二个堆中,直到符合条件为止,再把不满足距离小于k的点pop掉,最后在更新f数组即可

感觉优化dp的题做起来还是很无力啊

看博客看到的whs dalao的dp优化总结还是挺好的,就放过来了

总结:

1.对于这种dp优化,若dp式子中出现变量很少而定量很多,就要考虑到维护定量;

2.而对于dp式子中有max(),min()之类的,说明主动决策决定被动决策;所以考虑维护两个决策中较容易维护的一方;然后让另一方成为被动;若遇到维护的值不再偏向于己方;

那就把这种状态pop掉,转换成另一方;让这种状态继续合法;对答案做贡献;

3.注意2中max的决策单调性;例如这个题中max有单调性,就可以无后效性的转化;

原文

 #include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=;
const int INF=1e9+;
int a[N],b[N],sum[N],dp[N],n,k;
int f[N];
struct node{
int id,val;
bool operator < (const node a) const{
return val>a.val;
}
};
priority_queue<node>q1,q2;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void work_2(){
memset(f,0x3f,sizeof(f));f[]=;
//q1.push(dp[1]);q2.push(dp[1]+b[1]);
//q1.push((node){0,0}),q2.push((node){0,0});
//q1.push((node){0,INF}),q2.push((node){0,INF});
for(int i=;i<=n;++i){
q1.push((node){i-,f[i-]+b[i-]});
//q2.push((node){i-1,f[i-1]-sum[i-1]});
while(q1.size()){
int x=q1.top().id;
if(x>=i-k) break;
q1.pop();
}//cout<<"L"<<endl;
while(q2.size()){
int h=q2.top().id;
if(h>=i-k) break;
q2.pop();
}
while(q1.size()){
int y=q1.top().val;
int x=q1.top().id;
if(y>f[x]-sum[x]+sum[i]) break;
q1.pop();
q2.push((node){x,f[x]-sum[x]});
}//cout<<"M"<<endl;
while(q1.size()){
int x=q1.top().id;
if(x>=i-k) break;
q1.pop();
}//cout<<"K"<<endl;
while(q2.size()){
int h=q2.top().id;
if(h>=i-k) break;
q2.pop();
}
if(q1.size()) f[i]=min(f[i],q1.top().val);
if(q2.size()) f[i]=min(q2.top().val+sum[i],f[i]);
//f[i]=min(q1.top().val,q2.top().val+sum[i]);
//cout<<f[i]<<endl;
}
cout<<f[n]<<endl;
}
signed main(){
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;++i) {scanf("%lld",&a[i]);sum[i]=sum[i-]+a[i];}
for(int i=;i<n;++i) {scanf("%lld",&b[i]);}
work_2();
}

T3

HZOJ 20190819 NOIP模拟26题解的更多相关文章

  1. HZOJ 20190818 NOIP模拟24题解

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

  2. [NOIP模拟26]题解

    今天的考试题改自闭了……所以滚来写陈年题解. A.*****贪婪***** RT,出题人告诉我们这题要贪心. 最优的策略一定是拖到必须断的时候再断开(虽然并不知道为什么). 如果一段序列满足题目中的性 ...

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

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

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

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

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

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

  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. 连续取数字DP使值最大HDU2697

    题意: 有n个数,每个数都有价钱,连续的取可以获得len*len的利益,使利益最大. 思路: 三维DP,1.2.3维分别是第i个,剩余多少钱,从后往前连续的有几个. #define IOS ios_b ...

  2. PHP学习之PHP编码习惯

    命名的注意事项: 命名要有实际含义 命名风格保持一致 不用拼音命名 不用语言关键字 适当的使用注释 好的代码应该是自描述的 难以理解的地方加上注释 函数的功能加上注释说明 类的功能和使用方法加注释 多 ...

  3. Linux(CentOS7)系统中部署Django web框架

    1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...

  4. MySQL SELECT语法(二)SELECT...INTO语法

    源自MySQL 5.7 官方手册 SELECT...INTO Syntax 一.SELECT...INTO介绍 SELECT...INTO用来将查询结果存储在变量或者写入文件中. SELECT ... ...

  5. MySQL 聚合函数(四)检测功能依赖

    源自MySQL 5.7 官方手册:12.20.4 Detection of Functional Dependence 本节提供了MySQL检测功能依赖的方式的几个示例.这些示例使用此表示法: {X} ...

  6. Spring Boot(一) 初步理解Spring Boot

    一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...

  7. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  8. TCP面向字节流和UDP面向报文的区别

    TCP面向字节流 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子.矿泉水瓶.锅碗瓢盆)接水. 上面的例子中,往水 ...

  9. iOS UIControl 事件的说明(转)

    在控件事件中,简单解释下下面几个事件. 说明:由于是在“iOS 模拟器”中测试的,所以不能用手指,只能用鼠标. 1)UIControlEventTouchDown 指鼠标左键按下(注:只是“按下”)的 ...

  10. JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...