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真看不懂就别看了 很自闭研究了好久这道题。

![](https://img2018.cnblogs.com/blog/1485523/201909/1485523-20190918101519036-286338643.png)

这可能是这两天最水的题目了 简单的树形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 模拟赛&关于线段树上二分总结的更多相关文章

  1. 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分

    LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...

  2. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  3. hdu 5930 GCD 线段树上二分/ 强行合并维护信息

    from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...

  4. 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)

    我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...

  5. LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分

    题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...

  6. 贪心+离散化+线段树上二分。。。 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对数字 ...

  7. 【BZOJ】4293: [PA2015]Siano 线段树上二分

    [题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...

  8. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  9. CF 1405E Fixed Point Removal【线段树上二分】

    CF 1405E Fixed Point Removal[线段树上二分]  题意: 给定长度为\(n\)的序列\(A\),每次操作可以把\(A_i = i\)(即值等于其下标)的数删掉,然后剩下的数组 ...

随机推荐

  1. css文字不透明度怎么设置?

    在css中有很多好看的样式都可以实现,css设置出来的样式让整个网页看起来也会非常美观,今天的这篇文章就给大家来介绍一下在css中怎么设置文字的透明度,让你的文字在网页中看起来是透明的. CSS设置透 ...

  2. CSS3 nth-child的使用,详解css中nth的作用,以及nth-child的兼容写法

    :nth-child是css3的一个比较常用的选择器.它用于匹配属于其父元素中的子元素,不论元素的类型. 它的参数可以是数字.关键词或公式.下面讲介绍它的使用方法, nth-child的使用 html ...

  3. redis基础02-redis的5种对象数据类型

    表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...

  4. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  5. JavaScript函数使用知识点回顾

    JS函数本质更像一个对象,有属性和方法. 将函数定义作为对象的属性,则称之为对象方法:函数如果用于创建新的对象,则称之为对象的构造函数. (1)JS使用关键字  function  定义函数. 函数可 ...

  6. drf请求、响应与视图

    目录 一.请求 1 定义 2 常用属性 1).data 2).query_params 二.响应 1 Response 2 构造方法 3 状态码 1)信息告知 - 1xx 2)成功 - 2xx 3)重 ...

  7. CSS(六)- 内容布局 - Flexbox

    Flexbox是CSS3提供的用于布局的一套新属性,是为了应对行内块.浮动和表格格式产生的问题而生的.其包含针对容器(弹性容器,flex container)和针对其直接子元素(弹性项,flex it ...

  8. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  9. Resource exhausted: OOM when allocating tensor with shape[3,3,384,384] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0。。。。。

    报错信息: OP_REQUIRES failed at assign_op.h:111 : Resource exhausted: OOM when allocating tensor with sh ...

  10. A Broken Calculator 最详细的解题报告

    题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256M ...