\(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. Spring全自动AOP和项目加入jar包

    一.jar可以引进项目中,复制到路下后,要add as library,加载到工作空间中才能引入: 也jar包放在硬盘的项目目录外面,可以多个项目引入共用: 二.xml配置 1.aop全自动配置 2. ...

  2. SprinBoot-SpringData-整合

    目录 SpringData 整合JDBC JDBCTemplate 整合Druid 配置数据源 配置Druid数据源监控 整合MyBatis 整合测试 整合Redis 测试整合 序列化配置 自定义re ...

  3. activemq启动错误UnsupportedClassVers rg/apache/activemq/console/Main:Unsupported major.minor version52.0

    ActiveMQ与java的JDK是有版本对应匹配的. 下面提供一个匹配图: MQ版本号 Build-Jdk 依赖JDKapache-activemq-5.0.0 1.5.0_12 1.5+apach ...

  4. RabbitMQie消息列队整理

    使用方法过程,这儿只做了windows平台教程 先安装Erlang 编程软件,然后设置环境变量,在安装RabbimMQ ,这儿我下载了一个版本不行,后来换了最新版就好了,以后在使用过程 中如果有问题 ...

  5. js判断访客来源网址和关键字

    加入现在有A.B两个站,A为友站,B为我站. 希望判断使用从A站连来时,就把访问者拒绝在门外,只要用简单几行的javascript,就可抓到使用的来源,以及作出一些防范的措施. <script ...

  6. Shell系列(23)- 字符截取命令sed

    简述 字符替换命令sed 和vi功能相似,但是vi是给用户用的,sed是给脚本用的 sed是一种几乎包括在所有的UNIX平台(包括Linux)的轻量级流编辑器.s sed主要是用来将数据进行选取.替换 ...

  7. Writing in the Science 01

    INTRODUCTION What makes good writing? Good writing communicates an idea clearly and effectively. Goo ...

  8. DBeaver MSSQL 支持TLS设置

    DBeaver是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 由于 DBeaver 基于 Java 开发, ...

  9. Interrupted Exception异常可能没你想的那么简单!

    摘要: 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常.如果我们对InterruptedException异常处理 ...

  10. HTML基本标记

    头部标记 <head></head> 说明:元素的作用范围是整篇文档.元素中可以有元信息定义.文档样式表定义和脚本等信息,定义在HTML语言头部的内容往往不会在网页上直接显示. ...