/*
当一个人先从自己的内心开始奋斗,他就开始迈向了成功
——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. 处女男学Android(七)---Android 应用资源之StateListDrawable

    前言 本篇Blog将记录关于Android应用资源中最经常使用的一个Drawable资源--StateListDrawable,本来说应当继续写UI方面的内容,突然跳到应用资源这边,主要是由于之前写界 ...

  2. SAP调用RestfulApi接口接收数据

    因为准备要做一个关于调用外部接口的需求,所以自己先练习一下. 程序说明:我已经在.net开发的系统里提供一个api接口,现在在sap访问这个接口,来接收数据. 这里涉及Restful Api知识,以后 ...

  3. 20155218《网络对抗》Exp3 免杀原理与实践

    20155218<网络对抗>Exp3 免杀原理与实践 一.使用msf生成后门程序的检测 (1)将上周msf生成的后门文件放在virscan.org中进行扫描,截图如下: (2)使用msf时 ...

  4. 20155223 Exp6 信息收集与漏洞扫描

    20155223 Exp6 信息收集与漏洞扫描 本次实验以熟悉信息收集手段与漏洞扫描手段为主. 实践步骤 whois域名查找 在虚拟机Kali的终端输入命令:whois baidu.com,查询百度的 ...

  5. 2017-2018-2 20155224『网络对抗技术』Exp7:网络欺诈防范

    基础问题回答 问:通常在什么场景下容易受到DNS spoof攻击? 同一局域网下,以及各种公共网络. 问:在日常生活工作中如何防范以上两攻击方法? 答:DNS欺骗攻击是很难防御的,因为这种攻击大多数本 ...

  6. UWP-开发一个具有闹钟,天气预报,翻译,语音功能的Demo

    UWP即Windows 10中的Universal Windows Platform简称.即Windows通用应用平台,在Windows 10 Mobile/Surface(Windows平板电脑)/ ...

  7. 真机调试傻瓜图文教程(Xcode6.4)

    先准备好99刀,真机调试才带你玩. PS:万能宝十来块钱可以买个资格... Developer Apple上的设置 1.打开https://developer.apple.com/,点击Member ...

  8. pie的绕过方式

    目标程序下载 提取码:qk1y 1.检查程序开启了哪些安全保护机制 pie机制简介 PIE(position-independent executable) 是一个针对代码段.text, 数据段.*d ...

  9. "软件"和"软件工程"一词最早被谁提出?

    1."softwar”:1953年Richard R.Carhart在备忘录中使用software一词2.软件工程 1968 年北大西洋公约组织在前联邦德国开会提出的 1968年秋季,NAT ...

  10. 注解Annotation实现原理与自定义注解例子

    什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metada ...