来自FallDream的博客,未经允许,请勿转载,谢谢。

---------------------------------------------------

ditoly这次打好了虐爆我们的主意,掏出三道丧题,囊括三种赛制,第一道丧病oi题,第二道sb交互题,第三道奇怪提答............

第二道交互题没人做,也挺奇怪的,不讲了;

第三道是找规律,也就50个数列把,我拿出我最强的找规律水平,用上插值啊快速幂啊矩阵乘法啊肉眼观察法啊乱差分啊等等办法,骗到了48分,貌似全场最高了..得分靠随缘,也不讲了。

讲讲第一题,给定一个数列,需要支持100种操作。    $n,m\leqslant 100000$

1:查询一段区间,你每次可以任选其中一段区间+1或者-1,求把它变成全是0的最小次数。

10:区间加一个值。  11:区间翻转   100:回到k次操作之前的状态。

看到这题,很明显可以可持久化平衡树,但我姿势不够,不会,而且丧病出题人卡空间。还好脑补了一种乱建边的方法,从一个状态向它能转移到的状态连边,然后dfs,离开时撤销,类似线段树分治。

然后维护一棵平衡树,修改操作容易维护,查询操作的答案是这个区间差分的绝对值之和加上左右端点的绝对值之和除以2.  我把查询做成了只能-1,爆0了qaq

#include<iostream>
#include<cstdio>
#define MN 100000
#define ll long long
using namespace std;
inline int read()
{int x = 0 , f = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;
}int s[MN+5],n,m,cnt=0;
struct ques{int kind,l,r,x;ll ans;}q[MN+5];
struct edge{int to,next;}e[MN+5];
int fa[MN+5],c[MN+5][2],rt,head[MN+5],size[MN+5];
ll num[MN+5],ad[MN+5],nl[MN+5],nr[MN+5],sum[MN+5];
bool rev[MN+5];template<typename t> t abs(t x){return x<0?-x:x;}
inline void ins(int f,int t){e[++cnt]=(edge){t,head[f]};head[f]=cnt;}void update(int x)
{int l=c[x][0],r=c[x][1];nl[x]=(l?nl[l]:num[x]);nr[x]=(r?nr[r]:num[x]);size[x]=size[l]+size[r]+1;sum[x]=0;if(l) sum[x]+=sum[l]+abs(num[x]-nr[l]);if(r) sum[x]+=sum[r]+abs(num[x]-nl[r]);
}inline void mark(int x,int z)
{nl[x]+=z;nr[x]+=z;num[x]+=z;ad[x]+=z;
}void pushdown(int x)
{int l=c[x][0],r=c[x][1];if(rev[x]) {rev[l]^=1;rev[r]^=1;rev[x]^=1;swap(c[l][0],c[l][1]);swap(c[r][0],c[r][1]);swap(nl[l],nr[l]);swap(nl[r],nr[r]);}if(ad[x]){mark(l,ad[x]);mark(r,ad[x]);ad[x]=0;}
}void build(int&x,int l,int r,int last)
{if(l>r) return;x=l+r>>1;fa[x]=last;num[x]=s[x];if(l==r) {size[x]=1;nl[x]=nr[x]=s[x];sum[x]=0;return;}build(c[x][0],l,x-1,x);build(c[x][1],x+1,r,x);update(x);
}void rotate(int x,int&k)
{int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1;if(y==k) k=x; else c[z][c[z][1]==y]=x;fa[x]=z;fa[y]=x;fa[c[x][r]]=y;c[y][l]=c[x][r];c[x][r]=y;update(y);update(x);
}void splay(int x,int&k)
{while(x!=k){int y=fa[x],z=fa[y];if(y!=k){if(c[z][1]==y^c[y][1]==x) rotate(x,k);else rotate(y,k);    } rotate(x,k);}
}int find(int x,int rk)
{pushdown(x);int sz=size[c[x][0]]+1;if(sz==rk) return x;else if(sz<rk) return find(c[x][1],rk-sz);else return find(c[x][0],rk);
}int split(int l,int r)
{splay(find(rt,l),rt);splay(find(rt,r),c[rt][1]);return c[c[rt][1]][0];
}void solve(int x)
{if(q[x].kind==1) {ll y=sum[split(q[x].l,q[x].r+2)];q[x].ans=(1LL*abs(num[find(rt,q[x].l+1)])+abs(num[find(rt,q[x].r+1)])+y)/2;}if(q[x].kind==10){int y=split(q[x].l,q[x].r+2);mark(y,q[x].x); update(c[rt][1]);update(rt);}if(q[x].kind==11) {int y=split(q[x].l,q[x].r+2);rev[y]^=1;swap(c[y][0],c[y][1]);swap(nl[y],nr[y]);update(c[rt][1]);update(rt);}for(int i=head[x];i;i=e[i].next)solve(e[i].to);if(q[x].kind==10){int y=split(q[x].l,q[x].r+2);mark(y,-q[x].x); update(c[rt][1]);update(rt);}if(q[x].kind==11){int y=split(q[x].l,q[x].r+2);rev[y]^=1;swap(c[y][0],c[y][1]);swap(nl[y],nr[y]);update(c[rt][1]);update(rt);}
}int main()
{n=read();m=read();for(int i=1;i<=n;i++)s[i+1]=read();for(int i=1;i<=m;i++){q[i].kind=read();if(q[i].kind==1) q[i].l=read(),q[i].r=read();if(q[i].kind==10) q[i].l=read(),q[i].r=read(),q[i].x=read();if(q[i].kind==11) q[i].l=read(),q[i].r=read();if(q[i].kind==100) q[i].x=read(),ins(i-q[i].x-1,i);else ins(i-1,i);}cnt=0;build(rt,1,n+2,0);solve(0);for(int i=1;i<=m;i++)if(q[i].kind==1)printf("%lld\n",q[i].ans);return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/xunlian330.html

[3.30校内训练赛]相关推荐

  1. 校内训练赛题解第三篇

    校内训练赛题解 人气估值 解题思路 脑力训练计划 (模拟 + 字符串) 解题思路 大暑赛期(贪心 + 思维) 人气估值 题目描述 你是某动画制作公司的企划部长.如今动画制作公司制作的东西,已经不仅仅局 ...

  2. [4.14校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...

  3. [4.6校内训练赛]

    来自FallDream的博客,未经允许,请勿转载,谢谢. A.[cf577b]Modulo Sum 给定n个数,问是否有一个子序列相加的和取余m为0  n<=10^6,m<=1000 题解 ...

  4. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  5. ACM训练赛--递推专题

    1001: Buy the Ticket Problem Description The "Harry Potter and the Goblet of Fire" will be ...

  6. 数据挖掘竞赛-美国King County房价预测训练赛

    美国King County房价预测训练赛 简介 DC上的一个回归题(正经的回归题). 比较简单. 时间原因(暂时没什么时间看国内旧赛),看了一下网上的解答,改善了一下神经网络就提交了. 过程 数据获取 ...

  7. 训练不出结果_训练赛惨败SKT?FPX直播透露拿冠军原因!Karsa再谈离开RNG?

    都说人逢喜事精神爽,小凤凰拿了世界冠军当然更爽.一回国就开启了快乐直播,人均阴阳怪气,信息量巨大,让我们一起来康康吧! "刘青松赢了装自己很淡定,其实耳机里叫得最大声."" ...

  8. 【ECJTU_ACM 11级队员2012年暑假训练赛(8) - F - A Mame】

    Home Problems Status Contest Register Login B题要套一个数论的模版,注意m=1!! C题可以二分匹配,把行列看作点; 不能开百度,开谷歌搜题解,再次强调!一 ...

  9. Dream_Chaser队训练赛第一场 I题

    Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit ...

最新文章

  1. 32 usb 配置描述符_USB协议详解第4讲(USB描述符标准配置描述符)
  2. 构建之法读书笔记03
  3. assert宏的用法
  4. HBase 数据导入功能实现方式解释
  5. 中央空调“国进外退”,格力、美的、海尔三大白如何角逐新市场?
  6. IOS自带正则表达式NSPredicate的使用
  7. 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中
  8. 20135206于佳心【家庭作业汇总】
  9. 银行假流水怎么识破?
  10. [C++STL]map容器用法介绍
  11. /etc/security/limits.conf的相关说明
  12. windows下python环境搭建_Win7怎么搭建Python环境 win7系统搭建Python环境的方法
  13. AttributeError: module ‘cv2.cv2‘ has no attribute ‘bgsegm‘
  14. Netcore webservice
  15. ASP.NET--邮件发送
  16. 得物技术网络优化-CDN资源请求优化实践
  17. 香帅的北大金融学课笔记18 -- 监管、创新、危机
  18. Python基于openCV火焰识别
  19. Java 初级软件工程师 认证考试试卷1
  20. 国内外酒店软件公司发展简介(转)

热门文章

  1. 程序员必知8大排序3大查找(一)
  2. Juqery Html(),append()等方法的Bug
  3. jQuery---过滤选择器
  4. 公共交通WiFi末路?公交WiFi重挫 地铁WiFi承受盈利压力
  5. 《3ds Max疯狂设计学院》——1.6节3ds Max 2016新增的主要功能
  6. 《MySQL排错指南》——1.9 许可问题
  7. centos 7.0上RabbitMQ 3.5.6版本多实例启动操作讲解
  8. 演示:两台交换机成环后的STP计算原则
  9. solaris下用户不能正常登录CDE界面的解决办法
  10. FMStocks7 , 不错的一个.NET 示例程序