感觉从15年开始noip就变难了?(虽然自己都做出来了……)

场上预计得分:100+100+60~100+100+100+100=560~600(省一分数线365)

题解:

D1T1 神奇的幻方

题面

水题送温暖~

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,x,y,a[][];
int main(){
scanf("%d",&n);
x=,y=(n+)/;
for(int i=;i<=n*n;i++){
a[x][y]=i;
if(x==&&y==n)x++;
else if(x==)x=n,y++;
else if(y==n)x--,y=;
else if(a[x-][y+])x++;
else x--,y++;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
printf("%d ",a[i][j]);
}
puts("");
}
return ;
}

D1T2 信息传递

题面

题意就是求最小环,可以用tarjan也可以直接用并查集;

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,ans=inf,tmp,a[],fa[],las[];
int ff(int u){
return u==fa[u]?u:fa[u]=ff(fa[u]);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
fa[i]=las[i]=i;
}
for(int i=;i<=n;i++){
int fu=ff(i),fv=ff(a[i]);
if(fu==fv){
tmp=;
for(int v=a[i];v!=i;v=las[v])tmp++;
ans=min(ans,tmp);
}else fa[fu]=fv;
las[fu]=a[i];
}
printf("%d",ans+);
return ;
}

D1T3 斗地主

题面

做了xfz那题就会这题了……场上的话不一定会写,所以期望得分60~100?

题解见这篇博客

D2T1 跳石头

题面

水题送温暖~

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int L,n,m,l,r,ans,d[];
bool chk(int k){
int ret=,nw=;
for(int i=;i<=n;i++){
if(d[i]-d[nw]<k)ret++;
else nw=i;
}
return ret<=m;
}
int main(){
scanf("%d%d%d",&L,&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&d[i]);
}
l=,r=L;
while(l<=r){
int mid=(l+r)/;
if(chk(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
return ;
}

D2T2 子串

题面

好题!深刻体现了我计数dp能力蒻的事实……显然设$f[i][j][k]$表示在$A$中用到第$i$位,在$B$中用到第$j$位,已经分出了$k$个子串的方案数;

如果$A[i]=B[j]$,则可以选择当前位,那么有两种情况:

1.继承上一位的子串,k不变;

2.以$i$为开头新创一个子串,k++;

直接转移不太好搞,那么再设$g[i][j][k]$表示当前必须要新创子串的方案数,和$f$一起转移;

转移方程为$f[i][j][k]=f[i-1][j][k]+g[i][j][k],g[i][j][k]=g[i-1][j-1][k]+f[i-1][j-1][k-1]$

直接dp会爆空间,注意到转移的时候只用到了$i$和$i-1$,用滚动数组优化即可;

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define mod 1000000007
using namespace std;
typedef long long ll;
int n,m,K,t=,f[][][],g[][][];
char a[],b[];
int main(){
scanf("%d%d%d%s%s",&n,&m,&K,a+,b+);
f[][][]=;
for(int i=;i<=n;i++){
t^=;
f[t][][]=;
for(int j=;j<=m;j++){
for(int k=;k<=K;k++){
if(a[i]==b[j]){
g[t][j][k]=(g[t^][j-][k]+f[t^][j-][k-])%mod;
}else g[t][j][k]=;
f[t][j][k]=(f[t^][j][k]+g[t][j][k])%mod;
}
}
}
printf("%d",f[t][m][K]);
return ;
}

D2T3 运输计划

题面

看上去挺难,思路还蛮清晰的?首先显然二分答案,记录下长度大于当前答案k的路径的数量,删掉的那条边肯定在这些路径的并上,所以求出这些路径的并后找到其中最长的那条边,判最长的那条路径减去这条边后能否小于等于k即可。

具体实现可以记录每个点的父边长度,倍增预处理每条路径,用树上差分求出路径的交,时间复杂度是$O((n+m)log\sum t_i)$,正好能过?我loj第一次被卡了一个点大概50ms,加了读入优化就过了……(洛咕依旧秒过)

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,w,next;
}a[];
int n,m,u,v,w,ans,maxn,l,r,num[],fr[],x[],y[],lca[],d[],tot=,head[],dis[],dep[],fa[][];
char buffer[],*hd,*tl;
inline char Getchar(){
if(hd==tl){
int len=fread(buffer,,,stdin);
hd=buffer,tl=hd+len;
if(hd==tl)
return EOF;
}
return *hd++;
}
inline int rd(){
register int x=,f=;
char c;
do{
c=Getchar();
if(c=='-')f=-;
}while(!isdigit(c));
do{
x=(x<<)+(x<<)+(c^);
c=Getchar();
}while(isdigit(c));
return x*f;
}
void add(int u,int v,int w){
a[++tot].v=v;
a[tot].w=w;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int ff,int dpt,int ds){
dep[u]=dpt;
dis[u]=ds;
fa[u][]=ff;
for(int i=;i<=;i++){
fa[u][i]=fa[fa[u][i-]][i-];
}
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=ff){
fr[v]=a[tmp].w;
dfs(v,u,dpt+,ds+a[tmp].w);
}
}
}
int getlca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int l=dep[u]-dep[v];
for(int i=;i>=;i--){
if((<<i)&l){
u=fa[u][i];
}
}
if(u==v)return u;
for(int i=;i>=;i--){
if(fa[u][i]!=fa[v][i]){
u=fa[u][i],v=fa[v][i];
}
}
return fa[u][];
}
void getn(int u,int fa){
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=fa){
getn(v,u);
num[u]+=num[v];
}
}
}
bool chk(int k){
int cnt=,mx=;
for(int i=;i<=n;i++)num[i]=;
for(int i=;i<=m;i++){
if(d[i]>k){
cnt++;
num[x[i]]++;
num[y[i]]++;
num[lca[i]]-=;
}
}
getn(,);
for(int i=;i<=n;i++){
if(num[i]>=cnt)mx=max(mx,fr[i]);
}
return maxn-mx<=k;
}
int main(){
memset(head,-,sizeof(head));
//scanf("%d%d",&n,&m);
n=rd(),m=rd();
for(int i=;i<n;i++){
//scanf("%d%d%d",&u,&v,&w);
u=rd(),v=rd(),w=rd();
add(u,v,w);
add(v,u,w);
}
dfs(,,,);
for(int i=;i<=m;i++){
//scanf("%d%d",&x[i],&y[i]);
x[i]=rd(),y[i]=rd();
lca[i]=getlca(x[i],y[i]);
d[i]=dis[x[i]]+dis[y[i]]-dis[lca[i]]*;
maxn=max(maxn,d[i]);
}
l=,r=maxn;
while(l<=r){
int mid=(l+r)/;
if(chk(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
return ;
}

总结:

1.这次差不多花了四个半小时做完所有题,保持速度的同时要稳,遇到难题还是要仔细思考,分析题目性质,坚信正解并不会很难

2.计数DP(其实是所有DP)水平要加强

3.感觉1314年真的水的厉害……做15年的题明显感觉到了差别,大力切题爽爽

[NOIP补坑计划]NOIP2015 题解&做题心得的更多相关文章

  1. [NOIP补坑计划]NOIP2017 题解&做题心得

    终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...

  2. [NOIP补坑计划]NOIP2012 题解&做题心得

    场上预计得分:100+90+70+100+100+3060=490520(省一分数线245) 题解: D1T1 Vigenère 密码 题面 水题送温暖~~ #include<iostream& ...

  3. [NOIP补坑计划]NOIP2016 题解&做题心得

    感觉16年好难啊QAQ,两天的T2T3是不是都放反了啊…… 场上预计得分:100+80+100+100+65+100=545(省一分数线280) ps:loj没有部分分,部分分见洛咕 题解: D1T1 ...

  4. [NOIP补坑计划]NOIP2013 题解&做题心得

    场上预计得分:100+100+100+100+100+60=560(省一分数线410) 五道傻逼题+一道大搜索题…… 题解: D1T1 转圈游戏 题面 水题送温暖~ #include<algor ...

  5. [NOIP补坑计划]NOIP2014 题解&做题心得

    六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...

  6. [BJOI2016]水晶 做题心得

    [BJOI2016]水晶 做题心得 这是一个写了我两小时的傻逼题.写这个题浪费了一堆时间后,我才意识到我码力又不行了.于是整理起了实现技巧,开始练码力. 思路 不难.首先把 \((x,y,z)\) 变 ...

  7. CF1416D 做题心得

    CF1416D 做题心得 上次在某trick中提到了这个题,一开始觉得太毒瘤没有写,现在把它补上了. 感觉实现这个东西,比单纯收获一个trick,收获的东西多太多了. 主要思路 它的主要trick是& ...

  8. [JSOI2019]节日庆典 做题心得

    [JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...

  9. 2018.我的NOIP补全计划

    code: efzoi.tk @ shleodai noip2011 D1 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...

随机推荐

  1. vue router 配置默认页/404页面

    *号通配404默认页面

  2. js中获取宽高

    <script type="text/javascript"> function getWH() { var a = ""; a += " ...

  3. sw算法求最小割学习

    http://  blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...

  4. Springboot分布式锁实践(redis)

    springboot2本地锁实践一文中提到用Guava Cache实现锁机制,但在集群中就行不通了,所以我们还一般要借助类似Redis.ZooKeeper 之类的中间件实现分布式锁,下面我们将利用自定 ...

  5. Redis,Memcache的区别和具体应用场景

    1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...

  6. Erlang语言入门

    Erlang语言入门 下载Erlang,http://www.erlang.org/downloads 安装之后开始菜单中有Erlang图标,打开之后是Erlang Shell,可以定制喜欢的颜色和字 ...

  7. [Tailwind] Style Elements on hover and focus with Tailwind’s State Variants

    In this lesson, we learn how to target specific states of elements and apply styles only when those ...

  8. JDBC 具体解释(1)

    JDBC 具体解释(1)         在以java application server应用为主的平台是,JDBC的最高级应用是DataSource的实现,其他的JDO,webcache,hibe ...

  9. Windows环境下msysgit安装git flow

    git flow是git的一个扩展集,它基于Vincent Driessen的分支模型,能够用来简化代码的版本号公布流程. 本文讲述怎样为msysgit安装git flow. 下载getopt.exe ...

  10. 利用js在文本框末尾获得焦点

    function moveEnd(obj) { obj.focus(); var len = obj.value.length; if (document.selection) { var sel = ...