/*
当一个人先从自己的内心开始奋斗,他就开始迈向了成功
——genies (朝阳的二愣子)
*/

HGOI寒假赛第一场,欢迎来自各种学校的各式各样的巨老233333

感觉自己好渺小。还是NOIP (pj)的模拟题吧,也有AK的,不过我是下划线开头,所以我来讲咯。

踩了std,(还有xyc大佬踩了标程!他比我快!),感觉还是挺水的。

自己还是要提高(下午讲了数论,相信高一党没怎么听懂23333)

T1 发射站(fsz)

solution:就是单调栈的题目,由于是数据听说比较强然后打了手写栈!结果就不说了吧(n方tm都能过!)

思路挺简单就是第一遍找第一个右侧比他高的,能量给高的(在弹栈的时候),显然需要维护一个h单调不增的栈,每次插入一个元素的时候弹出元素,

并把弹出元素的能量v累加到即将插入的元素i上,然后正反搞2遍,扫一遍ans就出来了!(我是不会告诉你我这道题打了1h10min的!)

code:

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+;
struct rec{
int h,v;
}a[N];
int n,ans[N];
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
struct sta{
int Top; rec s[N];
sta(){Top=;}
bool empty() {return (Top==);}
void push(rec x){s[++Top]=x;}
void pop(){ Top--;}
void clear(){ Top=;};
rec top(){return s[Top];}
}s;
signed main()
{
n=read();
for (int i=;i<=n;i++)
a[i].h=read(),a[i].v=read();
for (int i=;i<=n;i++) {
if (s.empty()) { s.push(a[i]); continue; }
while (!s.empty()&&s.top().h<a[i].h) {
ans[i]+=s.top().v;
s.pop();
}
s.push(a[i]);
}
s.clear();
for (int i=n;i>=;i--) {
if (s.empty()) { s.push(a[i]); continue; }
while (!s.empty()&&s.top().h<a[i].h) {
ans[i]+=s.top().v;
s.pop();
}
s.push(a[i]);
}
int Ans=;
for (int i=;i<=n;i++) Ans=max(Ans,ans[i]);
printf("%lld\n",Ans);
return ;
}

T2  绝对值(abs)

solution:思路也是显然的;需要的时间复杂度是O(T * 4√x )

考虑一个数y合法(每个质因数出现2次)那么有 √y 每个质因数出现1次!

知道这个结论,对于每一个x,我们在线在(下取整)√x左右偏移step个单位,构造出x‘=(√x+step)2然后在可行的情况下

最小化| x'- x |就行,但是需要考虑一个边界问题,什么时候单调,由于√x是下取整,那么√x和√x+1是一对,

如此类推√x-1和√x+2是一对,则有√x-step和√x+step+1是一对,step∈[0,+∞),这样就有单调性!

还有那个筛素数实际上只要筛到4√x 就行了,就是1e5!

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e5+;
bool pr[N];
int last[N];
vector<int>a;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
void getprime(int Lim)
{
memset(pr,true,sizeof(pr));
pr[]=pr[]=false;
for (int i=;i<=Lim;i++) {
if (!pr[i]) continue;
a.push_back(i);
for (int j=i+i;j<=Lim;j+=i)
pr[j]=false;
}
}
bool check(int x)
{
if (x<) return false;
int p=,cnt;
for (;;){
int nowprime=a[p];
if (nowprime>x||p==a.size()-) break;
cnt=;
while (x%nowprime==) cnt++,x/=nowprime;
if (cnt>) return false;
p++;
}
return true;
}
# define SQR(x) ((x)*(x))
int work(int x) {
int base=sqrt(x);
int step=;
while (true) {
bool g1=check(base+step+);
bool g2=check(base-step);
if (g1&&g2) {
if (abs(x-SQR(base+step+))<abs(x-SQR(base-step))) return base+step+;
else return base-step;
}
else if (g1) return base+step+;
else if (g2) return base-step;
step++;
}
}
void write(int x)
{
if (x>) write(x/);
putchar(''+x%);
}
void writeln(int x)
{
write(x); putchar('\n');
}
signed main()
{
getprime(1e5);
int T=read();
while (T--) {
int x=read();
writeln(abs(x-SQR(work(x))));
}
return ;
}

T3  独特的路径(path)

solution:一开始看成状压orz,怎么存不下状态鸭(滑稽),后来发现看错题了。搜索题!

首先需要知道这么一个东西,如果走到这个点(x,y)用掉了c种颜色,然而要走到(n,m)才算成功,

那么之后(从(x,y)走到(n,m))至少还需要用掉 n-(x-1)+m-(y-1)-1=n-x+m-y+1 种颜色

特殊的,从(1,1)走到(n,m)需要经过n+m-1个格子.

发现这一条性质30%的分数就有了,开局特判k和n,m的关系。若(n+m-1>k)输出0

然后搜索剪枝,顺序需要保证左上角矩阵出现过的元素不能在此格子填写,所以左上角必须搜完,采用从左往右,从上到下的形式搜!

剪枝:

  • 可行性:到(x,y)看剩下的颜色够不够即前面用掉c种,那么若(n-x+m-y+1)>k-c那么直接不可以。
  • 对偶性:.在填某一个格子时,如果某些颜色在之前没有使用过,那么他们的情况数都是相同的。(如果之前用过就不一定了!)

不要忘记膜

code:

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e3+;
const int mo=1e9+;
const int BIT=;
int mp[N][N],f[N][N],num[BIT];
int n,m,k;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
# define lowbit(x) ((x)&(-x))
# define bit_place(x) (trunc(log(x+0.5)/log()))
int bit_count(int x)
{
int cc=;
for (int i=x;i;i-=lowbit(i)) cc++;
return cc;
}
int dfs(int x,int y)
{
if (y>m) x=x+,y=;
if (x>n) return ;
f[x][y]=f[x-][y]|f[x][y-];
if (n-x+m-y+>k-bit_count(f[x][y])) return ;
int qwq=-,sum=;
for (int base=(~f[x][y])&((<<k)-);base;base-=lowbit(base)) {
int d=lowbit(base);
int col=bit_place(d)+;
if (mp[x][y]==||mp[x][y]==col) {
int record=f[x][y];
f[x][y]=f[x][y]|d;
num[col]++;
if (num[col]==) {
if (qwq==-) qwq=dfs(x,y+);
sum=(sum+qwq)%mo;
} else sum=(sum+dfs(x,y+))%mo;
num[col]--;
f[x][y]=record;
}
}
return sum%mo;
}
signed main()
{
n=read();m=read();k=read();
if (n+m>k+) { puts(""); return ;}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
mp[i][j]=read(),num[mp[i][j]]++;
memset(f,,sizeof(f));
int tmp=dfs(,);
printf("%lld\n",tmp%mo);
return ;
}

杭高OI20190125 (genies出题)的更多相关文章

  1. HGOI 20190407 Typing Competition Round #1 出题记

    /* ljc20020730出的HGOI20190407的模拟赛. 考试结果比预期难的不少,可能是由于本来计划5h的比赛打了4h吧. 就当普及组模拟赛好了... 难度大概4紫吧(弱省省选难度) 出境 ...

  2. CSS-垂直|水平居中问题的解决方法总结

    题外话:前两天和专业老师探讨最近的一个项目,涉及到对一个浮动的盒子局中的问题,老师的解决方法打开了我的新思路.让我有了总结一下平时的居中问题的想法.不然可能忘掉了以后又要到处寻找解决办法了.另外也给我 ...

  3. 关于“创业者与VC见面的10个不成文细节点”

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Will Wang链接:http://www.zhihu.com/question/19641135/answer/50974 ...

  4. ZJOI 2019 划水记

    作为一个极其蒟蒻的OIer,虽然没有省选资格但还是去见见世面. ZJOI2019一试是在浙江省镇海中学.听名字就很霸气. 学习OI的最后一年,记录下一些事情,即使最终走到最后也一无所获,也是一段美好的 ...

  5. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  6. 写给OIer们的一些话(修订版)

    我是一个高二的OIer,离我正式退役的日子已经不超过一年了.在这个时期,与其写一些回忆性的文字,不如跳出"自我"的范畴,以一种比较全局的角度和大家一起分享一些我对OI的认知和看法. ...

  7. 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”

    按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...

  8. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~

    暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...

  9. 杭电dp题集,附链接还有解题报告!!!!!

    Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...

随机推荐

  1. 欢迎到我的新Blog!

    https://winniechen.cn 里面的页面还不是很好看...争取改一下! 里面的题解大部分也会在这里更新! 谢谢各位捧场!

  2. 20155310 《网络攻防》Exp4 恶意代码分析

    20155310 <网络攻防>Exp4 恶意代码分析 基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些, ...

  3. 20155339 Exp5 MSF基础应用

    20155339 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. 答: exploit是通过自己选择的漏洞和载荷进行攻击的一个过程. pay ...

  4. EZ 2018 04 13 NOIP2018 模拟赛(八)

    这次的题目都是什么鬼? 玄学乱搞+肉眼看CODE+倒着搜索? 好吧是我ZZ了 链接在此 T1 玄学乱搞 由于考场上写的部分分做法忘记讨论n<=2000时的情况,少得了30pts 很容易得到一个基 ...

  5. 汇编 switch case

    知识点: switch case生成的汇编框架 逆向汇编代码还原成C++代码 一.了解switch case结构 .普通情况 |. 83C4 ADD ESP, |. C745 FC >MOV ...

  6. 【LG3768】简单的数学题

    [LG3768]简单的数学题 题面 求 \[ (\sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j))\text{mod}p \] 其中\(n\leq 10^{10},5 ...

  7. how2j 的shiro教程初探

    教程案例里的mysql连接器只支持mysql,不支持mariadb,如果用的不是mysql,创建连接时会报错.

  8. 问题解决:IDEA右键选择new新文件的时候没有JSP文件选项解决

    参考: https://blog.csdn.net/tomorrow_fine/article/details/74090308 用上面的方法就可以解决了, 但是如果把web目录设置成了额外的,那id ...

  9. PowerBI开发 第五篇:关系和交互

    PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...

  10. Markdown 编辑器

    桌面编辑器 MarkdownPad Pro 版注册邮箱: Soar360@live.com 授权密钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGI ...