2021.10.15考试总结[NOIP模拟77]
\(n=40\)考虑\(meet \;in \;the \;middle\)
某个元素有关的量只有一个时考虑转化为树上问题
对暴力有自信,相信数据有梯度
没了
UPD:写了个略说人话的。
T1 最大或
选两个数,其中一个肯定选\(r\)。另一个在不卡上界后二进制位全选\(1\)。
\(code:\)
T1
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
typedef long long LL;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=70;
int t,l,r,ll,rr,ans;
int bitl[NN],bitr[NN];
bool up;
signed main(){
freopen("maxor.in","r",stdin);
freopen("maxor.out","w",stdout);
t=read();
while(t--){
memset(bitl,0,sizeof(bitl));
memset(bitr,0,sizeof(bitr));
l=read(); r=read(); ans=r; up=1;
ll=log2(l)+1; rr=log2(r)+1;
for(int i=l,p=1;i;i>>=1,++p) bitl[p]=i&1;
for(int i=r,p=1;i;i>>=1,++p) bitr[p]=i&1;
for(int i=rr;i;i--){
if(bitr[i]&&!bitl[i]) up=0;
if(up) continue;
if(!bitr[i]) ans+=1ll<<i-1;
}
write(ans,'\n');
}
return 0;
}
T2 答题
这种范围奇怪且好像只会\(2^n\)暴力的题,一般有个惯用套路\(meet\;in\;the\;middle\)。
这种直接写不好写且答案单调的题,一般有个惯用套路二分答案。
于是\(meet\;in\;the\;middle\)后二分答案,要求的其实是选出小于\(mid\)的分数的方案数。双指针扫一遍即可。
\(code:\)
T2
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
typedef long long LL;
typedef double DB;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=50;
int n,l,r,sum,res,pts[NN];
int cntl,cntr,lf[1050000],rt[1050000];
DB p;
bool check(int mid){
int tmp=rt[0],cnt=0;
for(int i=1;i<=lf[0];i++){
if(lf[i]>mid) break;
while(tmp&&rt[tmp]+lf[i]>mid) --tmp;
cnt+=tmp;
}
return p<=cnt;
}
signed main(){
freopen("answer.in","r",stdin);
freopen("answer.out","w",stdout);
n=read(); scanf("%lf",&p); p=ceil(p*(1ll<<n));
for(int i=1;i<=n;i++) pts[i]=read(), r+=pts[i];
cntl=(n+1)>>1; cntr=n>>1;
for(int i=0;i<(1<<cntl);i++){
++lf[0];
for(int j=0;j<cntl;j++) if(i&(1<<j))
lf[lf[0]]+=pts[j+1];
}
for(int i=0;i<(1<<cntr);i++){
++rt[0];
for(int j=0;j<cntr;j++) if(i&(1<<j))
rt[rt[0]]+=pts[j+cntl+1];
}
sort(lf+1,lf+lf[0]+1);
sort(rt+1,rt+rt[0]+1);
while(l<=r){
int mid=l+r>>1;
if(check(mid)) r=mid-1,res=mid;
else l=mid+1;
}
write(res,'\n');
return 0;
}
/*
4 0.01
4
2
4
2
*/
T3 联合权值
暴力直接过极限数据,有点不懂。
T4 主仆见证了hobo的离别
每个元件只被融合一次,考虑将这种关系建出一棵树,由原来的元件做新合成元件的儿子。
每次询问时,如果\(x,y\)没有祖先关系,则无解。否则,如果\(x\)为\(y\)的祖先,则\(y\)到\(x\)路径上需全是交,反之全是并。用并查集维护每个点向上延伸交并的最小深度即可。注意\(k=1\)时交并等价。
\(code:\)
T4
#include<bits/stdc++.h>
using namespace std;
namespace IO{
typedef long long LL;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=500010;
int n,m,x,y,k,tp,op,num,tot;
int cnt,f[NN],fa[NN],fo[NN],dep[NN],siz[NN],dfn[NN];
int idx,to[NN],nex[NN],head[NN];
struct query{ int x,y; }q[NN];
int geta(int a){ return fa[a]==a?a:fa[a]=geta(fa[a]); }
int geto(int o){ return fo[o]==o?o:fo[o]=geto(fo[o]); }
void add(int a,int b){
to[++idx]=b; nex[idx]=head[a]; head[a]=idx; f[b]=a;
}
void dfs(int s,int ff){
siz[s]=1; dep[s]=dep[ff]+1; dfn[s]=++cnt;
for(int i=head[s];i;i=nex[i])
dfs(to[i],s),siz[s]+=siz[to[i]];
}
signed main(){
freopen("friendship.in","r",stdin);
freopen("friendship.out","w",stdout);
n=read(); m=read(); tot=n;
for(int i=1;i<=n+m;i++) fa[i]=fo[i]=i;
for(int i=1;i<=m;i++){
tp=read();
if(!tp){
op=read(); k=read(); ++tot;
for(int a,i=1;i<=k;i++){
a=read(),add(tot,a),op?fo[geto(a)]=tot:fa[geta(a)]=tot;
if(k==1) op?fa[geta(a)]=tot:fo[geto(a)]=tot;
}
} else q[++num].x=read(),q[num].y=read();
}
for(int i=1;i<=tot;i++) if(!f[i]) dfs(i,0);
for(int i=1;i<=num;i++)
if(dep[q[i].x]>dep[q[i].y]){
if(dfn[q[i].x]<dfn[q[i].y]){ puts("0"); continue; }
if(dfn[q[i].x]>=dfn[q[i].y]+siz[q[i].y]){ puts("0"); continue; }
if(dep[geto(q[i].x)]>dep[q[i].y]){ puts("0"); continue; }
puts("1");
} else{
if(dfn[q[i].y]<dfn[q[i].x]){ puts("0"); continue; }
if(dfn[q[i].y]>=dfn[q[i].x]+siz[q[i].x]){ puts("0"); continue; }
if(dep[geta(q[i].y)]>dep[q[i].x]){ puts("0"); continue; }
puts("1");
}
return 0;
}
2021.10.15考试总结[NOIP模拟77]的更多相关文章
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 2021.10.7考试总结[NOIP模拟71]
信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...
- 2021.8.15考试总结[NOIP模拟40]
T1 送花 线段树.枚举右端点,线段树记录左端点对应的值. 每次对当前颜色上上次出现的位置到上次出现的位置区间减,上次出现的位置到当前位置区间加. $code:$ 1 #include<bits ...
- 2021.10.18考试总结[NOIP模拟76]
T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...
- 2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...
- 2021.10.11考试总结[NOIP模拟74]
T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...
- 2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.6.29考试总结[NOIP模拟10]
T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...
随机推荐
- LVS+keepalived集群
一.Keepalived工具介绍专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 官方网站:http://www.k ...
- 自己实现一个Controller——终极型
经过前两篇的学习与实操,也大致掌握了一个k8s资源的Controller写法了,如有不熟,可回顾 自己实现一个Controller--标准型 自己实现一个Controller--精简型 但是目前也只能 ...
- 利用滴答定时器(SysTick)实现简单的延时函数
预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...
- windows 安装zip 压缩
* 到sourceforge上下载 zip-3.0-bin.zip https://sourceforge.net/projects/gnuwin32/files/zip/3.0/zip-3.0-bi ...
- CI框架 ::集成极光推送
分三步 1:引入类: 2:新建Jpush类: 3:修改源码(PHP5.3.3环境)
- hadoop 学习笔记二
NameNode的持久化(persistent)(day4,1) 类似于:Redis redis中的持久化文件是相互独立的当两个持久化文件同时存在时默认使用的是aof ,但是namenode 的持久化 ...
- yum 安装 php 环境
如此简单 第一步: sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7. ...
- 基于AM3352/AM3354/AM3358/AM3359的Linux 开发环境搭建(上)
遇到不少人新手小白问,前辈如何搭建一个优良的Linux 开发环境?之前一直都是在用win开发,现在想要尝试用Linux做开发等等一系列的问题.开源一直是给电子行业工作者提供了一种向技术更深处进发的机遇 ...
- Spring Security 学习+实践
Spring Security是Spring为解决应用安全所提供的一个全面的安全性解决方案.基于Spring AOP和Servlet过滤器,启动时在Spring上下文中注入了一组安全应用的Bean,并 ...
- WPF进阶技巧和实战04-资源
资源集合 每个元素都有Resources属性,该属性存储了一个资源字典集合(它是ResourceDictionary类的实例).资源集合可以包含任意类型的对象,并根据字符串编写索引. 每个元素既可以访 ...