杭高OI20190125 (genies出题)
/*
当一个人先从自己的内心开始奋斗,他就开始迈向了成功
——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'2 - 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出题)的更多相关文章
- HGOI 20190407 Typing Competition Round #1 出题记
/* ljc20020730出的HGOI20190407的模拟赛. 考试结果比预期难的不少,可能是由于本来计划5h的比赛打了4h吧. 就当普及组模拟赛好了... 难度大概4紫吧(弱省省选难度) 出境 ...
- CSS-垂直|水平居中问题的解决方法总结
题外话:前两天和专业老师探讨最近的一个项目,涉及到对一个浮动的盒子局中的问题,老师的解决方法打开了我的新思路.让我有了总结一下平时的居中问题的想法.不然可能忘掉了以后又要到处寻找解决办法了.另外也给我 ...
- 关于“创业者与VC见面的10个不成文细节点”
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Will Wang链接:http://www.zhihu.com/question/19641135/answer/50974 ...
- ZJOI 2019 划水记
作为一个极其蒟蒻的OIer,虽然没有省选资格但还是去见见世面. ZJOI2019一试是在浙江省镇海中学.听名字就很霸气. 学习OI的最后一年,记录下一些事情,即使最终走到最后也一无所获,也是一段美好的 ...
- 2017FJ省队集训 游记
2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...
- 写给OIer们的一些话(修订版)
我是一个高二的OIer,离我正式退役的日子已经不超过一年了.在这个时期,与其写一些回忆性的文字,不如跳出"自我"的范畴,以一种比较全局的角度和大家一起分享一些我对OI的认知和看法. ...
- 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”
按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...
- C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~
暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...
- 杭电dp题集,附链接还有解题报告!!!!!
Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...
随机推荐
- 20155217《网络对抗》Exp06 信息搜集与漏洞扫描
20155217<网络对抗>Exp06 信息搜集与漏洞扫描 实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 ...
- 实验八 Web基础
实验八 Web基础 1.安装apache sudo apt-get install apache2 2.启动apache service apache2 start 3.使用 netstat -tup ...
- 基于spring的redisTemplate的缓存工具类
pom.xml文件添加 <!-- config redis data and client jar --><dependency> <groupId>org.spr ...
- ReactJS实用技巧(1):JSX与HTML的那些不同
在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑.不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档. JSX本质上与 ...
- Git的简单操作
一.Git安装 windows下,可在在git官网下载(https://git-scm.com/downloads) 也有360提供的git(http://baoku.360.cn/soft/show ...
- Android 测试之Monkey
一.什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进 ...
- POJ 2431 (优先队列)
题目链接:https://vjudge.net/problem/POJ-2431 思路: “ 在卡车行驶途中, 只有经过加油站才能加油.” 我们不妨转变思路, 理解成“当卡车驶过加油站时就获得了加油的 ...
- 微软职位内部推荐-Senior Program Manager
微软近期Open的职位: Title: Senior Program Manager – Bing Multimedia Relevance Group: Search Technology Cent ...
- linux 操作 mysql 指定端口登录 以及启动 停止
linux 操作 mysql 指定端口登录 mysql -uroot -p -h10.154.0.43 -P3341 1.查看mysql版本方法一:status;方法二:select version( ...
- Linux 第六周实验
姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程控制块PCB——task_st ...