APIO2007:風鈴(Mobiles) 數據備份(Backup) 動物園(Zoo)


這套題比較水..

風鈴->

亂搞即可

形狀最多有三種。


數據備份-> 

DP 60% 網絡流之後亂搞 100%

退流思想。。高端!

神堆。


動物園->

一個人看到的只有5個,狀壓。問題的關鍵是開頭和結尾怎麼處理。

枚舉開頭前四個的選擇方法。然後結尾就好搞了。


第一次WA3個點,,一直沒找到問題啊我艹。

找一下午,f數組賦0 沒 -INF !!!!!

不-INF 沒有的狀態就可能向下轉移,然後就坑了!



風鈴:

#include <cstdio>
#include <algorithm>
#define rep(i,l,r) for (int i=l;i<=r;++i)
#define per(i,r,l) for (int i=r;i>=l;--i)
int getx(){
	char c;int x;bool pd=0;
	for (c=getchar();c!='-'&&(c<'0'||c>'9');c=getchar());
	if (c=='-') pd=true,c=getchar();
	for (x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return pd?-x:x;
}
const int MAX_N=100005;
int ch[MAX_N][2];
int f[MAX_N],r[MAX_N];//1->XX,2->XO,3->QQ
int n;
int que[MAX_N],h=0;
void bfs(){
	que[0]=1;
	rep(i,0,h){
		int v=que[i];
		if (ch[v][0]!=-1) que[++h]=ch[v][0];
		if (ch[v][1]!=-1) que[++h]=ch[v][1];
		}
}
int dep1=-1,dep2=-1;
int dep[MAX_N];
int main(){
	freopen("mobiles.in","r",stdin);
	freopen("mobiles.out","w",stdout);
	n=getx();
	rep(i,1,n){
		ch[i][0]=getx(),
		ch[i][1]=getx();
		if (ch[i][0]!=-1) dep[ch[i][0]]=dep[i]+1;
		if (ch[i][1]!=-1) dep[ch[i][1]]=dep[i]+1;
		if (ch[i][0]==-1||ch[i][1]==-1){
			if (dep1!=-1){
				if (dep1!=dep[i]){
					if (dep2!=-1){
						if (dep2!=dep[i]){printf("-1\n");exit(0);}
						}else dep2=dep[i];
					}
			}else dep1=dep[i];
			}
		}
	bfs();
	if (dep1<dep2) std::swap(dep1,dep2);
	if (dep2!=-1&&dep1-dep2>1){printf("-1\n");exit(0);}
	//printf("   || %d %d\n",dep1,dep2);
	per(i,h,0){
		int v=que[i];
		int lc=ch[v][0],rc=ch[v][1];
		if (lc==-1||rc==-1){
			if (lc==-1&&rc==-1){
				f[v]=0;
				if (dep[v]==dep1) r[v]=1;
				else r[v]=3;
				}else
			if (lc==-1){
				f[v]=f[rc]+1,r[v]=2;
				}else
			if (rc==-1){
				f[v]=f[lc],r[v]=2;
				}
		}else{
			f[v]=f[lc]+f[rc];
			if (r[lc]==1&&r[rc]==1) r[v]=1;
			if (r[lc]==1&&r[rc]==2) r[v]=2;
			if (r[lc]==1&&r[rc]==3) r[v]=2;
			if (r[lc]==2&&r[rc]==1) f[v]++,r[v]=2;
			if (r[lc]==2&&r[rc]==2) {printf("-1\n");exit(0);}
			if (r[lc]==2&&r[rc]==3) r[v]=2;
			if (r[lc]==3&&r[rc]==1) f[v]++,r[v]=2;
			if (r[lc]==3&&r[rc]==2) f[v]++,r[v]=2;
			if (r[lc]==3&&r[rc]==3) r[v]=3;
			}
		//Debug(v);Debug(f[v]);Debug(r[v]);
		//printf("\n");
		}
	printf("%d\n",f[1]);
	//while(1);
}


數據備份:


#include <cstdio>
#include <algorithm>
#define rep(i,l,r) for (int i=l;i<=r;++i)
#define per(i,r,l) for (int i=r;i>=l;--i)
int getx(){
	char c;int x;
	for (c=getchar();c<'0'||c>'9';c=getchar());
	for (x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return x;
}
const int MAX_N=100005;
int dist[MAX_N];
int n,k;
int l[MAX_N],r[MAX_N];
int sa[MAX_N],rank[MAX_N];
int size=0;
void swap(int x,int y){
	std::swap(rank[x],rank[y]);
	std::swap(sa[rank[x]],sa[rank[y]]);
}
void heap_up(int x){
	while ((x>>1)>=1){
		int s=x>>1;
		if (dist[rank[x]]<dist[rank[s]]) swap(x,s);
			else break;
		x=s;
		}
}
void heap_down(int x){
	while ((x<<1)<=size){
		int s=x<<1;
		if (s+1<=size&&dist[rank[s]]>dist[rank[s+1]]) s++;
		if (dist[rank[x]]>dist[rank[s]]) swap(x,s);
			else break;
		x=s;
		}
}
void pop(int x){
	swap(x,size--);
	heap_up(x),heap_down(x);
}
int main(){
	freopen("backup.in","r",stdin);
	freopen("backup.out","w",stdout);
	n=getx(),k=getx();
	rep(i,1,n) dist[i]=getx();
	per(i,n,1) dist[i]-=dist[i-1];
	size=n;
	dist[1]=dist[n+1]=~0U>>2;
	rep(i,1,n) l[i]=i-1,r[i]=i+1;
	rep(i,1,n) rank[i]=sa[i]=i;
	per(i,n,1) heap_down(i);
	int ans=0;
	while (k--){
		int v=rank[1];
		ans+=dist[v];
		int L=l[v],R=r[v];
		pop(sa[L]);pop(sa[v]);
		dist[R]=dist[L]+dist[R]-dist[v];
		l[R]=l[L],r[R]=r[R];r[l[L]]=R;
		heap_up(sa[R]),heap_down(sa[R]);
		}
	printf("%d\n",ans);
	//while(1);
}

動物園:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <bitset>
#define Debug(x) std::cout<<#x<<'='<<x<<' ';
#define BIN(x) std::cout<<std::bitset<5>(x)<<' ';
#define rep(i,l,r) for (int i=l;i<=r;++i)
#define per(i,r,l) for (int i=r;i>=l;--i)
int getx(){
	char c;int x;
	for (c=getchar();c<'0'||c>'9';c=getchar());
	for (x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return x;
}
bool upmax(int &a,const int &b){return a<b?a=b,1:0;}
const int MAX_N=50050;
int n,c;
int e[MAX_N],ln[MAX_N],dn[MAX_N];
int like[MAX_N];
int dislike[MAX_N];

int f[MAX_N][32];
int max[MAX_N];
#define check(i,st) ((st&like[i]) || (~st&dislike[i]))
//bool check(int i,int st){
//	return (st&like[i])>0 || (~st&dislike[i])>0;
//}
int res=0;
void DP(){
	rep(first,0,15){
		memset(max,0,sizeof max);
		memset(f,129,sizeof f);  //就是這個東西!!!
		//rep(i,0,31) f[1][i]=check(1,i),upmax(max[i],f[1][i]);
		rep(i,0,1) f[1][first+(i<<4)]=check(1,first+(i<<4));
		rep(i,2,c){
			if (e[i]-e[i-1]>4){
				rep(j,0,31){
					f[i][j]=max[i-1]+check(i,j);
					upmax(max[i],f[i][j]);
					}
				}else{
				int len=e[i-1]-e[i]+5;
				rep(j,0,31){
					int common=j&((1<<len)-1);
					int p=check(i,j);
					rep(k,0,(1<<5-len)-1)
						upmax(f[i][j],f[i-1][k+(common<<5-len)]+p);
					upmax(max[i],f[i][j]);
					}
				}
			}
		
	//	upmax(res,max[c]);
		int len=e[c]+4-n;
//		if (max[c]==10){
//			Debug(len);
//			rep(i,0,31){
//				Debug(f[c][i]);BIN(i);
//				BIN(first);
//				printf("\n");
//				}
//			}
		if (len<=0){upmax(res,max[c]);continue;}
		rep(i,0,31){
			if ((i>>(5-len))==(first&((1<<len)-1))){
				//if (f[c][i]==184) printf("%d %d %d\n",i,first,len);
				upmax(res,f[c][i]);
				}
			}
		}
	printf("%d\n",res);
}
int main(){
	freopen("zoo.in","r",stdin);
	freopen("zoo.out","w",stdout);
	n=getx(),c=getx();
	rep(i,1,c){
		e[i]=getx(),ln[i]=getx(),dn[i]=getx();
		rep(j,1,ln[i]){
			int t=(getx()-e[i]+n)%n;
			like[i]|=1<<t;
			}
		rep(j,1,dn[i]){
			int t=(getx()-e[i]+n)%n;
			dislike[i]|=1<<t;
			}
		}
	DP();
}




發佈了41 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章