\(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]的更多相关文章

  1. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  2. 2021.10.7考试总结[NOIP模拟71]

    信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...

  3. 2021.8.15考试总结[NOIP模拟40]

    T1 送花 线段树.枚举右端点,线段树记录左端点对应的值. 每次对当前颜色上上次出现的位置到上次出现的位置区间减,上次出现的位置到当前位置区间加. $code:$ 1 #include<bits ...

  4. 2021.10.18考试总结[NOIP模拟76]

    T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...

  5. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

  6. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  7. 2021.10.9考试总结[NOIP模拟72]

    T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...

  8. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  9. 2021.6.29考试总结[NOIP模拟10]

    T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...

随机推荐

  1. AntDesign VUE:上传组件图片/视频宽高、文件大小、image/video/pdf文件类型等限制(Promise、Boolean)

    文件大小限制 - Promise checkFileSize(file, rules) { return new Promise((resolve, reject) => { file.size ...

  2. SpringBoot-初见

    目录 简单介绍 什么是SpingBoot? 微服务 单体应用架构 微服务架构 怎么构建微服务 第一个SpringBoot程序 官方网站快速构建 IDEA 代码 自动装配(要点) pom.xml 启动器 ...

  3. python库--pandas--Series

    方法 返回数据类型 参数 说明 Series(一维)       .Series() Series 实例s 创建一维数据类型Series data=None 要转化为Series的数据(也可用dict ...

  4. WPF Prism8.0中注册Nlog日志服务

    无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来 ...

  5. 前端框架VUE——数据绑定及模板语法

    一.数据绑定 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ msg }} </di ...

  6. 【简单数据结构】并查集--洛谷 P1111

    题目背景 AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数NN,和公路数MM,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你 ...

  7. java线程day-01

    综述:下面写的是我学习java线程时做的一些笔记和查阅的一些资料总结而成.大多以问答的形式出现. 一.什么是线程? 答:线程是一个轻量级的进程,现在操作系统中一个基本的调度单位,而且线程是彼此独立执行 ...

  8. Kubernetes-Pod介绍(三)-Pod调度

    前言 本篇是Kubernetes第六篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...

  9. .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性

    前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...

  10. ecshop商品自定义销量(虚拟销量)实现方法

    1.在sq执行语句   ALTER TABLE `ecs_goods` ADD `sales_volume_base` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0' ...