9 16 模拟赛&关于线段树上二分总结
1 考试时又犯了一个致命的错误,没有去思考T2的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时间了。
考试后在我看来这都是浪费时间了 浪费了我足足1h30min 其实是可以避免的 得不到正解先去看下一道题 都做完了再回来重新审视这道题。
2 T3的正解推得的时间虽然不长但是没有仔细思考自己的做法是否优秀尽管应该是正确的 但是不充足的思考让我的代码变得非常的冗长。
例如 一些区间求和的操作我完全可以直接拿处理好的前缀和后缀和数组求但是我还是写了两个线段树函数求和。明明可以不用线段树O(n)来写代码复杂度会低的很但是我没有充分的思考直接码上了线段树...
当然还是有优点的 T1写完后直接开始对拍了 这一点很好(拍了2万组数据 所以我就没怎么检查 就直接交了。
再论述题解的时候 我希望这套题不仅仅是对考试的思考 还有对线段树的总结我想我应该总结线段树的某些功能是怎么写的了不能每次写的时候都再推一遍。
线段树上二分是一个技巧且比较有用因为其利用本身就是区间二分的形式建的树和本身就支持查询区间最值的特点致使我们寻找某个值比较方便。
这里先给出题目背景 给定一个序列对于询问 x 求整个序列小于x的第一个位置是谁?
这个我们暴力扫其实都可以 但是多次询问呢?把询问离线由大到小的搞,强制在线呢?一个比较经典的做法是 ST+二分 看似序列并不是单调的 但是我们二分这个答案的长度 加以ST表寻找最值即可解决。
带上单点修改呢?ST表可是不支持修改的,那么此时线段树上二分就可以轻易解决这个问题了。
考虑我们先进入线段树 观察总体是否都大于x 不是的话那就 再观察左边 然后 去左边还是去右边递归的搞即可。
限定区间l r 怎么搞 这就是思维和代码难度的升级了 其实我们发现这个东西并不好写 但是 这也是对线段树的 利用 尽管非常的困。
其实对于这一个询问来说 我们可以定点l 寻找 一个rr 属于r即可。但是显然的是限定这个r是没有什么意义的我们完全可以向左找到在和r比 所以这里r 是没有用的。这里放上代码 不断还是在区间二分即可。
具体的还是找到了两个端点相当于一个区间 然后复杂度还是logn;
code:
```
inline int ask(int p,int l,int r,int L,int x)//求 L R里第一个>1;
if(l>=L)
{
if(sum(l(p))mid)return ask(r(p),mid+1,r,L,x);
int w=ask(l(p),l,mid,L,x);
if(w==mid)
{
if(sum(r(p))这就是常用的板子 写出来要对线段树有一定的理解 复杂度 logn 可以发现我们其实是先找到了左端点 再寻找到右端点了 所以相当于找到了一个区间。
不算很复杂 当然找全局的答案就更显得轻松了。值得注意的是由于查找的是当然我调了一天的T3 到了晚上最后的时刻才 发现了点什么思路是错误的 T3的伪思路 。
必胜点 的左部点的确只能吃一个方向的点 但是 注意到如果这个点事输的点那么就还会存在左边去完去右边 所以导致答案的错误。
所以我没有全局考虑还浪费近乎一天的时间 今天有点迷 头脑不太清醒 以后需要多思考正确性看看能不能把自己的做法卡掉这是关键。
对拍不一定能够发现问题 小数据2万组AC 大数据照样崩也是正常的事情。所以不要仗着对拍的成功就说明自己代码没有什么问题。
当一个代码调的时间过长的时候是不能再调了 因为可能思路错了 等到冷静下来再思考一下看看是否还有bug。浪费时间是可耻的。
当考试时间剩下的不多的时候不能再写自己刚想出来且还没有证明是正确的思路 因为这个时候可能存在漏洞还没有发现。可能当快写完的时候才会发现自己想错了 或者有一个细节什么的处理不了 或者代码复杂度过高根本是写不了的地步。
当代码难度较高 且正确性还没有证明 那么就不要去实现它 因为可能暴力分比其好写 好得分。
比赛中尽量拿分才是关键而不是AC一道全场都不能AC的题目。
综上所述 我是沙比。
进入正文:先放一波 我的伪代码毕竟调了很久里面的线段树向左二分和向右二分也很值得复习。
```
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define db double
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define INF 1000000010
#define cnt(p) s[p].cnt
#define sum(p) s[p].sum
#define l(p) s[p].l
#define r(p) s[p].r
using namespace std;
char *ft,*fs,buf[1'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch>1;
if(xn)return n;
if(sum(p)>1;
if(l>=x)
{
if(sum(l(p))>1;
if(r=2)
{
q[++t]=x-1;
vis[x-1]=1;
f[t]=0;
w[t]=a[x]-m;
}
if(!vis[x+1]&&x=2)
{
q[++t]=x-1;
vis[x-1]=1;
f[t]=0;
w[t]=max(val-a[x],a[x]-m);
//w[t]=val-a[x];
}
if(!vis[x+1]&&x+1=w[h])
{
mark[x]=1;
judge(x);
}
else unjudge(x,w[h]);
}
else
{
pos=query(1,1,n,x-1,m-cnt[x+1]);
s=sum[x]-sum[pos-1];
//if(x==188)cout=w[h])
{
mark[x]=1;
judge(x);
}
else unjudge(x,w[h]);
}
}
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();
for(ll i=1;i=1;--i)cnt[i]=cnt[i+1]+a[i];
for(ll i=1;i=2)
{
q[++t]=i-1;
vis[i-1]=1;
f[t]=0;
w[t]=maxx-m;
}
if(!vis[i+1]&&i考虑正解 其实 还算是比较难以思考出来的每次想我都会不知不觉转移到暴力的身上。 首先对于每一个数字 求出左边第一个比其大的数字 右边第一个比其大的数字。
必胜点已知 且吞噬掉必胜点的点必然也是必胜点 我们进行继续推下去 对于一个数字我们知道了它当前能吞噬的一个区间 如果这个区间+m比左边和右边都小那么就是必败点了。
吞噬掉必败点一定必败 但是如何阻止暴力的产生?其实这也是不可避免的但是我们可以利用只暴力一次的想法把所有点的合法情况都给求出来。
记搜优化这个过程即可。当实现的时候就发现了是否存在环?这显然是不可能的。
```
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define db double
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define INF 8000000000000010ll
using namespace std;
char *ft,*fs,buf[1'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch=a[r[x]])
{
if(!vis[r[x]])dfs(r[x]);
if(vis[r[x]]==1)vis[x]=1;
}
if(cnt+m>=a[l[x]])
{
if(!vis[l[x]])dfs(l[x]);
if(vis[l[x]]==1)vis[x]=1;
}
return;
}
signed main()
{
freopen("1.in","r",stdin);
n=read();m=read();
a[0]=INF;a[n+1]=INF;
for(ll i=1;i=1;--i)
{
while(top&&a[s[top]] 关于T2 比较难思考 我 连最基础的都证明不出来 更别说列出来递推式了。
突然想到自己为什么要看题解...突然自己推了一波 感觉是正确的。
首先 对于构造这个长度为n的字符串我们显然有$n^m$*$n^2$这个东西 当然manacher显然可以加快这个过程。不过复杂度少乘一个n。
这样显然是不科学的 因为n和m都过大不能想着构造 对于一个长度为n的字符串字符集为m 那么显然这个字符串的个数为 sum=$m^ \frac{n}{2}$
减去不合法的即可。那么就显然有ans=sum-$\sum_{i=2}^{n-1}$$f_i$*$\frac{(n-2*i+1)}{2}$ 其中$f_i$表示长度为i的字符串的是回文串的个数且前缀不含回文的数量。
我们只要求出f这个数组即可 但是还没有那么简单..$f_i$这个数组中可能有重。
关于一个命题 :一个长度大于$\frac{n}{2}$的回文字符串 必然存在一个小于$\frac{n}{2}$的回文串。
证明 :分两种情况 一种显然 一种定量计算即可。(本人找刘神证明过了
那么上式中i的范围就可以被我们从n-1缩小到$\frac{n}{2}$的范围之内了 那么现在我们就可以写了。
然后我们发现答案其实就是f[n]了 也就是这个式子就是用来计算f数组的我们直接赋好初值即可,n^2递推
```
const ll MAXN=1000010;
ll n,m;
ll f[MAXN],p[MAXN];
signed main()
{
freopen("1.in","r",stdin);
n=read();m=read();
p[0]=1;f[1]=m;f[2]=m;
for(ll i=1;i真看不懂就别看了 很自闭研究了好久这道题。

这可能是这两天最水的题目了 简单的树形dp 看完题就秒了。
dp一下 然后换根操作也显得非常的简单。
```
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define db double
#define R register
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define INF 1000000000
using namespace std;
char *ft,*fs,buf[1'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch0)
{
f[x]+=f[tn];
mark[tn]=1;
}
}
return;
}
inline void dp(int x,int father)
{
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(tn==father)continue;
if(mark[tn])g[tn]=max(f[tn],g[x]-f[tn]);
else g[tn]=max(0,g[x])+f[tn];
dp(tn,x);
}
}
int main()
{
//freopen("1.in","r",stdin);
//freopen("trip.in","r",stdin);
//freopen("trip.out","w",stdout);
n=read();
for(int i=1;i
9 16 模拟赛&关于线段树上二分总结的更多相关文章
- 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
- hdu 5930 GCD 线段树上二分/ 强行合并维护信息
from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...
- 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)
我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- 贪心+离散化+线段树上二分。。。 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest G. Of Zorcs and Axes
题目链接:http://codeforces.com/gym/101149/problem/G 题目大意:给你n对数字,为(a[i], b[i]),给你m对数字,为(w[i], c[i]).给n对数字 ...
- 【BZOJ】4293: [PA2015]Siano 线段树上二分
[题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...
- HDU 4747 Mex【线段树上二分+扫描线】
[题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...
- CF 1405E Fixed Point Removal【线段树上二分】
CF 1405E Fixed Point Removal[线段树上二分] 题意: 给定长度为\(n\)的序列\(A\),每次操作可以把\(A_i = i\)(即值等于其下标)的数删掉,然后剩下的数组 ...
随机推荐
- 【MySQL】Merge Index导致死锁
水稻:最近有个朋友生产环境出现MySQL死锁问题,一听是死锁,那必须去看看啊,于是饶(si)有(qu)兴(huo)致(lai)的研究了好几天 菜瓜:MySQL死锁,赶紧分享一下 水稻:能否先让我装完X ...
- 理解ASCII,Unicode和UTF-8关系
前言:之前一直就好奇这个问题,但是一直没解决,今天我总算明白了,感谢大佬们的科普 转自:https://blog.csdn.net/Deft_MKJing/article/details/794604 ...
- 小师妹学JVM之:Dirty cards和PLAB
目录 简介 分代收集器中的空间划分 Write barrier和Dirty cards PLAB old space分配对象 总结 简介 分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有 ...
- jvm之栈、堆
1. Java Virtual Machine 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...
- CSS(二)- 属性速览(含版本、继承性和简介)
相关链接 CSS3速查表,这里面列出了所有新增的属性以及新增或者修改的属性值 css参考手册,很好地一个常用网站 CSS定位(不可继承) CSS布局(仅visibility可继承) CSS尺寸(不可继 ...
- 【XCTF】ics-05
信息: 题目来源:XCTF 4th-CyberEarth 标签:PHP.伪协议 题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统 解题过程 题目给了一个工控管理系统,并提示存在后门, ...
- scrapy 基础组件专题(八):scrapy-redis 框架分析
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 您可以启动多个spider工 ...
- 数据可视化实例(三): 散点图(pandas,matplotlib,numpy)
关联 (Correlation) 关联图表用于可视化2个或更多变量之间的关系. 也就是说,一个变量如何相对于另一个变化. 散点图(Scatter plot) 散点图是用于研究两个变量之间关系的经典的和 ...
- git本地创建分支,并提交到github上去
很多时候,我们再开发的时候需要分支. 那么怎么在本地创建分支,并提交到github或者是远程仓库中呢? 其实很简单: 第一步: git checkout -b dev 创建新的分支 第二步: ...
- redis未授权访问简单总结
redis环境搭建 下载有漏洞的redis版本 wget http://download.redis.io/releases/redis-3.2.11.tar.gz 编译文件 make 进入src目录 ...