/*
当一个人先从自己的内心开始奋斗,他就开始迈向了成功
——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. Mac 如何显示隐藏文件夹并设置快捷键

    通过在终端运行命令可以控制隐藏文件是否显示: 输入defaults write com.apple.finder AppleShowAllFiles NO 就不显示, 输入defaults write ...

  2. Trusted Cloud Summit(2018.08.14)

    时间:2018.08.14地点:北京国际会议中心

  3. vue 使用 proxyTable 解决跨域问题

    1.在 main.js 中,在引入 axios: import axios from 'axios' Vue.config.productionTip = false Vue.prototype.$a ...

  4. noi.ac 257 B

    链接 题目 区间[l,r]是连续满足,[l,r]中的数字的权值区间是一段连续的.多次询问可以完包含一个区间的连续区间.区间长度尽量小,如果有多个输出左端点靠左的. 分析: [l,r]区间是连续的,当且 ...

  5. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  6. Page结构

    SQL Server存储数据的基本单元是Page,每一个Page的大小是8KB,数据文件是由Page构成的.在同一个数据库上,每一个Page都有一个唯一的资源标识,标识符由三部分组成:db_id,fi ...

  7. 分布式Redis缓存串讲(一)

    互联网应用的基石 现在流量稍微大些的网站,都会采取Redis.基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋.既然Redis这么重要,我们从 ...

  8. 【ORACLE】oracle11g RAC搭建

    --安装好操作系统(rhel-server-6.7 on vmware) 注意事项: 1.磁盘配置lvm 2.账号密码 root/oracle ---------------------------- ...

  9. 【分享】熟练的Java程序员应该掌握哪些技术?

    Java程序员应该掌握哪些能力才能算是脱离菜鸟达到熟练的程度? 1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任 ...

  10. pandas 初识(三)

    Python Pandas 空值 pandas 判断指定列是否(全部)为NaN(空值) import pandas as pd import numpy as np df = pd.DataFrame ...