T1

签到题

  1. #include<bits/stdc++.h>
  2. #define R register int
  3. using namespace std;
  4. inline int g() { R x=0,f=1;
  5. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  6. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  7. }
  8. int n,p[101],d[101];
  9. int main() {
  10. n=g(); for(R i=1;i<=n;++i) p[i]=g(),d[i]=g();
  11. for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) {
  12. if(p[i]+d[i]==p[j]&&p[i]==p[j]+d[j]) return puts("= ="),0;
  13. } puts("O O");
  14. }

T2

想一下,发现对应进制Base的奇数幂的位置必须是0。

每一位都可以是 \(0\)~\(K-1\) ,所以我们直接计算每个长度的答案累加就好,注意要特判最高位是否是偶数幂,若是,则要有最高位的限制。

  1. #include<bits/stdc++.h>
  2. #define R register int
  3. #define ll long long
  4. using namespace std;
  5. namespace Luitaryi {
  6. inline ll g() { register ll x=0,f=1;
  7. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  8. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  9. }
  10. ll n,x,k,ans,anss; int mem[20],t;
  11. inline void main() {
  12. x=n=g(),k=g(); while(x) mem[++t]=x%k,x/=k;
  13. ans=1;
  14. for(R i=1;i<t;i+=2) ans+=ans*(k-1); anss=ans;
  15. if(t&1) for(R i=1;i<=mem[t];++i) anss+=ans;
  16. printf("%lld\n",anss);
  17. }
  18. } signed main() {Luitaryi::main(); return 0;}

T3

通过观察(?),发现,只有冗余 \(2*2\) 的格子时,我们无法正确计算能填几个 \(1*3\) 的,于是判掉。。。。。

剩下的直接贪心,排序后取前几个 (显然)

  1. #include<bits/stdc++.h>
  2. #define R register int
  3. using namespace std;
  4. namespace Luitaryi {
  5. inline int g() { R x=0,f=1;
  6. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  7. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  8. } const int N=10010;
  9. int T,n,m,k1,k2,ans,Lim;
  10. int w1[N],w2[N];
  11. inline void main() {
  12. T=g(); while(T--) { ans=0;
  13. n=g(),m=g(),k1=g(),k2=g();
  14. for(R i=1;i<=k1;++i) w1[i]=g();
  15. for(R i=1;i<=k2;++i) w2[i]=g();
  16. sort(w1+1,w1+k1+1,greater<int>());
  17. sort(w2+1,w2+k2+1,greater<int>());
  18. for(R i=1;i<=k1;++i) w1[i]+=w1[i-1];
  19. for(R i=1;i<=k2;++i) w2[i]+=w2[i-1];
  20. if(n%3==2&&m%3==2&&(n==2||m==2)) //冗余2*2的格子,而 2*2 的格子不能用 1*3 的物品去填的
  21. Lim=n*m-4;
  22. else Lim=n*m-n*m%3;
  23. for(R i=0,lim=min(k2,Lim/3);i<=lim;++i)
  24. ans=max(ans,w2[i]+w1[min(k1,(n*m-i*3)/2)]);
  25. printf("%d\n",ans);
  26. }
  27. }
  28. } signed main() {Luitaryi::main(); return 0;}

T4

考试时只会插板,dp预处理不会。

  1. #include<iostream>
  2. #include<cstdio>
  3. #define R register int
  4. #define ll long long
  5. using namespace std;
  6. namespace Luitaryi {
  7. inline ll g() { register ll x=0,f=1;
  8. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  9. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  10. } const int N=100,M=905229641;
  11. int m,ans,Inv[N+1],fac[N+1],f[N*N][N]; ll n;
  12. inline int C(ll n,int m) { R ret=1;
  13. for(R i=1;i<=m;++i) ret=1ll*ret*Inv[i]%M*((n-m+i)%M)%M; return ret;
  14. }
  15. inline void main() {
  16. Inv[0]=Inv[1]=1; for(R i=2;i<=N;++i) Inv[i]=M-1ll*M/i*Inv[M%i]%M;
  17. fac[0]=fac[1]=1; for(R i=2;i<=N;++i) fac[i]=1ll*fac[i-1]*i%M;
  18. n=g(),m=g(); f[0][0]=1; //f[j][i] 和为j,i个 %m 不同余的数
  19. for(R t=0;t<m;++t) for(R j=m*(m-1)/2;j>=t;--j) for(R i=m;i>=1;--i)
  20. f[j][i]=(f[j][i]+f[j-t][i-1])%M;
  21. //枚举填的是什么数(模意义下),枚举填了几个,枚举总和。(01背包)
  22. //之所以要记填了几个,是因为后面插板要用
  23. for(R i=0,lim=min(m*(m-1)/2ll,n);i<=lim;++i) { //枚举可以自由分配的部分
  24. if((n-i)%m) continue; register ll k=(n-i)/m;
  25. for(R j=1;j<=m;++j) ans=(ans+1ll*f[i][j]*C(k+j-1,j-1)%M*fac[j])%M;//插板,注意是有序的
  26. } printf("%d\n",ans);
  27. }
  28. } signed main() {Luitaryi::main(); return 0;}

T5

首先有一个十分 naive 的做法:

  1. #include<bits/stdc++.h>
  2. #define R register int
  3. using namespace std;
  4. namespace Luitaryi {
  5. inline int g() { R x=0,f=1;
  6. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  7. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  8. } int n;
  9. char s[30],c[100010];
  10. inline void ck(int l,int r) {
  11. c[l]=1,c[r]=0;
  12. if(l+1==r) return ;
  13. printf("? %d %d",l+1,r-1);
  14. cout<<endl<<flush;
  15. scanf("%s",s);
  16. if(s[0]=='Y') ck(l+1,r-1);
  17. else {
  18. if(l+3==r) {
  19. c[l]=1,c[l+1]=0,c[l+2]=1,c[l+3]=0; return ;
  20. }
  21. for(R p=l+1;p<r&&l<r;p+=2) {
  22. printf("? %d %d",l,p);
  23. cout<<endl<<flush;
  24. scanf("%s",s);
  25. //flush(stdin);
  26. if(s[0]=='Y') {ck(l,p),ck(p+1,r); return ;}
  27. }
  28. }
  29. }
  30. inline void main() {
  31. n=g();
  32. ck(1,n);
  33. putchar('!');putchar(' ');
  34. for(R i=1;i<=n;++i) putchar(c[i]?'(':')'); cout<<endl<<flush<<endl;
  35. }
  36. } signed main() {Luitaryi::main(); return 0;}

只是充充数

上面的代码含义是递归每个 合法的 区间,我们发现,如果区间是合法的,最左边一定是 '(' ,**最右边一定是 ** ')' 。

于是一个合法区间可能由一个或多个合法子区间组成,于是递归。

递归边界是两个合法括号"()"或四个"()()"

好的显然他询问次数过多

但是注意到,我们在上面没有好好 利用每一次询问得到的信息 ,所以他萎了。

注意一下上次的递归边界,若有两个括号,且合法,那一定是"()",这种是真正有用的信息。

我们怎么利用呢?我们可以一直询问相邻两个,若合法,就把他们去掉,这样包含他们的两个括号就相连了,即我们可以接着尝试扩展合法区间。

具体的,我们可以用一个栈维护这个过程:若栈中为空,当前指针入栈;若栈中的括号与现在指针构成的区间合法,弹栈;否则当前指针入栈;

复杂度\(\mathcal{O}(n)\)

  1. #include<bits/stdc++.h>
  2. #define R register int
  3. using namespace std;
  4. namespace Luitaryi {
  5. inline int g() { R x=0,f=1;
  6. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  7. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
  8. }
  9. int n,stk[100010],top;
  10. char s[30],c[100010];
  11. inline void main() {
  12. n=g(); stk[++top]=1; R p=2;
  13. while(p<=n) {
  14. if(!top) stk[++top]=p,++p;
  15. printf("? %d %d",stk[top],p);
  16. cout<<endl<<flush;
  17. scanf("%s",s); if(s[0]=='Y'){
  18. c[stk[top]]=1,c[p]=0; --top;
  19. } else stk[++top]=p;
  20. //p+=2;
  21. ++p;
  22. } putchar('!');putchar(' ');
  23. for(R i=1;i<=n;++i) putchar(c[i]?'(':')'); cout<<endl<<flush<<endl;
  24. }
  25. } signed main() {Luitaryi::main(); return 0;}

HR#7 题解的更多相关文章

  1. HR# 5题解

    T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...

  2. HR#4 题解

    既然考这么差就来写题啦OTZ T1 猜结论?猜nm! 一直到考试结束都没猜出来=.=我就好奇别人如何猜出来的 我们来说DP(from ZBK) 设\(dp[i][j]\)表示胜or负 那我们来看一下代 ...

  3. JSOI Round 2题解

    强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programme ...

  4. 【AtCoder】AGC023 A-F题解

    可以说是第一场AGC了,做了三道题之后还有30min,杠了一下D题发现杠不出来,三题滚粗了 rating起步1300+,感觉还是很菜... 只有三题水平显然以后还会疯狂--啊(CF的惨痛经历) 改题的 ...

  5. CODEVS——T 3736 【HR】万花丛中2

    http://codevs.cn/problem/3736/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description ...

  6. 3736 【HR】万花丛中2

    3736 [HR]万花丛中2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description HR神犇在成功攻略ZX后,花心 ...

  7. [NOIP补坑计划]NOIP2017 题解&做题心得

    终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...

  8. 题解 P3693 【琪露诺的冰雪小屋】

    知识点: 模拟 , 信仰 原题面 大 型 车 万 众 自 裁 现 场 分析题意: 操作: ICE_BARRAGE R C D S R:行 , C:列, D:方向 , S:强度 在(R,C) 向 D 射 ...

  9. Vulnhub靶场题解

    Vulnhub简介 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行 ...

随机推荐

  1. qt 旧项目编译运行提示 “启动程序失败,路径或者权限错误?” 原因及解决方法

    qt 旧项目编译运行提示 "启动程序失败,路径或者权限错误?" 原因及解决方法 原因 Qt Creator在打开项目文件的同时会生成.pro.user文件,.pro.user文件叫 ...

  2. Python进阶:聊协程

    从一个爬虫说起 Python 2 的时代使用生成器协程,Python 3.7 提供了新的基于 asyncio 和 async / await 的方法.先看一个简单的爬虫代码,爬虫的 scrawl_pa ...

  3. 小贴士--java篇

    1. java:  “.”和“|”都是转义字符,必须得加"\\" 2.java :如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu = ...

  4. Mybatis配置、逆向工程自动生成代码(CRUD案例)

    目的: mybatis简介 搭建mybatis环境 基于SSM逆向工程的使用 Mybatis增删改查案例 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  5. webpack css文件编译、自动添加前缀、剥离

    1.css文件编译 webpack默认只能编译js文件,引入css需要loader支持 // css文件写入js中 npm i style-loader -D // css文件loader npm i ...

  6. intellij idea 中右键项目没有git

    1.没有GIT选项说明还没有关联你的仓库 2.ctrl + alt +s 打开VersionControl添加git仓库 3.添加后再次查看,GIT就出现了 4.可以查看历史版本了. 原文地址:htt ...

  7. PAT-1107 Social Clusters (30 分) 并查集模板

    1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...

  8. 转 C# GDI+ 实现橡皮筋技术

    http://www.cnblogs.com/arxive/p/6080085.html 应该有很多人都在寻找这方面的资料,看看下面我做的,或许对你会有所帮助,但愿如此. 为了实现橡皮筋技术,我用了两 ...

  9. Python windows环境 搭建问题

    环境安装包下载地址: https://pan.baidu.com/s/1bnVhHMZ?fid=642139599707514 百度地址: http://sw.bos.baidu.com/sw-sea ...

  10. cmake用法及常用命令总结(全)

    CMakeLists.txt 的语法比较简单,由命令.注释和空格组成,其中命令是不区分大小写的.指令是大小写无关的,参数和变量是大小写相关的.但推荐全部使用大写指令.符号 # 后面的内容被认为是注释. ...