NAIPC-2016

A. Fancy Antiques

爆搜+剪枝。

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

typedef pair < int , int > pii ;

#define clr( a , x ) memset ( a , x , sizeof a )

const int MAXN = 105 ;
const int INF = 0x3f3f3f3f ;

struct Node {
	vector < pii > G ;
	int val ;
	bool operator < ( const Node& a ) const {
		return val > a.val ;
	}
} ;

Node a[MAXN] ;
int minv[MAXN][MAXN] ;
int pre[MAXN] ;
int tmp[MAXN][MAXN] ;
int ans ;
int n , m , k ;

void dfs ( int cur , int num ) {
	int val = 0 ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		if ( pre[i] == INF ) {
			val = INF ;
			break ;
		}
		val += pre[i] ;
	}
	if ( val < ans ) ans = val ;
	int tot = 0 ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		if ( pre[i] == INF && minv[cur][i] == INF ) return ;
		tot += min ( pre[i] , minv[cur][i] ) ;
	}
	if ( tot >= ans ) return ;
	if ( num >= k ) return ;
	for ( int i = cur ; i <= m ; ++ i ) {
		for ( int j = 1 ; j <= n ; ++ j ) {
			tmp[num][j] = pre[j] ;
		}
//		vector < pii > tmp ;
//		int c = 0 , v = 0 ;
/*
		for ( int j = 0 ; j < a[i].G.size () ; ++ j ) {
			int x = a[i].G[j].first ;
			tmp.push_back ( pii ( x , pre[x] ) ) ;
			if ( a[i].G[j].second < pre[x] ) {
				if ( pre[x] != INF ) v -= pre[x] ;
				else ++ c ;
				pre[x] = a[i].G[j].second ;
				v += pre[x] ;
			}
		}
*/
		for ( int j = 0 ; j < a[i].G.size () ; ++ j ) {
			int x = a[i].G[j].first ;
			pre[x] = min ( pre[x] , a[i].G[j].second ) ;
		}
		dfs ( i + 1 , num + 1 ) ;
		for ( int j = 1 ; j <= n ; ++ j ) {
			pre[j] = tmp[num][j] ;
			/*
			int x = tmp[j].first ;
			pre[x] = tmp[j].second ;
			*/
		}
	}
}

void solve () {
	ans = INF ;
	for ( int i = 1 ; i <= m ; ++ i ) {
		a[i].G.clear () ;
		a[i].val = 0 ;
	}
	for ( int i = 1 ; i <= n ; ++ i ) {
		int x , p , y , q ;
		scanf ( "%d%d%d%d" , &x , &p , &y , &q ) ;
		a[x].val ++ ;
		a[y].val ++ ;
		if ( p < q ) a[x].val += 2 ;
		else a[y].val += 2 ;
		a[x].G.push_back ( pii ( i , p ) ) ;
		a[y].G.push_back ( pii ( i , q ) ) ;
	}
	sort ( a + 1 , a + m + 1 ) ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		minv[m + 1][i] = INF ;
		pre[i] = INF ;
	}
	for ( int i = m ; i >= 1 ; -- i ) {
		for ( int j = 1 ; j <= n ; ++ j ) {
			minv[i][j] = minv[i + 1][j] ;
		}
		for ( int j = 0 ; j < a[i].G.size () ; ++ j ) {
			int x = a[i].G[j].first , v = a[i].G[j].second ;
			minv[i][x] = min ( minv[i][x] , v ) ;
		}
	}
	dfs ( 1 , 0 ) ;
	printf ( "%d\n" , ans == INF ? -1 : ans ) ;
}

int main () {
	while ( ~scanf ( "%d%d%d" , &n , &m , &k ) ) solve () ;
	return 0 ;
}

  

B. Alternative Bracket Notation

模拟。

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<time.h>
#include<assert.h>
#include<iostream>
using namespace std;
typedef long long LL;
typedef pair<int,int>pi;
const int Maxn=4040;
char s[Maxn];
int len1[Maxn],len2[Maxn],L[Maxn],R[Maxn];
int n;
int sta[Maxn];
int top;
int numlen[Maxn*20];
int main(){
	for(int i=1;i<Maxn*20;i++){
		numlen[i]=numlen[i/10]+1;
	}
	while(scanf("%s",s)!=EOF){
		n=strlen(s);
		for(int i=0;i<n;i++)len1[i]=len2[i]=1;
		while(1){
			top=0;
			int curlen=0;
			for(int i=0;i<n;i++){
				if(s[i]==‘(‘){
					curlen+=len1[i]+len2[i]+2;
					L[i]=curlen;
					sta[top++]=i;
				}
				else{
					R[sta[top-1]]=curlen;
					top--;
				}
			}
			bool flag=1;
			for(int i=0;i<n;i++){
				if(s[i]!=‘(‘)continue;
				if(numlen[L[i]]!=len1[i]||numlen[R[i]]!=len2[i]){flag=0;}
				len1[i]=numlen[L[i]];
				len2[i]=numlen[R[i]];
			}
			if(flag)break;
		}
		for(int i=0;i<n;i++){
			if(s[i]==‘(‘){
				printf("%d,%d:",L[i],R[i]);
			}
		}
		puts("");
	}
	return 0;
}

  

C. Greetings!

$f[i][S]$表示$i$种信封覆盖$S$集合浪费的最少面积,枚举子集转移即可。

时间复杂度$O(k3^n)$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll inf=1e16;
const int N=15;
int n,m,i,j,k,S,a[N],b[N],c[N],A[1<<N],B[1<<N],D[1<<N];
ll C[1<<N],ans,f[16][1<<N],cost[1<<N],tmp;
inline void up(ll&a,ll b){if(a>b)a=b;}
int main(){
  scanf("%d%d",&n,&m);
  for(i=0;i<n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);
  for(S=1;S<1<<n;S++){
    for(i=0;i<n;i++)if(S>>i&1){
      A[S]=max(A[S],a[i]);
      B[S]=max(B[S],b[i]);
      C[S]+=1LL*a[i]*b[i]*c[i];
      D[S]+=c[i];
    }
    cost[S]=1LL*A[S]*B[S]*D[S]-C[S];
  }
  for(i=0;i<=m;i++)for(j=0;j<1<<n;j++)f[i][j]=inf;
  up(f[0][0],0);
  for(i=1;i<=m;i++)for(j=0;j<1<<n;j++){
    tmp=inf;
    for(k=j;k;k=(k-1)&j)if(f[i-1][j-k]<inf){
      up(tmp,f[i-1][j-k]+cost[k]);
    }
    f[i][j]=tmp;
  }
  ans=inf;
  for(i=0;i<=m;i++)up(ans,f[i][(1<<n)-1]);
  printf("%lld",ans);
}

  

D. Programming Team

0/1分数规划,二分比率,然后树形依赖背包DP即可,时间复杂度$O(n^2\log n)$。

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2502;
const double Inf=1e50;
int n,k;
double dp[2520][2520];
int s[Maxn],p[Maxn],id[Maxn];
int pre[Maxn],fin[Maxn];
vector<int>G[Maxn];
int dfs_t;
void dfs(int u){
	pre[u]=++dfs_t;
	id[dfs_t]=u;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		dfs(v);
	}
	fin[u]=dfs_t;
}
double check(double x){
	for(int i=1;i<=n+1;i++){
		for(int j=0;j<=k;j++){
			dp[i][j]=-1e60;
		}
	}
	dp[1][0]=0;
	for(int i=1;i<=n;i++){
		double w=p[id[i]]-s[id[i]]*x;
		for(int j=0;j<=k;j++){
			if(dp[i][j]<-Inf)continue;
			if(j<k){
				dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+w);
			}
			dp[fin[id[i]]+1][j]=max(dp[fin[id[i]]+1][j],dp[i][j]);
		}
	}
	return dp[n+1][k];
}
int main(){
	while(scanf("%d%d",&k,&n)!=EOF){
		for(int i=1;i<=n;i++)pre[i]=0,G[i].clear();
		for(int i=1;i<=n;i++){
			int f;
			scanf("%d%d%d",s+i,p+i,&f);
			G[f].push_back(i);
		}
		dfs_t=0;
		for(int i=1;i<=n;i++){
			if(!pre[i])dfs(i);
		}
		double l=0,r=10200;
		for(int i=0;i<30;i++){
			double mid=(l+r)/2.;
			double tp=check(mid);
			if(tp>0)l=mid;
			else r=mid;
		}
		printf("%.3f\n",r);
	}
}

  

E. K-Inversions

构造多项式$A[i]=s[i]==‘A‘$,$B[n-i]=s[i]==‘B‘$,$C$为$A$和$B$的卷积,则答案就是$C[n+i]$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2200000;
int n,i,j,k;char s[N];
int pos[N];
struct comp{
  double r,i;
  comp(double _r=0,double _i=0){r=_r,i=_i;}
  comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
  comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
  comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
  comp conj(){return comp(r,-i);}
}A[N],B[N];
const double pi=acos(-1.0);
void FFT(comp a[],int n,int t){
  for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
  for(int d=0;(1<<d)<n;d++){
    int m=1<<d,m2=m<<1;
    double o=pi*2/m2*t;comp _w(cos(o),sin(o));
    for(int i=0;i<n;i+=m2){
      comp w(1.0);
      for(int j=0;j<m;j++){
        comp&A=a[i+j+m],&B=a[i+j],t=w*A;
        A=B-t;B=B+t;w=w*_w;
      }
    }
  }
  if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
int main(){
  scanf("%s",s+1);
  n=strlen(s+1);
  for(i=1;i<=n;i++)if(s[i]==‘A‘)A[i].r=1;
  else A[n-i].i=1;
  k=1048576*2;
  j=__builtin_ctz(k)-1;
  for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
  FFT(A,k,1);
  for(i=0;i<k;i++){
    j=(k-i)&(k-1);
    B[i]=(A[i]*A[i]-(A[j]*A[j]).conj())*comp(0,-0.25);
  }
  FFT(B,k,-1);
  for(i=1;i<n;i++)printf("%d\n",(int)(B[i+n].r+0.5));
}

  

F. Mountain Scenes

$f[i][j]$表示前$i$个数,和为$j$的方案数,时间复杂度$O(nwh)$。

#include<cstdio>
const int P=1000000007;
int n,w,h,i,j,k,ans,f[105][10005];
inline void up(int&x,int y){
  x+=y;
  if(x>=P)x-=P;
}
int main(){
  scanf("%d%d%d",&n,&w,&h);
  f[0][0]=1;
  for(i=1;i<=w;i++)
    for(j=0;j<=n;j++)if(f[i-1][j])
      for(k=0;k<=h;k++){
        if(j+k>n)break;
        up(f[i][j+k],f[i-1][j]);
      }
  for(i=0;i<=n;i++)up(ans,f[w][i]);
  for(i=0;i<=h;i++)if(i*w<=n)ans--;
  ans+=P;
  ans%=P;
  printf("%d",ans);
}

  

G. Symmetry

枚举对称中心和对称轴,计算答案即可。时间复杂度$O(n^3)$。

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

typedef long long LL ;
typedef pair < int , int > pii ;
typedef pair < LL , LL > pll ;

#define clr( a , x ) memset ( a , x , sizeof a )

const int MAXN = 1005 ;

map < pii , int > mp1 ;
map < pair < pll , LL > , int > mp2 ;
map < pair < pll , LL > , int > mp3 ;

int x[MAXN] , y[MAXN] , num[MAXN * MAXN] ;
pii pt[MAXN * MAXN] ;
LL dis[MAXN][MAXN] ;
int n , p ;

pair < pll , LL > calc ( int x1 , int x2 , int y1 , int y2 ) {
	if ( x1 == x2 ) {
		LL A = 0 ;
		LL B = 1 ;
		LL C = - ( y1 + y2 ) / 2 ;
		return make_pair ( pii ( A , B ) , C ) ;
	}
	if ( y1 == y2 ) {
		LL A = 1 ;
		LL B = 0 ;
		LL C = - ( x1 + x2 ) / 2 ;
		return make_pair ( pii ( A , B ) , C ) ;
	}
	LL A = y2 - y1 ;
	LL B = x1 - x2 ;
	LL g = 0 ;
	LL C = - B * ( x1 + x2 ) / 2 + A * ( y1 + y2 ) / 2 ;
	swap ( A , B ) ;
	B = -B ;
	g = 0 ;
	if ( A ) {
		if ( A < 0 ) A = -A , B = -B , C = -C ;
	} else {
		if ( B < 0 ) A = -A , B = -B , C = -C ;
	}
	if ( A ) g = g ? __gcd ( g , abs ( A ) ) : abs ( A ) ;
	if ( B ) g = g ? __gcd ( g , abs ( B ) ) : abs ( B ) ;
	if ( C ) g = g ? __gcd ( g , abs ( C ) ) : abs ( C ) ;
	if ( g ) A /= g , B /= g , C /= g ;
	return make_pair ( pll ( A , B ) , C ) ;
}

int get_id ( pair < pll , LL > t ) {
	if ( mp2.count ( t ) ) return mp2[t] ;
	mp2[t] = ++ p ;
	num[p] = 0 ;
	return p ;
}

LL get_dis ( int x , int y ) {
	return 1LL * x * x + 1LL * y * y ;
}

void solve () {
	p = 0 ;
	mp1.clear () ;
	mp2.clear () ;
	for ( int i = 1 ; i <= n ; ++ i ) {
		scanf ( "%d%d" , &x[i] , &y[i] ) ;
	}
	for ( int i = 1 ; i <= n ; ++ i ) {
		for ( int j = 1 ; j <= n ; ++ j ) {
			dis[i][j] = get_dis ( x[i] - x[j] , y[i] - y[j] ) ;
		}
	}
	for ( int i = 1 ; i <= n ; ++ i ) {
		mp1[pii ( x[i] + x[i] , y[i] + y[i] )] ++ ;
		for ( int j = 1 ; j < i ; ++ j ) {
			mp1[pii ( x[i] + x[j] , y[i] + y[j] )] += 2 ;
			int id = get_id ( calc ( x[i] * 2 , x[j] * 2 , y[i] * 2 , y[j] * 2 ) ) ;
			num[id] += 2 ;
			pt[id] = pii ( i , j ) ;
		}
	}
	int ans = MAXN ;
	for ( map < pii , int > :: iterator it = mp1.begin () ; it != mp1.end () ; ++ it ) {
		ans = min ( ans , n - it->second ) ;
	}
	for ( int i = 1 ; i <= p ; ++ i ) {
		int xx = pt[i].first , yy = pt[i].second ;
		int cnt = 0 ;
		for ( int j = 1 ; j <= n ; ++ j ) {
			if ( dis[xx][j] == dis[yy][j] ) ++ cnt ;
		}
		ans = min ( ans , n - cnt - num[i] ) ;
	}
	for ( int i = 1 ; i <= n ; ++ i ) {
		for ( int j = 1 ; j <= n ; ++ j ) if ( i != j ) {
			LL A = y[j] - y[i] ;
			LL B = x[i] - x[j] ;
			LL C = x[j] * y[i] - x[i] * y[j] ;
			int cnt = 0 ;
			for ( int k = 1 ; k <= n ; ++ k ) {
				if ( A * x[k] + B * y[k] + C == 0 ) ++ cnt ;
			}
			ans = min ( ans , n - cnt ) ;
		}
	}
	printf ( "%d\n" , ans ) ;
}

int main () {
	while ( ~scanf ( "%d" , &n ) ) solve () ;
	return 0 ;
}

  

H. Jewel Thief

留坑。

I. Tourists

暴力计算即可。时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=220000;
int n,i,j,x,y,g[N],v[N<<1],nxt[N<<1],ed;long long ans;
int size[N],f[N],d[N],son[N],top[N];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x){
  size[x]=1;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){
    f[v[i]]=x,d[v[i]]=d[x]+1;
    dfs(v[i]),size[x]+=size[v[i]];
    if(size[v[i]]>size[son[x]])son[x]=v[i];
  }
}
void dfs2(int x,int y){
  top[x]=y;
  if(son[x])dfs2(son[x],y);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);
}
inline int lca(int x,int y){
  for(;top[x]!=top[y];x=f[top[x]])if(d[top[x]]<d[top[y]])swap(x,y);
  return d[x]<d[y]?d[x]:d[y];
}
int main(){
  scanf("%d",&n);
  for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
  dfs(1);
  dfs2(1,1);
  for(i=1;i<=n;i++)for(j=i+i;j<=n;j+=i){
    ans+=d[i]+d[j]-2*lca(i,j)+1;
  }
  printf("%lld",ans);
}

  

J. Whiteboard

首先用set倒着处理出每个点最后一次被经过的时间,对于每个点计算答案区间,然后求交即可。

时间复杂度$O(n^2\log n)$。

#include<bits/stdc++.h>
using namespace std;
const int Maxn=1000020;
typedef long long LL;
char s[1000200];
int n,m,q;
int debug;
set<int>sx[Maxn],sy[Maxn];
int d[Maxn],op[Maxn];
int di[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int getop(char* ss){
	if(ss[0]==‘u‘)return 0;
	if(ss[0]==‘r‘)return 1;
	if(ss[0]==‘d‘)return 2;
	if(ss[0]==‘l‘)return 3;
	return -1;
}
LL L,R;
char ask(int wh,int ty,int loc){
	if(!ty)swap(loc,wh);
	return s[wh*m+loc];
}
void solve(set<int>&S,int st,int ed,LL tl,int wh,int ty){
	int l=st,r=ed;
	if(l>r)swap(l,r);
	set<int>::iterator it=S.lower_bound(l);
	for(;it!=S.end()&&((*it)<=r);){
		char c=ask(wh,ty,*it);
		if(ty==0){
			sx[*it].erase(sx[*it].lower_bound(wh));
		}
		else{
			sy[*it].erase(sy[*it].lower_bound(wh));
		}
		//if(debug)printf("wh=%d ty=%d loc=%d c=%c\n",wh,ty,*it,c);
		if(c==‘#‘)L=max(L,tl-abs((*it)-st));
		else R=min(R,tl-abs((*it)-st)-1);
		S.erase(it++);
	}
}
int main(){
	while(scanf("%d%d%d",&n,&m,&q)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%s",s+(i*m));
		}
		//printf("%s\n",s);
		//printf("%c\n",s[35]);
		for(int i=0;i<n;i++){
			sx[i].clear();
			for(int j=0;j<m;j++)sx[i].insert(j);
		}
		for(int i=0;i<m;i++){
			sy[i].clear();
			for(int j=0;j<n;j++)sy[i].insert(j);
		}
		for(int i=0;i<q;i++){
			char tmp[10];
			scanf("%s%d",tmp,d+i);
			op[i]=getop(tmp);
		}
		int curx=n-1,cury=0;
		LL tl=1;
		for(int i=0;i<q;i++){
			curx+=di[op[i]][0]*d[i];
			cury+=di[op[i]][1]*d[i];
			tl+=d[i];
		}
		L=0,R=tl;
		//printf("curx=%d cury=%d tl=%lld\n",curx,cury,tl);
		for(int i=q-1;i>=0;i--){
			int top=(op[i]+2)%4;
			if(i==1)debug=1;else debug=0;
			int nx=curx+di[top][0]*d[i],ny=cury+di[top][1]*d[i];
			//printf("ny=%d\n",ny);
			if(top==0||top==2)solve(sy[ny],curx,nx,tl,ny,0);
			else solve(sx[nx],cury,ny,tl,nx,1);
			tl-=d[i];
			curx=nx;
			cury=ny;
			//printf("i=%d L=%lld R=%lld\n",i,L,R);
		}
		for(int i=0;i<n&&L<=R;i++){
			for(set<int>::iterator it=sx[i].begin();it!=sx[i].end();it++){
				if(ask(i,1,*it)==‘#‘){
					L=R+1;
					break;
				}
			}
		}
		if(L>R)puts("-1 -1");
		else printf("%lld %lld\n",L,R);
	}
}

  

K. YATP

树分治,然后求出凸壳询问最值即可。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll inf=1e16;
const int N=200010;
inline void up(ll&a,ll b){if(a>b)a=b;}
int n,i,x,y,z,a[N],g[N],v[N<<1],w[N<<1],nxt[N<<1],ok[N<<1],ed;
ll ans[N],fin,d[N];
int f[N],son[N],all,now;
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;ok[ed]=1;nxt[ed]=g[x];g[x]=ed;}
struct P{ll k,b;P(){}P(ll _x,ll _y){k=_x,b=_y;}}A[N],q[N];
int B[N],m;
inline double pos(const P&a,const P&b){return ((double)(b.b-a.b))/((double)(a.k-b.k));}
inline bool cmpA(const P&a,const P&b){
  if(a.k==b.k)return a.b<b.b;
  return a.k>b.k;
}
inline bool cmpB(int x,int y){return a[x]<a[y];}
void findroot(int x,int y){
  son[x]=1;f[x]=0;
  for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){
    findroot(v[i],x);
    son[x]+=son[v[i]];
    if(son[v[i]]>f[x])f[x]=son[v[i]];
  }
  if(all-son[x]>f[x])f[x]=all-son[x];
  if(f[x]<f[now])now=x;
}
void dfs(int x,int y,ll z){
  m++;
  d[x]=z;
  A[m]=P(a[x],z);
  B[m]=x;
  for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y)dfs(v[i],x,z+w[i]);
}
inline ll cal(int x,int y){
  return q[y].k*a[x]+d[x]+q[y].b;
}
void solve(int x){
  int i,h=1,t;
  m=0;
  dfs(x,0,0);
  sort(A+1,A+m+1,cmpA);
  sort(B+1,B+m+1,cmpB);
  q[t=1]=A[1];
  for(i=2;i<=m;i++)if(A[i].k!=A[i-1].k){
    while(t>1&&pos(q[t-1],q[t])>pos(q[t],A[i]))t--;
    q[++t]=A[i];
  }
  for(i=1;i<=m;i++){
    while(h<t&&cal(B[i],h)>cal(B[i],h+1))h++;
    ans[B[i]]=min(ans[B[i]],cal(B[i],h));
  }
  for(i=g[x];i;i=nxt[i])if(ok[i]){
    ok[i^1]=0;
    f[0]=all=son[v[i]];
    findroot(v[i],now=0);
    solve(now);
  }
}
int main(){
  scanf("%d",&n);
  for(i=1;i<=n;i++)scanf("%d",&a[i]);
  for(ed=i=1;i<n;i++)scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
  for(i=1;i<=n;i++)ans[i]=inf;
  f[0]=all=n;
  findroot(1,now=0);
  solve(now);
  for(i=1;i<=n;i++)fin+=ans[i];
  printf("%lld",fin);
}

  



总结:

  • G题poursoul打错样例却不检查样例,盲目调试,下次要注意。
时间: 2024-11-08 21:24:37

NAIPC-2016的相关文章

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R

爱奇艺、优酷、腾讯视频竞品分析报告2016(一)

1 背景 1.1 行业背景 1.1.1 移动端网民规模过半,使用时长份额超PC端 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>,报告显示,网民的上网设备正在向手机端集中,手机成为拉动网民规模增长的主要因素.截至2015年12月,我国手机网民规模达6.20亿,有90.1%的网民通过手机上网. 图 1  2013Q1~2015Q3在线视频移动端和PC端有效使用时长份额对比 根据艾瑞网民行为监测系统iUserTracker及mUserTrac

China Operating System 电脑操作系统 2016全球互联网排名

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 电脑操作系统 China Operating System 2016全球互联网排名 ========

在vSphere环境下简单测试Windows 2016 S2D (1)

伴随这两年SDDC(软件定义的数据中心)越来越热,作为其中重要的建设区块的软件定义存储(SDS)也越来越多地被各行业,各类规模的数据中心所使用.作为SDS厂商之一的微软,面对这块蛋糕当然不甘人后,从Windows Server 2012开始,微软隆重推出了他的SDS解决方案--Storage Space.该版本还是需要建立在共享磁盘柜(JBOD)的基础上,和其他主流SDS厂商一样,其目的是通过将JBOD里各类磁盘加入到一个或多个存储池,再从存储池里划分存储空间(Storage Space)给单台

2016年度总结

2016年度总结 四季交替,冬去春来,不知不觉间,2016年又过去了.2016年是平静的一年,也是充满故事的一年. 16年6月之前,我的生活和15年一样,在保税区机房昼夜交替值班.身体依然上火严重,睡眠和饮食质量依然不佳.上班处理服务器硬件故障.搜集服务器故障日志.巡检.上下架服务器.拉网线光纤线.登记更新各种表格信息.下班睡觉.爬山.跑步.做仰卧起坐.每个月的生活几乎一样,唯一在变的是一去不复返的时光.      16年6月 ,我调岗了.由原来的机房值班岗位,调岗到公司总部开始了周一到周五每天

我的2016,我的盲路

转眼2016已经过去明天就是除夕了,坐在家里的火炕上看完正在追的剧半夜倾城,觉得心里一阵空虚明天我就23了,人能生有多少个23呢,回忆着过去的一年突然想写这篇文章总结一下过去的自己. 记得2016年刚开学的时候,我给自己定下了三个目标,第一,一定要拿下驾照,第二,大学英语怎么也得过四级的,第三就是希望可以拿下软考的中级,如今这三个目标我完成了俩唯一的遗憾就是软考没有过,我的大学是一个民办的三本,自从上大学以后我就觉得特别的丢人家里是东北的别人一问你是哪个学校的我就感觉内心极度的自卑,好在学了个我

2016年12月25 至 2018年12月25,致未来

未来总是充满遐想,两年的时间给自己一个成长,多的是努力,今天又是一年圣诞,孤独感爆棚,这是必经之路吧:成功的路上总是充满孤独与落寞,看了一篇文章,这世界程序猿分为三等,天才型,理想型,庸才型:我想我要做第四种--勤奋型:给自己加油!两年很短,多一点努力吧! 2016/12/25  圣诞  合肥   雨 随感

2016年 CSS 库、框架和工具新生榜 TOP 50

看看 CSS 在过去几年的巨大变化和快速发展,你就不会对它今年的开源工具大产量感到惊讶了.这些 CSS 库.框架和工具的建立不仅给我们提供了学习的视角,更给我们的工作与生活带来了便利. 本文精选了 50 款 2016 年发布的 CSS 库.框架和工具供大家享用,希望它们对您有所帮助. 分类快速预览:CSS 库,CSS Spinners,CSS 图像特效,CSS 实用程序,设计指南工具,响应式邮件与通讯列表框架,Flexbox 布局工具和框架,CSS 布局框架和 material design 框

【我拼搏的2016】-Python进行时

作为一名在IT圈混迹多年的老兵(虽说现在技术有了很多天翻地覆的变化),但不会编程,一直是我混迹IT圈的一个痛点,从C.C++.一直到PHP,也曾经翻过很多入门书籍,也曾经非常渴望体验一下程序员们经常提到的那种成就感,但由于经常被算法和复杂的模块搞的晕头转向,加上工作上用的不多,所以一直没有能够真正掌握到一门编程语言. 直到我了解到了Python,简洁的语法,强大的内置模块,再次唤醒了我心中开发的梦,后来又了解到Python语言开发了alphago,使我想掌握该语言的欲望再度增加,经过选择,于20