记得去年这个时候,大概刚接触OI。没想到时间这么快,第一次2017NOIP之旅已经结束。初测成绩出来了,100+100+95+50=345,有浙江三十几名(@Cptraser 机房370大佬)。总体感觉还可以吧,也发挥的不错。但有些地方还是有点可惜。学校里的学长(@Cptraser)让我开个博客,我也想谨以此记录一下自己的点滴吧。

  贴的都是比赛时的原码

T1 太搞笑的一题,虽然有很多人因为精度爆60(还好手动整数除)

CODE

#include<cstdio>
using namespace std;
int a,b,c;
int main()
{
freopen("score.in","r",stdin); freopen("score.out","w",stdout);
scanf("%d%d%d",&a,&b,&c);
printf("%d",a/+b*/+c/);
return ;
}

T2 感觉今年PJ前两题今年来算是最水的吧,刚开始想打字符串的,后来仔细一想%%%一下就水了

CODE

#include<cstdio>
#include<algorithm>
using namespace std;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
const int N=;
int n,q,i,j,x,s[N],w;
inline int Pow_10(int k)
{
int tot=;
for (int i=;i<=k;++i)
tot*=;
return tot;
}
int main()
{
freopen("librarian.in","r",stdin); freopen("librarian.out","w",stdout);
read(n); read(q);
for (i=;i<=n;++i)
read(s[i]);
sort(s+,s+n+);
for (i=;i<=q;++i)
{
bool flag=;
read(w); read(x);
for (j=;j<=n;++j)
if (s[j]%Pow_10(w)==x) { printf("%d\n",s[j]); flag=; break; }
if (!flag) puts("-1");
}
return ;
}

T3 从T3开始难度就有提升。BFS很简单;SPFA很简单; 然而我考试时都没想到,对着一个记搜调了2个半小时,导致我T4最后想到了单调队列优化然后没时间了

先贴比赛CODE(158行)

#include<cstdio>
#include<cstring>
using namespace std;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
const int M=,fx[]={,,,-},fy[]={,,-,},INF=1e9;
int map[M][M],n,m,i,j,x,y,z,ans=1e9,f[M][M][],vis[M][M];
inline int min(int a,int b) { return a<b?a:b; }
void dfs(int x,int y)
{
bool flag=;
if (map[x][y]==) flag=;
for (int i=;i<;++i)
{
int xx=fx[i]+x,yy=fy[i]+y;
if (xx>&&xx<=m&&yy>&&yy<=m&&vis[xx][yy])
{
if (map[xx][yy])
{
if (f[xx][yy][]!=INF)
{
if (flag)
{
int add;
if (map[xx][yy]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
if (map[xx][yy]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
} else
{
int add;
if (map[x][y]==map[xx][yy]) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
}
} else
{
vis[xx][yy]=;
dfs(xx,yy);
vis[xx][yy]=;
if (flag)
{
int add;
if (map[xx][yy]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
if (map[xx][yy]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
} else
{
int add;
if (map[x][y]==map[xx][yy]) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
}
}
} else
{
if (f[xx][yy][]!=INF&&f[xx][yy][]!=INF)
{
if (!flag)
{
int add;
if (map[x][y]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
if (map[x][y]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
}
} else
{
if (!flag)
{
vis[xx][yy]=;
dfs(xx,yy);
vis[xx][yy]=;
int add;
if (map[x][y]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
if (map[x][y]==) add=; else add=;
f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
}
}
}
}
}
}
void xz()
{
for (int i=;i<=m;++i)
for (int j=;j<=m;++j)
{
if (map[i][j])
{
for (int k=;k<;++k)
{
int x=fx[k]+i,y=fy[k]+j;
if (x>&&x<=m&&y>&&y<=m)
{
if (map[x][y])
{
int add;
if (map[x][y]==map[i][j]) add=; else add=;
f[i][j][]=min(f[i][j][],f[x][y][]+add);
} else
{
int add;
if (map[i][j]==) add=; else add=;
f[i][j][]=min(f[i][j][],f[x][y][]+add);
if (map[i][j]==) add=; else add=;
f[i][j][]=min(f[i][j][],f[x][y][]+add);
}
}
}
} else
{
for (int k=;k<;++k)
{
int x=fx[k]+i,y=fy[k]+j;
if (x>&&x<=m&&y>&&y<=m)
{
if (map[x][y])
{
int add;
if (map[x][y]==) add=; else add=;
f[i][j][]=min(f[i][j][],f[x][y][]+add+);
if (map[x][y]==) add=; else add=;
f[i][j][]=min(f[i][j][],f[x][y][]+add+);
}
}
}
}
}
}
int main()
{
freopen("chess.in","r",stdin); freopen("chess.out","w",stdout);
memset(map,,sizeof(map));
memset(vis,true,sizeof(vis));
read(m); read(n);
for (i=;i<=m;++i)
for (j=;j<=m;++j)
f[i][j][]=f[i][j][]=f[i][j][]=INF;
f[][][]=;
for (i=;i<=n;++i)
{
read(x); read(y); read(z);
map[x][y]=z+;
}
vis[m][m]=;
dfs(m,m);
xz();
bool flag=;
if (map[m][m]==) flag=;
if (flag) { if (min(f[m][m][],f[m][m][])==INF) puts("-1"); else printf("%d",min(f[m][m][],f[m][m][])); }
else { if (f[m][m][]==INF) puts("-1"); else printf("%d",f[m][m][]); }
return ;
}

上面的dfs其实在搞笑,真正得(骗)了95分的是那个最后10分钟加上去的xz(),%%%%%%

回来后仔细想了想,打了个SPFA,就是建边的过程有点烦

对于每个有颜色的点

距离为1的有颜色的点颜色相同连1条0的边;颜色不同连一条1的边;

距离为2的有颜色的点颜色相同连1条2的边;颜色不同连一条3的边;

最后对于(m,m)有无颜色的问题特判一下就过了,代码量明显减少

CODE

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int fx1[]={,,,-},fy1[]={,,-,},fx2[]={,,-,,-,-,,},fy2[]={-,,,,-,,-,};
const int M=;
int map[M][M],INF,father[M*M+],i,x,y,z,n,m,j,dis[M*M+],q[M*M*+],f[M*M+],head,tail;
vector <int> a[M*M+],l[M*M+];
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
void build(int x,int y)
{
for (int i=;i<;++i)
{
int xx=x+fx1[i],yy=y+fy1[i];
if (map[xx][yy]!=INF&&xx>&&yy>&&xx<=m&&yy<=m)
a[(x-)*m+y].push_back((xx-)*m+yy),l[(x-)*m+y].push_back(map[x][y]!=map[xx][yy]);
}
for (int i=;i<;++i)
{
int xx=x+fx2[i],yy=y+fy2[i];
if (map[xx][yy]!=INF&&xx>&&yy>&&xx<=m&&yy<=m)
a[(x-)*m+y].push_back((xx-)*m+yy),l[(x-)*m+y].push_back(map[x][y]==map[xx][yy]?:);
}
}
int main()
{
freopen("chess.in","r",stdin); freopen("chess.out","w",stdout);
read(m); read(n);
memset(map,,sizeof(map));
memset(dis,,sizeof(dis));
for (i=;i<=n;++i)
{
read(x); read(y); read(z);
map[x][y]=z;
}
INF=map[][];
for (i=;i<=m;++i)
for (j=;j<=m;++j)
if (map[i][j]!=INF) build(i,j);
dis[]=; q[]=; f[]=;
head=; tail=;
while (head<tail)
{
int now=q[++head];
f[now]=;
for (i=;i<a[now].size();++i)
{
int k=a[now][i];
if (dis[k]>dis[now]+l[now][i])
{
dis[k]=dis[now]+l[now][i];
if (!f[k])
{
q[++tail]=k;
f[k]=;
}
}
}
}
if (map[m][m]==INF)
{
if (map[m][m-]!=INF) dis[m*m]=min(dis[m*m],dis[m*m-]+);
if (map[m-][m]!=INF) dis[m*m]=min(dis[m*m],dis[m*m-m]+);
}
if (dis[m*m]==INF) puts("-1"); else printf("%d",dis[m*m]);
return ;
}

T4 谨记机房大佬(@Cptraser)的教诲,NOIP已经很久很久没有考MST了。然而今年,一如既往的没考。

最后一题 看一眼 二分答案,check()

          再一看 二维DP也许能行 20分钟打好

然后优化第三题去了 然后再也没有回来

比赛CODE

#include<cstdio>
#include<cstring>
typedef long long LL;
using namespace std;
inline void read(LL &x)
{
x=; char ch=getchar(); LL flag=;
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
const LL N=;
struct data
{
LL x,w;
}a[N];
LL n,d,k,i,j,ans=-,sum=,f[N];
inline LL max(LL a,LL b) { return a>b?a:b; }
bool check(LL x)
{
LL left=x<d?d-x:,right=d+x;
for (i=;i<=n;++i)
f[i]=-1e9;
for (i=;i<=n;++i)
for (j=;j<i;++j)
if (a[i].x-a[j].x>=left&&a[i].x-a[j].x<=right)
{
f[i]=max(f[i],f[j]+a[i].w);
if (f[i]>=k) return ;
}
return ;
}
int main()
{
freopen("jump.in","r",stdin); freopen("jump.out","w",stdout);
read(n); read(d); read(k);
for (i=;i<=n;++i)
read(a[i].x),read(a[i].w),sum+=a[i].w>?a[i].w:;
if (sum<k) { puts("-1"); return ; }
if (d==)
{
sum=;
for (i=;i<=n;++i)
{
sum+=a[i].w;
if (sum>=k) { puts(""); return ; }
}
}
a[].x=a[].w=;
LL l=,r=a[n].x;
while (l<=r)
{
LL mid=(l+r)>>;
if (check(mid)) ans=mid,r=mid-; else l=mid+;
}
printf("%lld",ans);
return ;
}

那个 d==1 的特判其实是在搞笑

     单调队列的优化还是很好想的

在距离内的加入,距离外的弹出,为了取最大最优值只需要保持队列单调递减即可。

     借鉴了洛谷一名大佬的思路

CODE

#include<cstdio>
#include<cstring>
typedef long long LL;
using namespace std;
inline void read(LL &x)
{
x=; char ch=getchar(); LL flag=;
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
const LL N=;
struct data
{
LL x,w;
}a[N];
struct dl
{
LL x,s;
}q[N*+];
LL n,d,k,i,j,ans=-,sum=,f[N],head,tail,now;
inline LL max(LL a,LL b) { return a>b?a:b; }
bool check(LL x)
{
LL left=x<d?d-x:,right=d+x;
for (i=;i<=n;++i)
f[i]=-1e9;
q[].x=q[].s=; head=; tail=-; now=;
for (i=;i<=n;++i)
{
for (now;(a[now].x<=a[i].x-left)&&(now<i);++now)
{
while (head<=tail&&q[tail].s<f[now]) --tail;
if (f[now]==-1e9) continue;
q[++tail].x=a[now].x; q[tail].s=f[now];
}
while (head<=tail&&a[i].x-q[head].x>right) head++;
if (head<=tail) f[i]=q[head].s+a[i].w;
if (f[i]>=k) return ;
}
return ;
}
int main()
{
freopen("jump.in","r",stdin); freopen("jump.out","w",stdout);
read(n); read(d); read(k);
for (i=;i<=n;++i)
read(a[i].x),read(a[i].w),sum+=a[i].w>?a[i].w:;
if (sum<k) { puts("-1"); return ; }
/*if (d==1)
{
sum=0;
for (i=1;i<=n;++i)
{
sum+=a[i].w;
if (sum>=k) { puts("0"); return 0; }
}
}*/
a[].x=a[].w=;
LL l=,r=a[n].x;
while (l<=r)
{
LL mid=(l+r)>>;
if (check(mid)) ans=mid,r=mid-; else l=mid+;
}
printf("%lld",ans);
return ;
}

  暑假才P->C,代码有点chou

  其实今年的O气真的很足,第三题水了95

  感觉今年总体难度比去年低吧,但浙江的分数线才280(据说)……

  有点小兴奋吧,毕竟一年的付出没有白费

  明年再接再厉,准备下提高吧

  顺便宣传下大佬的博客(@Cptraser)http://www.cnblogs.com/Cptraser/

2017NOIP游记的更多相关文章

  1. 2017NOIP游记 (格式有点炸)

    NOIP游记 作者:一只小蒟蒻 时间可真快呀!还记得我第一次接触信息竞赛时,hello world都要调好久,不知不觉就考完了2017noip,自我感觉良好(虽然还是有很多不足). 这两个月的闭关,让 ...

  2. 2017Noip普及组游记

    Day0 一天都基本在休息,早上信心赛,大家都是400整. 下午一群人窝在教室里打三国杀. Day1:Before Contest 早上大约十点到了试场,在考提高组,不能进. 喝了一杯咖啡去除早起的身 ...

  3. 2017NOIP初赛游记

    前天晚上,玩三国杀,玩到了昨天凌晨2点40多分吧,我觉得初赛要爆炸了, 不得不吐槽一下,三国杀的武将太少了. 昨天是初赛的日子,上午8点多来了后看了看阅读程序和程序填空,复习了以下理论知识和wsj 然 ...

  4. 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记

    先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...

  5. 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记

    先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...

  6. NOIp2016 游记

    DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...

  7. NOIP2016游记

    只是游记而已.流水账. Day0:忘了. Day1:看完T1,本以为T2一如既往很简单,结果看了半天完全没有思路.然后看了一眼T3,期望,NOIP什么时候要考期望了,于是接着看T2.一开始我推的限制条 ...

  8. CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>

    挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...

  9. 游记——noip2016

    2016.11.18 (day 0) 呆在家. 悠闲地呆在家.. 明后天可能出现的错误: 1)没打freopen.打了ctime: 2)对拍程序忘记怎么写了...忘记随机化种子怎么写了: 3)不知道厕 ...

随机推荐

  1. 安卓开发_startActivityForResult的详细用法

    一个需求:一个activity到另一个activity进行一些设置,返回第一个activity的时候 获取第二个activity设置的数据 百度了一下,发现startActivityForResult ...

  2. Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题

    最近在移植网络摄像机里的p2p库到android平台,需要用到jni,最近在c线程了调用java函数的时候 出现一个问题,假如在同一个线程调用java函数是没问题的,但在一个c线程了调用java函数就 ...

  3. (后台)There is already 'jy.controller.jyadmin.JyDealerPackingReturnController' bean method

    项目报了一个错误,百度翻译了一下: “我已经有jy.controller.jyadmin.jydealerpackingreturncontroller豆方法公共org.springframework ...

  4. JavaScript大杂烩18 - Web开发的MVVM模式

    MVC VS. MVP VS. MVVM  了解MVVM模式之前,我们先来简单了解一下从MVC到MVVM的变迁.这个变迁是耦合从紧到松的变迁,是对依赖处理的进化,是应对变化技术的成熟. MVC  MV ...

  5. vs2012碰到生成时报该错误:项目中不存在目标“GatherAllFilesToPublish”

    手头一个vs2010升级到vs2012后,web项目发布到本地目录时项目报错:“该项目中不存在目标“GatherAllFilesToPublish”” 通过谷歌大神的帮助,找到了解决方法.共享之. 原 ...

  6. 遇到npm报错read ECONNRESET怎么办

    遇到npm 像弱智一样报错怎么办 read ECONNRESET This is most likely not a problem with npm itselft 'proxy' config i ...

  7. Linux 设备树的解释 - DTB文件格式【转】

    https://blog.csdn.net/cc289123557/article/details/51782449 1.dtb文件格式 dtb文件的格式如下图 : NOTE:不同部分顺序可能不一样 ...

  8. dell t130服务器安装windowsserver2008R2系统

    dell T130服务器系统是可以安装windowsserver2008R2系统. 总共8个USB端口: 后置USB:2个USB 3.0和4个USB 2.0 前置USB:1个USB 2.0和1个USB ...

  9. centos 上安装phpstorm

    phpstorm在centos上运行依赖JDK,所以先安装JDK环境. 假如是centos自带的openjdk,直接卸载,不支持phpstorm. 下载jdk-7u45-linux-i586.tar. ...

  10. JS中=>,>>>是什么意思

    最近经常看到 JS中=>,符号,于是查了一下别人的博客 =>是es6语法中的arrow function 举例:(x) => x + 6 相当于   function(x){ ret ...