考试过程:

照例开题,然后觉得三道题都挺难,比昨天难多了(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. PHP和js判断访问设备是否是微信浏览器实例

    PHP和js判断访问设备是否是微信浏览器实例,代码非常精简,适合新手学习. js判断是否是微信浏览器: 1 function is_weixin() { 2 var ua = window.navig ...

  2. python并发编程之多进程(实践篇)

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了multiproce ...

  3. Codeforces 1097F. Alex and a TV Show

    传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...

  4. html中script标签使用async属性和defer属性的区别

    相同点: 首先async和defer只对header里的外连脚本script标签上起作用,如果script标签是放在header外或者是header里的内置脚本以及动态生成的script标签是不起作用 ...

  5. OpenCV安装和测试

    参考链接:http://blog.csdn.net/bruce_zeng/article/details/7961153 OpenCv下载链接:http://sourceforge.net/proje ...

  6. 【原创】大叔经验分享(78)hive查询报错NoViableAltException

    Hive或spark中执行sql字符常量包含;时会报错,比如 select instr('abc;abc', ';'); 报错 NoViableAltException(-1@[147:1: sele ...

  7. 编写Dockerfile自定义镜像

    要求 编写一个Dockerfile自定义centos镜像,要求在容器内部可以使用vim和ifconfig命令,并且登入落脚点为/usr/local 编写Dockerfile FROM centos M ...

  8. Spark机器学习API之特征处理(二)

    Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...

  9. vue生命周期详细过程

  10. 一个简单的例子学会github repository的webhook

    github的webhook是个有用的功能,允许开发人员指定一个服务器的url.当开发者对github仓库施加操作,比如提交代码,创建issue时,github网站会自动向该url指定的服务器推送事件 ...