HR#7 题解
T1
签到题
#include<bits/stdc++.h>
#define R register int
using namespace std;
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
}
int n,p[101],d[101];
int main() {
n=g(); for(R i=1;i<=n;++i) p[i]=g(),d[i]=g();
for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) {
if(p[i]+d[i]==p[j]&&p[i]==p[j]+d[j]) return puts("= ="),0;
} puts("O O");
}
T2
想一下,发现对应进制Base的奇数幂的位置必须是0。
每一位都可以是 \(0\)~\(K-1\) ,所以我们直接计算每个长度的答案累加就好,注意要特判最高位是否是偶数幂,若是,则要有最高位的限制。
#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
inline ll g() { register ll x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
}
ll n,x,k,ans,anss; int mem[20],t;
inline void main() {
x=n=g(),k=g(); while(x) mem[++t]=x%k,x/=k;
ans=1;
for(R i=1;i<t;i+=2) ans+=ans*(k-1); anss=ans;
if(t&1) for(R i=1;i<=mem[t];++i) anss+=ans;
printf("%lld\n",anss);
}
} signed main() {Luitaryi::main(); return 0;}
T3
通过观察(?),发现,只有冗余 \(2*2\) 的格子时,我们无法正确计算能填几个 \(1*3\) 的,于是判掉。。。。。
剩下的直接贪心,排序后取前几个 (显然)
#include<bits/stdc++.h>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=10010;
int T,n,m,k1,k2,ans,Lim;
int w1[N],w2[N];
inline void main() {
T=g(); while(T--) { ans=0;
n=g(),m=g(),k1=g(),k2=g();
for(R i=1;i<=k1;++i) w1[i]=g();
for(R i=1;i<=k2;++i) w2[i]=g();
sort(w1+1,w1+k1+1,greater<int>());
sort(w2+1,w2+k2+1,greater<int>());
for(R i=1;i<=k1;++i) w1[i]+=w1[i-1];
for(R i=1;i<=k2;++i) w2[i]+=w2[i-1];
if(n%3==2&&m%3==2&&(n==2||m==2)) //冗余2*2的格子,而 2*2 的格子不能用 1*3 的物品去填的
Lim=n*m-4;
else Lim=n*m-n*m%3;
for(R i=0,lim=min(k2,Lim/3);i<=lim;++i)
ans=max(ans,w2[i]+w1[min(k1,(n*m-i*3)/2)]);
printf("%d\n",ans);
}
}
} signed main() {Luitaryi::main(); return 0;}
T4
考试时只会插板,dp预处理不会。
#include<iostream>
#include<cstdio>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
inline ll g() { register ll x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=100,M=905229641;
int m,ans,Inv[N+1],fac[N+1],f[N*N][N]; ll n;
inline int C(ll n,int m) { R ret=1;
for(R i=1;i<=m;++i) ret=1ll*ret*Inv[i]%M*((n-m+i)%M)%M; return ret;
}
inline void main() {
Inv[0]=Inv[1]=1; for(R i=2;i<=N;++i) Inv[i]=M-1ll*M/i*Inv[M%i]%M;
fac[0]=fac[1]=1; for(R i=2;i<=N;++i) fac[i]=1ll*fac[i-1]*i%M;
n=g(),m=g(); f[0][0]=1; //f[j][i] 和为j,i个 %m 不同余的数
for(R t=0;t<m;++t) for(R j=m*(m-1)/2;j>=t;--j) for(R i=m;i>=1;--i)
f[j][i]=(f[j][i]+f[j-t][i-1])%M;
//枚举填的是什么数(模意义下),枚举填了几个,枚举总和。(01背包)
//之所以要记填了几个,是因为后面插板要用
for(R i=0,lim=min(m*(m-1)/2ll,n);i<=lim;++i) { //枚举可以自由分配的部分
if((n-i)%m) continue; register ll k=(n-i)/m;
for(R j=1;j<=m;++j) ans=(ans+1ll*f[i][j]*C(k+j-1,j-1)%M*fac[j])%M;//插板,注意是有序的
} printf("%d\n",ans);
}
} signed main() {Luitaryi::main(); return 0;}
T5
首先有一个十分 naive 的做法:
#include<bits/stdc++.h>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} int n;
char s[30],c[100010];
inline void ck(int l,int r) {
c[l]=1,c[r]=0;
if(l+1==r) return ;
printf("? %d %d",l+1,r-1);
cout<<endl<<flush;
scanf("%s",s);
if(s[0]=='Y') ck(l+1,r-1);
else {
if(l+3==r) {
c[l]=1,c[l+1]=0,c[l+2]=1,c[l+3]=0; return ;
}
for(R p=l+1;p<r&&l<r;p+=2) {
printf("? %d %d",l,p);
cout<<endl<<flush;
scanf("%s",s);
//flush(stdin);
if(s[0]=='Y') {ck(l,p),ck(p+1,r); return ;}
}
}
}
inline void main() {
n=g();
ck(1,n);
putchar('!');putchar(' ');
for(R i=1;i<=n;++i) putchar(c[i]?'(':')'); cout<<endl<<flush<<endl;
}
} signed main() {Luitaryi::main(); return 0;}
只是充充数
上面的代码含义是递归每个 合法的 区间,我们发现,如果区间是合法的,最左边一定是 '(' ,**最右边一定是 ** ')' 。
于是一个合法区间可能由一个或多个合法子区间组成,于是递归。
递归边界是两个合法括号"()"或四个"()()"
好的显然他询问次数过多
但是注意到,我们在上面没有好好 利用每一次询问得到的信息 ,所以他萎了。
注意一下上次的递归边界,若有两个括号,且合法,那一定是"()",这种是真正有用的信息。
我们怎么利用呢?我们可以一直询问相邻两个,若合法,就把他们去掉,这样包含他们的两个括号就相连了,即我们可以接着尝试扩展合法区间。
具体的,我们可以用一个栈维护这个过程:若栈中为空,当前指针入栈;若栈中的括号与现在指针构成的区间合法,弹栈;否则当前指针入栈;
复杂度\(\mathcal{O}(n)\)
#include<bits/stdc++.h>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
}
int n,stk[100010],top;
char s[30],c[100010];
inline void main() {
n=g(); stk[++top]=1; R p=2;
while(p<=n) {
if(!top) stk[++top]=p,++p;
printf("? %d %d",stk[top],p);
cout<<endl<<flush;
scanf("%s",s); if(s[0]=='Y'){
c[stk[top]]=1,c[p]=0; --top;
} else stk[++top]=p;
//p+=2;
++p;
} putchar('!');putchar(' ');
for(R i=1;i<=n;++i) putchar(c[i]?'(':')'); cout<<endl<<flush<<endl;
}
} signed main() {Luitaryi::main(); return 0;}
HR#7 题解的更多相关文章
- HR# 5题解
T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...
- HR#4 题解
既然考这么差就来写题啦OTZ T1 猜结论?猜nm! 一直到考试结束都没猜出来=.=我就好奇别人如何猜出来的 我们来说DP(from ZBK) 设\(dp[i][j]\)表示胜or负 那我们来看一下代 ...
- JSOI Round 2题解
强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programme ...
- 【AtCoder】AGC023 A-F题解
可以说是第一场AGC了,做了三道题之后还有30min,杠了一下D题发现杠不出来,三题滚粗了 rating起步1300+,感觉还是很菜... 只有三题水平显然以后还会疯狂--啊(CF的惨痛经历) 改题的 ...
- CODEVS——T 3736 【HR】万花丛中2
http://codevs.cn/problem/3736/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description ...
- 3736 【HR】万花丛中2
3736 [HR]万花丛中2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description HR神犇在成功攻略ZX后,花心 ...
- [NOIP补坑计划]NOIP2017 题解&做题心得
终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...
- 题解 P3693 【琪露诺的冰雪小屋】
知识点: 模拟 , 信仰 原题面 大 型 车 万 众 自 裁 现 场 分析题意: 操作: ICE_BARRAGE R C D S R:行 , C:列, D:方向 , S:强度 在(R,C) 向 D 射 ...
- Vulnhub靶场题解
Vulnhub简介 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行 ...
随机推荐
- UVALive-8201-BBP Formula
8201-BBP Formula Time limit: 3.000 seconds In 1995, Simon Plouffe discovered a special summation sty ...
- Hbuilder环境下配置php
XAMPP的安装 https://blog.csdn.net/qing666888/article/details/81914389 安装并配置好Xampp后,在Hbuilder中下载php插件,工具 ...
- scrapy2——框架简介和抓取流程
scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中 scrapy的执行流程 Scrapy主要包括 ...
- C++ new/delete详解及原理
学了冯诺依曼体系结构,我们知道: 硬件决定软件行为,数据都是围绕内存流动的. 可想而知,内存是多么重要.当然,我们这里说的内存是虚拟内存(详情看Linxu壹之型). 1.C/C++内存布局 2.C语言 ...
- Spring Boot集成Spring Data Jpa完整实例
步骤: 添加依赖: 配置文件: 出了数据库的配置,还要配置jpa相关的: 实体类: Dao接口: 定义一个查询的方法,如果是jpa默认就有也可以不写: 测试: 如果报下面的错误,说明jdk9中缺少相关 ...
- 组件上使用v-model
组件上使用v-model <input v-model="searchText"> 等价于 <input v-bind:value="searchTex ...
- idea for mac 快捷键整理
⌘O 查找类文件 ⌘⌥O 前往指定的变量 / 方法 ⌘⇧O 查找所有类型文件.打开文件.打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠/ ⌘⌥← / ⌘⌥→ 退回 / 前进到上一个操作的地方 ...
- 关于 false sharing
问题来源 在多线程操作中,每个线程对操作对象都会有单独的缓存,最后将缓存同步到内存上,不加锁的话会导致数据缺乏同步出现错误,如果只是简单地加锁,性能就会飞速下降 解法 spacing &&am ...
- centos7 安装jdk及mysql8
安装jdk 1.上传压缩包:通过SSH上传jdk压缩包,比如上传至/usr/local/java目录下 2.解压压缩包:利用命令解压压缩包 tar -zxvf jdk-11.0.5_linux-x6 ...
- py 并发编程(线程、进程、协程)
一.操作系统 操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等.操作系统的内核的定义:操 ...