来发一下写出来的代码…
**
DAY1
**
**
T1
**
这个还写么…不想写了…记录一下上次放哪了…模拟一下就好…
Update 11.15
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[50][50],n,ll,lc;
int main()
{
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
scanf("%d",&n);//ll是上一次的列,lc是上一次的行(lastline;lastc....)
lc=1;ll=n/2+1;
a[lc][ll]=1;
for(int i=2;i<=n*n;i++)
{
if(lc==1&&ll!=n)
{
lc=n;ll=ll+1;
a[lc][ll]=i;
continue;
}
else if(ll==n&&lc!=1)
{
ll=1;
lc--;
a[lc][ll]=i;
continue;
}
else if(lc==1&&ll==n){
lc++;
while(a[lc][ll])lc++;
a[lc][ll]=i;
continue;
}
else{
int nc=lc-1,nl=ll+1;
while(a[nc][nl]&&nc&&nl<=n)nc--,nl++;
if(nc&&nl<=n)
{
a[nc][nl]=i;
lc=nc;ll=nl;
continue;
}
nc=lc+1;nl=ll;
while(a[nc][nl])nc++;
a[nc][nl]=i;
lc=nc;ll=nl;
continue;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
printf("%d%c",a[i][j],j==n?'\n':' ');
return 0;
}
**
T2
**
这真是个悲伤的题目…
我使用的是tarjan…找大于1的最小的强连通分量…(就是这个条件我貌似忘了写…取min的时候因为初始化ans是0所以特判了一下ans==0强制赋值…然而貌似写在了判断强连通分量大于的外面…然后脑补了一下测评时候的的答案就可一致了呢(详情请参见 论2015NOIP的完挂…)….然后就爆零了)
洛谷上有测…但是不知道为什么总是有两个点运行错误了…求大神指正…(我数组都开到100倍大了…貌似不是访问无效内存的样子啊…)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2000000+100;
struct data{int to,next;}e[maxn];
int head[maxn],dfn[maxn],low[maxn],cnt,tim,ans,n,top,q[maxn];
bool inq[maxn];
void ins(int u,int v){cnt++;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt;}
void tarjan(int x)
{
int now=top;
low[x]=dfn[x]=++tim;
inq[x]=1;
q[++top]=x;
for(int i=head[x];i;i=e[i].next)
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if(inq[e[i].to])
low[x]=min(low[x],dfn[e[i].to]);
if(dfn[x]==low[x])
{
if(top-now>1)
{
if(ans==0)ans=top-now;
ans=min(ans,top-now);
}
while(top!=now)
{
inq[q[top]]=0;
top--;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int v;
if(v<0)return 0;
scanf("%d",&v);
ins(i,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
printf("%d",ans);
return 0;
}
**
ADD:(2015-11-09-11:47):貌似是因为tarjan的时候栈溢出了…求告知怎么破…?
T3
**
并不会正解…而且那代码也不想再打一次了…希望RP++多拿点分吧…
**
DAY2
**
**
T1
**
刚开始想用优先队列…但是不知道删左边还是右边的点…于是只能2分了(貌似最大值最小就应该第一时间想一想是不是二分…)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5e4+10;
int dis[maxn],n,m,L;
bool check(int l)
{
int last=0,left=m;
for(int i=1;i<=n;i++)
{
if(dis[i]-dis[last]<l)
{
if(left==0)return false;
left--;
}
else{
last=i;
}
}
if(L-dis[last]<l&&left==0)return false;
return true;
}
int main()
{
scanf("%d%d%d",&L,&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&dis[i]);
int l=0,r=1000000001;
while(l<r)
{
int mid=(l+r)/2+1;
if(check(mid))l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}
To be continue…
——既然选择了远方,便只顾风雨兼程