NOIp2017滚粗记

来源:互联网 发布:淘宝文字颜色代码 编辑:程序博客网 时间:2024/05/17 08:34

洛谷测下来100+80+20+100+70+80

其实下限是100+50+10+100+70+80=410

就问标准分低了9.5省选怎么打诶。

不过还好了。第二题,蜜汁错误,对拍根本拍不出来,挂了也是无能为力的事情了。T3开始想到了记忆化搜索,

但后来为了判有0边的,就一直在想如何整点整点地转移,心态都写崩了。最后暴力还挂了,循环队列q=ne[q]写成++q了,大概10分。

真是不该有的失误,但谁叫我太年轻了呢。其实这Day1怎么说也得有个100+100+70的呢,现在好惨。T3思路一错,救不活啦。还写得超长——

我其实不应该在考场上写超过200行的代码的,可是没忍住呃......

Day2心态调整了过来。正常发挥,250。kczno1两天都AK了真是太奆啦。。。。。。%%%

没退役。省选加油! 要到省前50!


附考场代码——(大概T3就这样血崩的...)

math

#include<bits/stdc++.h>
using namespace std;
long long n,m;
int main()
{
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
scanf("%lld%lld",&n,&m);
printf("%lld\n",n*m-n-m);
}


complexity


#include<bits/stdc++.h>
using namespace std;


inline int read()
{
int ret=0; char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}


int l1,l2,r1,r2,gg,uu[205],c[205],a[205],op[105],tot,fl,l,t,m,h,ma,d;
char dd[105],nn[105],k[105],s[105];


int main()
{
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf("%d",&l);
scanf("%s",s+1);
d=strlen(s+1);
if(d==4)m=0;
else 
{
m=0;
   for(int i=5; i<d; ++i)m=m*10+s[i]-48;
}
tot=0; h=0; fl=0; ma=0; gg=0;
memset(a,0,sizeof(a));
for(int i=1; i<=l; ++i)
{
scanf("%s",s);
if(s[0]=='E')
{
if(fl)continue;
if(tot)
{
if(uu[tot])
{
gg=0;
}
h-=op[tot];
a[c[tot]]=0;
--tot;
}
else fl=1;
continue;
}
scanf("%s",k);
scanf("%s",dd);
scanf("%s",nn);
if(fl)continue;
if(a[k[0]-97])
{
fl=1;
continue;
}

++tot;
c[tot]=k[0]-97;
a[k[0]-97]=1;
uu[tot]=0;

if(dd[0]=='n')
{
op[tot]=0;
if(!gg)
if(nn[0]!='n')
{
gg=1;
uu[tot]=1;
}
if(h>ma)ma=h;
continue;
}

if(nn[0]=='n')
{
if(gg)continue;
   op[tot]=1; 
++h;
if(h>ma)ma=h;
continue;
}
if(gg)
{
op[tot]=0;
continue;
}
l1=strlen(dd);
l2=strlen(nn);
r1=0; r2=0;
for(int j=0; j<l1; ++j)r1=r1*10+dd[j]-48;
for(int j=0; j<l2; ++j)r2=r2*10+nn[j]-48;
op[tot]=0;
if(r1>r2)
{
uu[tot]=1;
gg=1;
}
}

if(fl || tot)printf("ERR\n");
else if(ma==m)printf("Yes\n");
else printf("No\n");
}
}


park


#include<bits/stdc++.h>
#define N 100005
#define M 200005
using namespace std;


inline int read()
{
int ret=0; char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}


int ccc[M],T,u_[M],v_[N],w_[N],du[N],de[N],co,ti,dfn[N],low[N],tt,st[N],f[N],qu[N][51],D,qn,n,m,k,p,fl,tot,a[N],c[M][3],dis[N],op[N],faa[N],di[N][51],q[M],ne[M];


namespace wo
{
void solve()
{
int u,v;
memset(faa,0,sizeof(faa));
   memset(dis,0x3f,sizeof(dis));
   memset(op,0,sizeof(op));
   dis[1]=0;
   q[qn=1]=1; op[1]=1;
   for(int i=1; i<=n+100; ++i)ne[i]=i+1; ne[n+101]=1;
   for(int q1=1; q1!=ne[qn]; q1=ne[q1])
   {
    u=q[q1]; op[u]=0;
    for(int o=a[u]; o; o=c[o][1])
    {
    v=c[o][0];
    if(dis[v]>dis[u]+c[o][2])
    {
    dis[v]=dis[u]+c[o][2];
    if(!op[v])
    {
    op[v]=1;
    qn=ne[qn];
    q[qn]=v;
}
}
}
}

memset(op,0,sizeof(op));
q[qn=1]=1; faa[1]=1; op[1]=1;
for(int i=1; i<=n+100; ++i)ne[i]=i+1; ne[n+101]=1;
   for(int q1=1; q1!=ne[qn]; ++q1)
   {
    u=q[q1]; if(u==n)continue;
    op[u]=0;
    for(int o=a[u]; o; o=c[o][1])
    {
    v=c[o][0];
    if(dis[v]==dis[u]+c[o][2])
    {
       faa[v]+=faa[u];
       faa[v]=faa[v]%p;
       if(!op[v])
{
op[v]=1;
qn=ne[qn];
   q[qn]=v;
}
}
}
faa[u]=0;
}
printf("%d\n",faa[n]);
}
}


namespace cyb
{
void df(int p, int s)
{
if(s>k)return;
if(p==D && s)++qu[p][s];
for(int o=a[p]; o; o=c[o][1])
{
if(f[c[o][0]]!=f[p])continue;
if(!c[o][2])return;
df(c[o][0],s+c[o][2]);
}
}

void tarjan(int p)
{
int v;
st[++tt]=p;
dfn[p]=++ti;
low[p]=ti+1;
for(int o=a[p]; o; o=c[o][1])
{
v=c[o][0];
if(dfn[v])low[p]=min(low[p],dfn[v]);
else 
{
tarjan(v);
if(low[v]==dfn[p]) 
{
ccc[o]=1;
}
low[p]=min(low[p],low[v]);
}
}
if(dfn[p]<=low[p])
{
++co;
while(st[tt]!=p)
{
f[st[tt]]=co;
--tt;
}
--tt;
f[p]=co;
}
}

void dff(int p, int d)
{
if(de[p])return;
de[p]=d;
for(int o=a[p]; o; o=c[o][1])
{
dff(c[o][0],d+1);
}
}

void solve()
{
int u,v,uu,ooo,ans;
co=ti=tt=0;
   memset(dis,0x3f,sizeof(dis));
   memset(op,0,sizeof(op));
   memset(ccc,0,sizeof(ccc));
   dis[1]=0;
   q[qn=1]=1; op[1]=1;
   for(int i=1; i<=n+100; ++i)ne[i]=i+1; ne[n+101]=1;
   for(int q1=1; q1!=ne[qn]; q1=ne[q1])
   {
    u=q[q1]; op[u]=0;
    for(int o=a[u]; o; o=c[o][1])
    {
    v=c[o][0];
    if(dis[v]>dis[u]+c[o][2])
    {
    dis[v]=dis[u]+c[o][2];
    if(!op[v])
    {
    op[v]=1;
    qn=ne[qn];
    q[qn]=v;
}
}
}
}

memset(qu,0,sizeof(qu));
for(int i=1; i<=n; ++i)
{
D=i;
df(i,0);
}

memset(de,0,sizeof(de));
dff(1,1);
memset(du,0,sizeof(du));
for(int i=1; i<=m; ++i)if(!ccc[i])
{
if(de[u_[i]] && de[v_[i]])
{
// if(de[u_[i]]>de[v_[i]])continue;
++du[v_[i]];
}
}

memset(di,0,sizeof(di));
di[1][0]=1;
for(int i=1; i<=k; ++i)
{
if(uu=qu[1][i])
{
for(int j=k; j>=i; --j)
{
   di[1][j]+=(long long)di[1][j-i]*uu%p;
   di[1][j]=di[1][j]%p;
}
}
}

q[qn=1]=1;
   for(int q1=1; q1<=qn; ++q1)
   {
    u=q[q1]; 
    for(int o=a[u]; o; o=c[o][1])
    {
    v=c[o][0];
//     if(de[u]>de[v])continue;
    if(ccc[o])continue;
    --du[v];
    ooo=dis[u]+c[o][2]-dis[v];
    for(int i=ooo; i<=k; ++i)
    {
       di[v][i]+=di[u][i-ooo];
       di[v][i]=di[v][i]%p;
}

if(!du[v])
{
q[++qn]=v;
for(int i=1; i<=k; ++i)
       {
       if(uu=qu[v][i])
       {
       for(int j=k; j>=i; --j)
       {
           di[v][j]+=(long long)di[v][j-i]*uu%p;
           di[v][j]=di[v][j]%p;
       }
       }
       }
       }
}
}
ans=0;
for(int i=0; i<=k; ++i)
ans=(ans+di[n][i])%p;
printf("%d\n",ans);
}
}


int main()
{
freopen("park.in","r",stdin);
freopen("park.out","w",stdout);
T=read();
while(T--)
{
   n=read(); m=read(); k=read(); p=read();
   fl=0; tot=0; memset(a,0,sizeof(a)); 
   for(int i=1; i<=m; ++i)
   {
   u_[i]=read(); v_[i]=read(); w_[i]=read();
   c[++tot][0]=v_[i]; c[tot][1]=a[u_[i]]; a[u_[i]]=tot; c[tot][2]=w_[i];
   }
   if(!k)wo::solve();
   else cyb::solve();
}
}


cheese

#include<bits/stdc++.h>
#define eps 1e-6
#define N 1005
#define M 2500005
using namespace std;


inline int read()
{
int ret=0; char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}


int h,r,T,v[N],tot,n,c[M][2],a[N],x[N],y[N],z[N];


inline void add_e(int u, int v)
{
c[++tot][0]=v; c[tot][1]=a[u]; a[u]=tot;
}


unsigned long long g,xx,yy,zz;
double gg;


void dfs(int p)
{
for(int o=a[p]; o; o=c[o][1])
{
if(v[c[o][0]])continue;
v[c[o][0]]=1;
dfs(c[o][0]);
}
}


int main()
{
// cerr<< sqrt( (int ) 6)<<endl;
freopen("cheese.in","r",stdin);
freopen("cheese.out","w",stdout);
T=read();
while(T--)
{
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
tot=0;
n=read(); h=read(); r=read();
for(int i=1; i<=n; ++i)
{
scanf("%d%d%d",x+i,y+i,z+i);
}
for(int i=1; i<=n; ++i)if(z[i]<=r)
{
add_e(0,i);
add_e(i,0);
}
for(int i=1; i<=n; ++i)if(z[i]+r>=h)
{
add_e(n+1,i);
add_e(i,n+1);
}

for(int i=1; i<n; ++i)
for(int j=i+1; j<=n; ++j)
{
if(x[i]>x[j])xx=x[i]-x[j]; else xx=x[j]-x[i];
if(y[i]>y[j])yy=y[i]-y[j]; else yy=y[j]-y[i];
if(z[i]>z[j])zz=z[i]-z[j]; else zz=z[j]-z[i];
g=xx*xx+yy*yy+zz*zz;
gg=sqrt(g);
if(gg<=r+r+eps)
{
add_e(i,j);
add_e(j,i);
}
}

++n;
v[0]=1;
dfs(0);
if(v[n])puts("Yes"); else puts("No");
}
}


treasure


#include<bits/stdc++.h>
#define N 13
#define MO 2333337
#define M 6100000
using namespace std;


inline int read()
{
int ret=0; char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}


int p[N],t,o,g[N],gg[N][N],u,v,w,h[N][N],n,m,mi,tot,c[M][2],q[M];
int tt,fl,qn,I,a[MO+10];
long long cc[M];


inline void ins(int p, int v)
{
int u=p%MO;
for(int o=a[u]; o; o=c[o][1])
{
if(cc[o]==p)
{
if(c[o][0]<v)return;
c[o][0]=v;
return;
}
}
cc[++tot]=p;
c[tot][1]=a[u];
c[tot][0]=v;
a[u]=tot;
q[++qn]=p;
}


inline int que(long long p)
{
int u=p%MO;
for(int o=a[u]; o; o=c[o][1])
{
if(cc[o]==p)
{
return c[o][0];
}
}
}


int main()
{
freopen("treasure.in","r",stdin);
freopen("treasure.out","w",stdout);
n=read(); m=read();
memset(h,0x3f,sizeof(h)); 
mi=1000000000;
for(int i=1; i<=m; ++i)
{
u=read(); v=read(); w=read();
gg[u][v]=1;
gg[v][u]=1;
if(h[u][v]>w)
{
h[u][v]=w;
h[v][u]=w;
}
}
g[1]=1;
for(int i=2; i<=n; ++i)g[i]=g[i-1]*n;
for(I=1; I<=n; ++I)
{
memset(a,0,sizeof(a));
tot=0;
ins(0,0);
q[qn=1]=0;
for(int q1=1; q1<=qn; ++q1)
{
tt=t=q[q1]; o=que(t);
for(int i=n; i; --i)
{
p[i]=tt/g[i];
tt=tt%g[i];
}

fl=1;
for(int i=1; i<=n; ++i)if(i!=I && !p[i])
{
fl=0;
if(gg[I][i])ins(t+g[i],o+h[I][i]);
for(int j=1; j<=n; ++j)if(p[j] && gg[i][j])
ins(t+g[i]*(p[j]+1),o+h[i][j]*(p[j]+1));
}
if(fl)mi=min(mi,o);
if(qn>6000000)break;
}
}
printf("%d\n",mi);
}


phalanx


#include<bits/stdc++.h>
using namespace std;


inline int read()
{
int ret=0; char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}


int n,m,q;


namespace cyb
{
int x[505],y[505];

unsigned che(unsigned u, unsigned v ,int i)
{
if(!i)return (u-1)*m+v;
if(x[i]>u)return che(u, v ,i-1);
if(x[i]==u)
{
if(v==m)
{
if(u==n)return che(x[i],y[i],i-1);
   return che(u+1,v,i-1);
}
if(v>=y[i])return che(u,v+1,i-1);
return che(u,v,i-1);
}
if(v==m)
{
if(u==n)return che(x[i],y[i],i-1);
return che(u+1,v,i-1);
}
return che(u,v,i-1);
}

int main()
{
for(int i=1; i<=q; ++i)
{
x[i]=read(); y[i]=read();
printf("%u\n",che(x[i],y[i],i-1));
}
return 0;
}
}


namespace wqy
{
int u,v,a[610009],g,t[2100005],h,I;

void ins(int p, int l, int r)
{
if(l==r)
{
++t[p];
return;
}
int mid=(l+r)>>1;
if(I<=mid)ins(p<<1,l,mid);
else ins((p<<1)|1,mid+1,r);
t[p]=t[p<<1]+t[(p<<1)|1];
}

void dele(int p, int l, int r)
{
if(l==r)
{
--t[p];
return;
}
int mid=(l+r)>>1;
if(g<=mid)dele(p<<1,l,mid); else dele((p<<1)|1,mid+1,r);
t[p]=t[p<<1]+t[(p<<1)|1];
}

int erfen(int p, int l, int r, int v)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(v>t[p<<1])return erfen((p<<1)|1,mid+1,r,v-t[p<<1]);
return erfen(p<<1,l,mid,v);
}

int main()
{
h=m+q; 
for(int i=1; i<=m; ++i)a[i]=i;
for(I=1; I<=m; ++I)ins(1,1,h);
I=m;
for(int i=1; i<=q; ++i)
{
++I;
u=read(); v=read();
g=erfen(1,1,h,v);
printf("%d\n",a[g]);
a[I]=a[g];
dele(1,1,h);
ins(1,1,h);
}
return 0;
}
}


namespace wo
{
int uu,tt,u,v,g,t[2100005],h,I;
long long b[610009],a[610009];
void ins(int p, int l, int r)
{
if(l==r)
{
++t[p];
return;
}
int mid=(l+r)>>1;
if(I<=mid)ins(p<<1,l,mid);
else ins((p<<1)|1,mid+1,r);
t[p]=t[p<<1]+t[(p<<1)|1];
}

void dele(int p, int l, int r)
{
if(l==r)
{
--t[p];
return;
}
int mid=(l+r)>>1;
if(g<=mid)dele(p<<1,l,mid); else dele((p<<1)|1,mid+1,r);
t[p]=t[p<<1]+t[(p<<1)|1];
}

int erfen(int p, int l, int r, int v)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(v>t[p<<1])return erfen((p<<1)|1,mid+1,r,v-t[p<<1]);
return erfen(p<<1,l,mid,v);
}

int main()
{
h=m+q; tt=n-1; uu=0;
for(int i=1; i<=m; ++i)a[i]=i;
for(int i=1; i<n; ++i)b[i]=(long long)i*m+m;
for(I=1; I<=m; ++I)ins(1,1,h);
I=m;
for(int i=1; i<=q; ++i)
{
++I;
u=read(); v=read();
g=erfen(1,1,h,v);
printf("%lld\n",a[g]);
b[++tt]=a[g];
a[I]=b[++uu];
// ++uu;
dele(1,1,h);
ins(1,1,h);
}
return 0;
}
}




int main()
{
freopen("phalanx.in","r",stdin);
freopen("phalanx.out","w",stdout);
n=read(); m=read(); q=read();
if(q<=500)return cyb::main();
if(n==1)return wqy::main();
return wo::main();
}


原创粉丝点击