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枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...
随机推荐
- 模拟BS服务器
一.模拟BS服务器分析 二.BS模拟服务器代码实现 图片都是单独请求,后台单独线程,这边是通过构造方法传入的Runable接口的实现类匿名对象创建线程: 创建本地输入流读取到网络输出流传过来的信息再放 ...
- k8s核心资源之Pod概念&入门使用讲解(三)
目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...
- python库--tensorflow
方法 返回值类型 参数 说明 张量 .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...
- go语言游戏服务端开发(一)——架构
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. 网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...
- 使用Python来临时启动端口,用来做安全时候的扫描用
root用户:mkdir /home/aicccd /home/aicc/nohup python -m SimpleHTTPServer 8060 &netstat -antp|grep 8 ...
- 做一个U盘的学习路线
最近想研究一个U盘,然后顺便熟悉一下USB协议.因为USB协议比较复杂, 常用的复杂外设除了WiFi,Ethernet,SDIO和USB这些就是USB了,学习USB的时候肯定要拿一个东西下手,所以简单 ...
- 用tcping检查网站开放的端口
麦新杰之前分享过一款小巧玲珑工具软件:tcping,即在tcp层进行端口的ping. tcping可以用来检查和确认我们的网站有哪些端口是开放的,使用很顺手.比如麦新杰这几天在研究如何关闭mysql的 ...
- Vite插件开发纪实:vite-plugin-monitor(下)
前言 上一篇介绍了Vite启动,HMR等时间的获取. 但各阶段详细的耗时信息,只能通过debug的日志获取 本文就实现一下debug日志的拦截 插件效果预览 --debug做了什么 项目启动指令 vi ...
- T-SQL——函数——字符串操作函数
目录 0. 加号(+) 1. LEFT和RIGHT 2. SUBSTRING 3. LEN和DATALENGTH 4. CHARINDEX和PATINDEX 5. REPLACE 6. REPLICA ...
- ECMA 2022 (es13) 新特性
本文主要整理了截至到 2021年10月12日 为止的且处于 Stage 3->Stage 4 阶段的ECMA提案. 主要包括: Class Fields RegExp Match Indices ...