这个线段树一眼秒了(主要是有前面的思考经验)

就是维护两个列对应线段上的形态。,比较好想的

但数据结构题有个特点——使你知道结构也不会做————会做也会很大概率爆零....

所以数据结构题必须 小数据+特殊数据 + 对拍!!!!不然怎么挂的都不知道、

敲+错+调+查+调     搞了一个上午

这个题用线段树维护 一个最小值  合并时需要考虑 不同形态 子图(其实是树)的合并方法

但其实只和两个端点有关:

看着丧心病狂的up就知道有多难调了(关键当时还不知道对不对,写完需要胆量)

码:

#include<iostream>
#include<cstdio>
using namespace std;
#define zuo l,mid,o<<1
#define you mid+1,r,o<<1|1
#define N 60006
int IO[N<<2],II[N<<2],lu[4][N],x,xx,y,yy,z,n,m,i,a,b,ans,cha,OI[N<<2],OO[N<<2],deng[N<<2],linOO,linOI,linIO,linII,lindeng,llinIO,llinOI,llinII,llinOO,llindeng;
bool yici;
char op;
void up(int o,int mid)
{IO[o]=II[o<<1]+lu[1][mid]+lu[2][mid]+OO[o<<1|1];             //II+OOIO[o]=min(IO[o],II[o<<1]+min(lu[1][mid],lu[2][mid])+IO[o<<1|1]);   //II+IOIO[o]=min(IO[o],II[o<<1]+min(lu[1][mid],lu[2][mid])+deng[o<<1|1]); //II+=IO[o]=min(IO[o],IO[o<<1]+lu[1][mid]+lu[2][mid]+deng[o<<1|1]);      //IO+=IO[o]=min(IO[o],IO[o<<1]+IO[o<<1|1]+lu[1][mid]+lu[2][mid]);        //IO+IOIO[o]=min(IO[o],deng[o<<1]+lu[1][mid]+lu[2][mid]+IO[o<<1|1]);      //=+IOOI[o]=OI[o<<1]+lu[1][mid]+lu[2][mid]+deng[o<<1|1];                 //OI+=OI[o]=min(OI[o],OI[o<<1]+lu[1][mid]+lu[2][mid]+OI[o<<1|1]);                   //OI+OIOI[o]=min(OI[o],OI[o<<1]+min(lu[1][mid],lu[2][mid])+II[o<<1|1]);              //OI+IIOI[o]=min(OI[o],OO[o<<1]+II[o<<1|1]+lu[1][mid]+lu[2][mid]);                   //OO+IIOI[o]=min(OI[o],deng[o<<1]+lu[1][mid]+lu[2][mid]+OI[o<<1|1]);                 //=+OIOI[o]=min(OI[o],deng[o<<1]+min(lu[1][mid],lu[2][mid])+II[o<<1|1]);           //=+IIII[o]=IO[o<<1]+II[o<<1|1]+lu[1][mid]+lu[2][mid];                   //IO+IIII[o]=min(II[o],II[o<<1]+deng[o<<1|1]+lu[1][mid]+lu[2][mid]);            //II+=II[o]=min(II[o],deng[o<<1]+II[o<<1|1]+lu[1][mid]+lu[2][mid]);            //=+IIII[o]=min(II[o],II[o<<1]+OI[o<<1|1]+lu[1][mid]+lu[2][mid]);              //II+OIII[o]=min(II[o],II[o<<1]+II[o<<1|1]+min(lu[1][mid],lu[2][mid]));          //II+IIOO[o]=deng[o<<1]+deng[o<<1|1]+min(lu[1][mid],lu[2][mid]);         //=+=OO[o]=min(OO[o],deng[o<<1]+OO[o<<1|1]+lu[1][mid]+lu[2][mid]);                //=+OOOO[o]=min(OO[o],deng[o<<1]+IO[o<<1|1]+min(lu[1][mid],lu[2][mid]));           //=+IO      OO[o]=min(OO[o],OI[o<<1]+IO[o<<1|1]+min(lu[1][mid],lu[2][mid]));             //OI+IOOO[o]=min(OO[o],OI[o<<1]+OO[o<<1|1]+lu[1][mid]+lu[2][mid]);                  //OI+OOOO[o]=min(OO[o],OI[o<<1]+deng[o<<1|1]+min(lu[1][mid],lu[2][mid]));           //OI+= OO[o]=min(OO[o],OO[o<<1]+deng[o<<1|1]+lu[1][mid]+lu[2][mid]);                //OO+=   OO[o]=min(OO[o],OO[o<<1]+IO[o<<1|1]+lu[1][mid]+lu[2][mid]);                  //OO+IO deng[o]=deng[o<<1]+deng[o<<1|1]+lu[1][mid]+lu[2][mid];                 //=+=}
void jian(int l,int r,int o)
{
int mid=(l+r)>>1;
if(l==r)
{
II[o]=lu[3][l];IO[o]=OI[o]=1e9+7;deng[o]=0;
return;
}
jian(zuo);
jian(you);
up(o,mid);
}
void wen(int l,int r,int o)
{if(a<=l&&r<=b){if(yici){linOI=OI[o];linIO=IO[o];linOO=OO[o];lindeng=deng[o];linII=II[o];yici=0;  }else{llinIO=linII+lu[1][l-1]+lu[2][l-1]+OO[o];             //II+OOllinIO=min(llinIO,linII+min(lu[1][l-1],lu[2][l-1])+IO[o]);   //II+IOllinIO=min(llinIO,linII+min(lu[1][l-1],lu[2][l-1])+deng[o]); //II+=llinIO=min(llinIO,linIO+lu[1][l-1]+lu[2][l-1]+deng[o]);      //IO+=llinIO=min(llinIO,linIO+IO[o]+lu[1][l-1]+lu[2][l-1]);        //IO+IOllinIO=min(llinIO,lindeng+lu[1][l-1]+lu[2][l-1]+IO[o]);      //=+IOllinOI=linOI+lu[1][l-1]+lu[2][l-1]+deng[o];                 //OI+=llinOI=min(llinOI,linOI+lu[1][l-1]+lu[2][l-1]+OI[o]);                   //OI+OIllinOI=min(llinOI,linOI+min(lu[1][l-1],lu[2][l-1])+II[o]);              //OI+IIllinOI=min(llinOI,linOO+II[o]+lu[1][l-1]+lu[2][l-1]);                   //OO+IIllinOI=min(llinOI,lindeng+lu[1][l-1]+lu[2][l-1]+OI[o]);                 //=+OIllinOI=min(llinOI,lindeng+min(lu[1][l-1],lu[2][l-1])+II[o]);           //=+IIllinII=linIO+II[o]+lu[1][l-1]+lu[2][l-1];                   //IO+IIllinII=min(llinII,linII+deng[o]+lu[1][l-1]+lu[2][l-1]);            //II+=llinII=min(llinII,lindeng+II[o]+lu[1][l-1]+lu[2][l-1]);            //=+IIllinII=min(llinII,linII+OI[o]+lu[1][l-1]+lu[2][l-1]);              //II+OIllinII=min(llinII,linII+II[o]+min(lu[1][l-1],lu[2][l-1]));          //II+IIllinOO=lindeng+deng[o]+min(lu[1][l-1],lu[2][l-1]);         //=+=llinOO=min(llinOO,lindeng+OO[o]+lu[1][l-1]+lu[2][l-1]);                //=+OOllinOO=min(llinOO,lindeng+IO[o]+min(lu[1][l-1],lu[2][l-1]));           //=+IO      llinOO=min(llinOO,linOI+IO[o]+min(lu[1][l-1],lu[2][l-1]));             //OI+IOllinOO=min(llinOO,linOI+OO[o]+lu[1][l-1]+lu[2][l-1]);                  //OI+OOllinOO=min(llinOO,linOI+deng[o]+min(lu[1][l-1],lu[2][l-1]));           //OI+= llinOO=min(llinOO,linOO+deng[o]+lu[1][l-1]+lu[2][l-1]);                //OO+=   llinOO=min(llinOO,linOO+IO[o]+lu[1][l-1]+lu[2][l-1]);                  //OO+IO llindeng=lindeng+deng[o]+lu[1][l-1]+lu[2][l-1];
linOO=llinOO;
linII=llinII;
linOI=llinOI;
linIO=llinIO;
lindeng=llindeng;}return   ;}int mid=(l+r)>>1;if(a<=mid)wen(zuo);if(b>mid)wen(you);
}
void gai(int l,int r,int o)
{int mid=(l+r)>>1;if(l==r){II[o]=lu[3][l];IO[o]=OI[o]=1e9+7;deng[o]=0;return;}if(a<=mid)gai(zuo);else gai(you);up(o,mid);
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<n;i++)scanf("%d",&lu[1][i]);
for(i=1;i<n;i++)scanf("%d",&lu[2][i]);
for(i=1;i<=n;i++)scanf("%d",&lu[3][i]);
jian(1,n,1);
for(i=1;i<=m;i++)
{scanf("%c",&op);while(op!='Q'&&op!='C')scanf("%c",&op);if(op=='Q'){scanf("%d%d",&a,&b);yici=1;wen(1,n,1);printf("%d\n",linII);  }else{scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&z);if(yy<y)swap(y,yy);if(x==xx&&x==1)lu[1][y]=z;if(x==xx&&x==2)lu[2][y]=z;if(x!=xx)lu[3][y]=z; a=y;gai(1,n,1);    }
}
} 

2017.5.11 道路修建 思考记录相关推荐

  1. 2017.4.27 道路游戏 思考记录

    这个题一开始把题读错了..而且读错三次(出这种语文题 简直毒瘤) 一开始认为成了可以一边买一边跑...结果发现是n^4 然后认为成了可以不移动结束就可以买....结果发现是n^3  于是全wa 然后认 ...

  2. 2017.3.24 分裂游戏 思考记录

    事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了..    感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...

  3. 2017.9.21 道路修建(noi2011) 思考记录

    这个题,,dfs即可 但听说dfs会爆栈,还会被卡. 所以就写了一个拓扑. noi2011很良心啊 码(不知为何,非常的慢): #include<cstdio> #include<c ...

  4. 解码2017双11:全球狂欢新记录背后的阿里云存储

    摘要: 2017天猫双11再次刷新纪录,这背后是大数据的支撑和阿里云计算的能力的体现.手淘.天猫APP主站的所有图片和视频都存储在阿里云对象存储OSS之上,全球数以亿计的消费者,对这些商品的访问的流量 ...

  5. 2017.10.24 上升序列 思考记录

    终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...

  6. 2017.10.7 括号序列 思考记录

    这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...

  7. 2017.9.28 约数研究 思考记录

    这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...

  8. 2017.7.27 排列perm 思考记录

    这个题可以通过技巧找思路的. 首先,字符串小于10,那么这肯定是用来状压的. 用来存数肯定不行,能用0.1表示的可以是使用情况 还要满足倍数,所以我们可以存余数 那么就好做了,直接递推dp 还要注意如 ...

  9. 2017.5.9 积木大赛 思考记录

    为什么要把这个题放上来?因为这个题还是很有代表性的 首先必须要跳出模拟的思考: 可以忽视每一步具体的操作,直接看目标,这样就会总结出一些规律: 连续上升或连续下降的序列次数一定是最大值,因为每次都可以 ...

最新文章

  1. python写一个通讯录step by step V3.0
  2. 用计算机进行图片处理教学设计,三年级信息技术上教学设计
  3. SDH点对点接入与MPLS有什么区别?——Vecloud
  4. oracle including new values,物化视图日志加不加INCLUDING NEW VALUES有什么影响
  5. 一个还不错的源码解析网站
  6. 优秀!22岁读博士,26岁当教授,因为太优秀反而没人敢追?
  7. 浏览器中跨域创建cookie的问题
  8. 中国程序员和外国程序员
  9. Spring MVC 3.0 RESTful controller
  10. MySQL官方提供的日志分析工具_MySQL 日志分析的几款工具-Fun言
  11. 「实用」打造自我感觉非常漂亮的Mac终端
  12. Windows10数据线连接坚果手机SmartisanTNT
  13. 程序员自我修养阅读笔记——动态链接
  14. SpringMVC+Vue实现前后端的志愿者招募网站
  15. 中小学数学卷子自动生成程序-----队友项目评价
  16. Codeforces Round 783 补题
  17. 北大陈向群第十二章知识点
  18. 一天2起电动汽车起火事件:特斯拉之后,蔚来又烧了
  19. 实现掘金导航栏+float按钮其实可以很简单
  20. 2018年4月高等教育国际金融全国统一命题考试

热门文章

  1. php mysql 到表最后_如何在PHP中获取MySQL表的最后插入ID?
  2. ZooKeeper的安装和API
  3. LeetCode-118杨辉三角C++详解
  4. 下载OneDrive共享的数据集
  5. new Date(date).getTime()的兼容问题
  6. c fun函数求n个整数的平均值_c语言题目(求阶乘)
  7. Java中的变量Variable
  8. 单片机c语言字符,单片机C语言中变量的定义方法解析
  9. 无线打印机 连接路由器连接到服务器,怎么通过无线路由器连到有的打印机线网络...
  10. mysql innodb_file_per_table=1_mysql-5.7 innodb_file_per_table 详解