10.29 正睿停课训练 Day11
2018.10.29 正睿停课训练 Day11
一场rating排名从11掉到40+ ==。掉就掉吧

状态很迷 全程写T1的。。随机算法。。(一开始就想错了,误以为它正确性很高)
T2有想法但没调出来
T3有50暴力但是直接没看==
A 线段树什么的最讨厌了(思路 DFS)
容易发现线段树上区间\([l,r]\)的父节点只有\(4\)种情况:\([l,r+len-1],[l,r+len],[l-len-1,r],[l-len,r]\)。
其实也比较好想,因为只需对父节点区间长度的奇偶性分类讨论一下。
那么我们可以直接从给定区间\([l,r]\)不断枚举父节点,直到找到一个根节点\([0,n]\)?
显然只有\(log\)层,那这样是\(4^{\log n}=n^2\)的?注意到有限制为\((\frac{l}{l-r+1})^2\leq2000\),所以\(n^2\)是可过的。(好吧我也不太明白为啥是\(\frac{l}{l-r+1}\)?)
注意要剪枝,不去搜明显不属于线段树上的区间(不然还是暴力分)。
//371ms 504kb
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
int Ans;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void DFS(int l,int r)
{
if(l<0||r>=Ans) return;
if(!l) {Ans=r; return;}
int len=r-l+1;
if(l-len>=2*len||!(l-len))DFS(l-len,r);
if(l-len>=2*(len+1)||!(l-len-1)) DFS(l-len-1,r);
if(l>2*len) DFS(l,r+len);
if(l>2*(len-1)) DFS(l,r+len-1);
}
int main()
{
for(int T=read(); T--; )
{
int l=read(),r=read(),lim=read();
if(l==r) {printf("%d\n",r); continue;}
Ans=lim+1, DFS(l,r), printf("%d\n",Ans>lim?-1:Ans);
}
return 0;
}
B 已经没有什么好害怕的了(差分 前缀和)
将每个配对的括号表示成\([l,r)\)的形式。
首先可以将区间\([l,r)\)加一。
然后对于左端点\(l'\)在\(r\)位置的匹配括号对,显然可以将\([l,r)\)的贡献都加到\([l',r')\)上;
对于右端点\(r'\)在\(l\)位置的匹配括号对,显然也可以将\([l,r)\)的贡献都加到\([l',r')\)上。
然后就可以神奇差分了。。然后没看懂。。学套路吧。。
//899ms 21408kb
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=1e6+5;
int sk[N],L[N],R[N],sum[N],delta[N];
LL sum2[N];
char s[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
for(int T=read(),n; T--; )
{
memset(L,0,sizeof L);
memset(R,0,sizeof R);
memset(sum,0,sizeof sum);
memset(delta,0,sizeof delta);
scanf("%s",s+1), n=strlen(s+1);
int top=0;
for(int i=1; i<=n; ++i)
if(s[i]=='(') sk[++top]=i;
else if(top) L[i+1]=sk[top], R[sk[top--]]=i+1;
for(int i=n+1; i; --i) sum[L[i]]+=sum[i]+1;
for(int i=1; i<=n; ++i) delta[R[i]]+=delta[i]+1;
for(int i=1; i<=n; ++i) sum2[i]=sum2[i-1]+sum[i]-delta[i];
LL ans=0;
for(int i=1; i<=n; ++i) ans+=sum2[i]*i%mod;
printf("%lld\n",ans);
}
return 0;
}
C 我才不是萝莉控呢(DP 贪心 哈夫曼树)
显然可以\(n^2\)DP。我们可以从\((1,1)\)DP到\((n,1)\)这样DP就只有两种转移了(不需要考虑下取整),即\(f[i][j]=\min\{f[i-1][j+1],\ f[i][(j+1)/2]\}\)。
如果你熟悉哈夫曼树,会发现这就类似哈夫曼树的DP转移。(哈夫曼树的DP方法见这儿,也是\(n^2\)的)
不是类似,把哈夫曼树的DP过程倒过来就是这个题的走路方式了。
所以本题等价于求哈夫曼树。用堆就可以\(O(n\log n)\)解决了。
因为每次合并出的东西单调的,所以二叉哈夫曼树也可以\(O(n)\)解决(见代码)。
//48ms 1552kb
#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int n,tot,pa,pb,A[N],B[N<<1];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Get()
{
return (pb>tot||A[pa]<=B[pb])?A[pa++]:B[pb++];
}
int main()
{
for(int T=read(); T--; )
{
n=read(),tot=0,pa=pb=1;
for(int i=n; i; --i) A[i]=read();
LL ans=0; A[n+1]=0x7fffffff;
for(int i=1,x,y; i<n; ++i)
x=Get(),y=Get(),B[++tot]=x+y,ans+=x+y;
printf("%lld\n",ans);
}
return 0;
}
考试代码
A
#include <map>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define LIM 5000000
typedef long long LL;
const int N=5e6+5;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
bool Query(int l,int r,int L,int R)
{
if(l==L&&r==R) return 1;
if((L<l&&R>=l)||(L<=r&&R>r)||R<l||L>r||l==r) return 0;
// if(L<=l&&r<=R) return 0;
int m=(LL)l+r>>1;
return Query(l,m,L,R)||Query(m+1,r,L,R);
}
void Violence(int l,int r,int lim)
{
for(int i=r; i<=lim; ++i)
if(Query(0,i,l,r)) {printf("%d\n",i); return;}
puts("-1");
}
//inline int Getpos(int x)
//{
// return x>65536?bit[x>>16]:bit[x];
//}
inline int Rand()
{
return (rand()<<16)|rand();
}
bool Solve(int L,int R,int lim)
{
// std::map<int,bool> vis;
int ans=lim+1;
for(int suc=0,mod=lim+1-R,fail=0; suc<=50000&&ans>R; ++suc)
{
int p=rand()%(ans-R)+R;
// if(vis[p])
// {
// if(++fail>=150000) break;
// continue;
// }
// vis[p]=1;
if(Query(0,p,L,R))
{
ans=std::min(ans,p);
for(int i=1; p>>i>=R; ++i)
if(Query(0,p>>i,L,R)) ans=std::min(ans,p>>i), ++suc;
else break;
}
}
if(ans<=lim)
{
printf("%d\n",ans);
return 1;
}
return 0;
}/*
3
521 535 1196
608 624 3828
304 314 3650
1
990 1755 1080952540
540 555 2308
464 475 2833
*/
int main()
{
freopen("tree.in","r",stdin);
freopen("my.out","w",stdout);
// for(int i=1; i<=65536; ++i)
// for(int j=16; ~j; --j)
// if(i>>j&1) {bit[i]=j; break;}
int t=rand(); srand(t);
for(int T=read(),t=1; t<=T; ++t)
{
int L=read(),R=read(),lim=read();
if(R>lim) {puts("-1"); continue;}
if(lim<=1000) {Violence(L,R,lim); continue;}
if(!Solve(L,R,lim)) puts("-1");
}
return 0;
}
10.29 正睿停课训练 Day11的更多相关文章
- 10.31 正睿停课训练 Day13
目录 2018.10.31 正睿停课训练 Day13 A Poker(期望) B Label(高斯消元) C Coin(二分图染色 博弈) 考试代码 A(打表) B 2018.10.31 正睿停课训练 ...
- 10.30 正睿停课训练 Day12
目录 2018.10.30 正睿停课训练 Day12 A 强军战歌(DP 树状数组 容斥) B 当那一天来临(思路) C 假如战争今天爆发(贪心) 考试代码 B C 2018.10.30 正睿停课训练 ...
- 10.25 正睿停课训练 Day9
目录 2018.10.25 正睿停课训练 Day9 A 数独(思路 DP) B 红绿灯(最短路Dijkstra) C 轰炸(计算几何 圆并) 考试代码 B C 2018.10.25 正睿停课训练 Da ...
- 10.24 正睿停课训练 Day8 AM
目录 2018.10.24 正睿停课训练 Day8 AM A 棒棒糖(组合) B 彩虹糖(思路 博弈) C 泡泡糖(DP) 考试代码 A B C 2018.10.24 正睿停课训练 Day8 AM 期 ...
- 10.23 正睿停课训练 Day7
目录 2018.10.23 正睿停课训练 Day7 A 矩形(组合) B 翻转(思路) C 求和(思路 三元环计数) 考试代码 B1 B2 C 2018.10.23 正睿停课训练 Day7 期望得分: ...
- 11.6 正睿停课训练 Day17
目录 2018.11.6 正睿停课训练 Day17 A chinese(思路 计数) B physics(单调队列/剪枝 DP) C chemistry(期望 DP) 考试代码 A B C 2018. ...
- 11.5 正睿停课训练 Day16
目录 2018.11.5 正睿停课训练 Day16 A 道路规划(思路) B 逻辑判断(枚举 位运算/DP 高维前缀和) C 区间(贪心/树状数组) 考试代码 A B C 2018.11.5 正睿停课 ...
- 11.2 正睿停课训练 Day15
目录 2018.11.2 正睿停课训练 Day15 A 郁闷的小G(二分) B 小G的树(树形DP) C 数的距离(思路) 考试代码 B C 2018.11.2 正睿停课训练 Day15 时间:3.5 ...
- 11.1 正睿停课训练 Day14
目录 2018.11.1 正睿停课训练 Day14 A 字符串 B 取数游戏(贪心) C 魔方(模拟) 考试代码 B C 2018.11.1 正睿停课训练 Day14 时间:3.5h 期望得分:100 ...
随机推荐
- Dubbo服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或简单处理,从而释放服务器资源以保证核心业务正常运作或高效运作. 可以通过服务降级功能临时屏蔽某个出错的非关键服务并定义 ...
- 【转】Python流程控制语句
[转]Python流程控制语句 人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走:有的人好一点,可以二选一:有些能力好或者家境好的人,可以有更多的选择:还有一些人在人生的迷茫期会在 ...
- class_create(),device_create自动创建设备文件结点【转】
本文参考来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhenwenxian/archive/2010/03/28/5424434.aspx 本文转自:http://ww ...
- mysql系列七、mysql索引优化、搜索引擎选择
一.建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天 ...
- expdp和impdp导入和导出数据
一 关于expdp和impdp 使用EXPDP和IMPDP时应该注意的事项:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程 ...
- 转载:2.1 运行中的Nginx进程间的关系《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19624.html 在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,w ...
- GBDT学习
白话GBDT: https://blog.csdn.net/qq_26598445/article/details/80853873 优点: 预测精度高 适合低维数据 能处理非线性数据,该版本GBDT ...
- LeetCode(6):Z字形转换
Medium! 题目描述: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状) P A H N A P L S I I G Y I R 之后按 ...
- 使用mybatis-spring-boot-starter如何打印sql语句
只需要将接口文件的日志设置为debug即可. 例如你的mapper接口所在的文件夹是 com.demo.mapper 那么在application.properties配置文件中添加 logging. ...
- liunx rm 命令修改
原文:https://blog.csdn.net/Ace_Shiyuan/article/details/60139791 1.打开一个终端,输入命令:vim ~/.bashrc Linux下修改rm ...