校內模擬 noip2015真題

luoguP2615 神奇的幻方
模擬即可

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

int n,tu[49][49];

void dfs(int x , int y , int now){
	tu[x][y] = now;
	if(now == n * n)return;
	if(x == 1 && y != n)dfs(n , y + 1 , now + 1);
	else if(x != 1 && y == n)dfs(x - 1 , 1 , now + 1);
	else if(x == 1 && y == n)dfs(x + 1 , y , now + 1);
	else if(x != 1 && y != n && tu[x - 1][y + 1] == (-1))dfs(x - 1 , y + 1 , now + 1);
	else if(x != 1 && y != n && tu[x - 1][y + 1] != (-1))dfs(x + 1 , y , now + 1);
	return;
}


int main(){
	memset(tu , -1 , sizeof(tu));
	cin>>n;
	dfs(1, (n + 1) / 2 , 1);
	for(int i = 1 ; i <= n ; i++){
		for(int j = 1 ; j <= n ; j++){
			cout<<tu[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

luoguP2661 信息傳遞
水題
拓撲刪邊找環dfs統計最大環

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

int n,pre[MAXN],in[MAXN],minl,color[MAXN],zz;

void toop(){
	queue<int>q;
	for(int i = 1 ; i <= n ; i++)if(!in[i])q.push(i);
	int now;
	while(!q.empty()){
		now = q.front();q.pop();
		in[pre[now]]--;
		if(!in[pre[now]])q.push(pre[now]);
	}
	return;
}

void dfs(int now , int tp){
	zz++;
	if(color[pre[now]] == tp)return;
	color[now] = tp;
	dfs(pre[now] , tp);
	return;
}

int main(){
	memset(color , -1 , sizeof(color));
	memset(in , 0 , sizeof(in));
	minl = MAXN * 25;
	cin>>n;
	for(int i = 1 ; i <= n ; i++)cin>>pre[i];
	for(int i = 1 ; i <= n ; i++)in[pre[i]]++;
	toop();
	for(int i = 1 ; i <= n ; i++){
		if(in[i] && color[i] == (-1)){
			zz = 0;
			dfs(i , i);
			minl = min(minl , zz);
		}
	}
	cout<<minl<<endl;
	return 0;
}

luoguP2668 鬥地主
水題,直接dfs
注意優化就行了

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

int T,n,pp[37],minl;

void dfs(int now , int rest){
	if(now >= minl)return;
	if(rest == 0){
		minl = min(minl , now);
		return;
	}
	if(now + 1 >= minl)return;
	int hh = 0;
	for(int i = 1 ; i <= 15 ; i++)hh = max(hh , pp[i]);
	for(int i = 1 ; i <= 13 && hh >= 4 ; i++){
		if(pp[i] != 4)continue;
		pp[i] -= 4;
		for(int j = 1 ; j <= 13 ; j++){
			if(pp[j] < 2)continue;
			pp[j] -= 2;
			for(int k = j ; k <= 13 ; k++){
				if(pp[k] < 2)continue;
				pp[k] -= 2;
				dfs(now + 1 , rest - 8);
				pp[k] += 2;
			}
			pp[j] += 2;
		}
		for(int j = 1 ; j <= 15 ; j++){
			if(pp[j] == 0)continue;
			pp[j]--;
			for(int k = 1 ; k <= 15 ; k++){
				if(pp[k] == 0)continue;
				pp[k]--;
				dfs(now + 1 , rest - 6);
				pp[k]++;
			}
			pp[j]++;
		}
		pp[i] += 4;
	}
	for(int i = 1 ; i + 1 <= 12 && hh >= 3 ; i++){
		if(pp[i] >= 3 && pp[i + 1] >= 3){
			for(int j = i + 1 ; pp[j] >= 3 && j <= 12 ; j++){
				for(int k = i ; k <= j ; k++)pp[k] -= 3;
				dfs(now + 1 , rest - (j - i + 1) * 3);
				for(int k = i ; k <= j ; k++)pp[k] += 3;
			}
		}
	}
	for(int i = 1 ; i + 2 <= 12 && hh >= 2 ; i++){
		if(pp[i] >= 2 && pp[i + 1] >= 2 && pp[i + 2] >= 2){
			for(int j = i + 2 ; pp[j] >= 2 && j <= 12 ; j++){
				for(int k = i ; k <= j ; k++)pp[k] -= 2;
				dfs(now + 1 , rest - (j - i + 1) * 2);
				for(int k = i ; k <= j ; k++)pp[k] += 2;
			}
		}
	}
	for(int i = 1 ; i + 4 <= 12 ; i++){
		if(pp[i] && pp[i + 1] && pp[i + 2] && pp[i + 3] && pp[i + 4]){
			for(int j = i + 4 ; pp[j] && j <= 12 ; j++){
				for(int k = i ; k <= j ; k++)pp[k]--;
				dfs(now + 1 , rest - (j - i + 1));
				for(int k = i ; k <= j ; k++)pp[k]++;
			}
		}
	} 
	for(int i = 1 ; i <= 13 && hh >= 3 ; i++){
		if(pp[i] < 3)continue;
		pp[i] -= 3;
		for(int j = 1 ; j <= 13 ; j++){
			if(pp[j] < 2)continue;
			pp[j] -= 2;
			dfs(now + 1 , rest - 5);
			pp[j] += 2;
		}
		for(int j = 1 ; j <= 15 ; j++){
			if(!pp[j])continue;
			pp[j]--;
			dfs(now + 1 , rest - 4);
			pp[j]++;
		}
		pp[i] += 3;
	}
	if(pp[14] && pp[15]){
		pp[14] = pp[15] = 0;
		dfs(now + 1 , rest - 2);
		pp[14] = pp[15] = 1;
	} 
	int ak = 0;
	for(int i = 1 ; i <= 15 ; i++){
		if(pp[i] == 0)continue;
		ak = pp[i];
		pp[i] = 0;
		dfs(now + 1 , rest - ak);
		pp[i] = ak;
		break;
	}
	return;
	
}

int main(){
	cin>>T>>n;
	while(T--){
		minl = 99999999;
		memset(pp , 0 , sizeof(pp));
		for(int i = 1 ; i <= n ; i++){
			int x,y;cin>>x>>y;
			if(x == 1)pp[12]++;
			else if(x == 2)pp[13]++;
			else if(x == 0)pp[13 + y]++;
			else pp[x - 2]++;
		}
		dfs(0 , n);
		cout<<minl<<endl;
	}
	return 0;
}

luoguP2678 跳石頭

水題

#include<bits/stdc++.h>
#define MAXN 50005
typedef long long ll;
using namespace std;
ll L,l,r,mid,best,d[MAXN];
int n,m;

void init(){
	cin>>L>>n>>m;
	for(int i = 1 ; i <= n ; i++)cin>>d[i];	
}

bool check(){
	//ÿ´Î´Ó×ó±ßÍùÓÒ±ßÌø£¬Ê¹µÃ¾àÀëСÓÚmidµÄ»° ¾ÍÒÆ×ß
	ll last = 0 , js = 0;
	for(int i = 1 ; i <= n && js <= m ; i++){
		if(d[i] - last < mid){js++;continue;}
		last = d[i];
	}
	if(js > m)return 0;
	else return 1;
}

void solve(){
	l = 0 , r = L;best = (-1);
	while(l <= r){
		mid = (l + r) >> 1;
		if(check())l = mid + 1 , best = mid;
		else r = mid - 1;
	}
	cout<<best<<endl;
}

int main(){
	init();
	solve();
}

luoguP2679 子串

寫醜了,沒A掉
直接前綴和優化dp就好了
記得滾動數組清零

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

int n,m,p;
ll mod = 1e9 + 7 , f[1505][55][55] , sum[1505][55][55];
char a[1005],b[205];

void init(){
	memset(f , 0 , sizeof(f));
	cin>>n>>m>>p;
	for(int i = 0 ; i <= n ; i++)f[i][0][0] = 1;
	scanf("%s" , a + 1);
	scanf("%s" , b + 1);
}

void solve(){
	for(int i = 1 ; i <= n ; i++){
		for(int j = 1 ; j <= m ; j++){
			for(int k = 1 ; k <= min(min(i , j) , p) ; k++){
				for(int v = 0 ; v < i && v < j && a[i - v] == b[j - v] ; v++){
					if(sum[i - 1][j - 1][k - 1] != 0){
						f[i][j][k] = (sum[i - 1][j - 1][k - 1]) % mod;
						break;
					}
					f[i][j][k] = (f[i][j][k] + f[i - v - 1][j - v - 1][k - 1]) % mod;
				}
				f[i][j][k] = (f[i][j][k] + f[i - 1][j][k]) % mod;
				sum[i][j][k] = (f[i][j][k] + sum[i - 1][j - 1][k]) % mod;
			}
		}
	}
	cout<<f[n][m][p] % mod<<endl;
}

int main(){
	init();
	solve();
}

luoguP2680 運輸計劃
之前打的。。。。。(早知道我就不寫t3直接寫t2了。。。。這樣還有500)

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

int n,m,tot,h[MAXN],w[MAXN],id[MAXN],ik[MAXN],ch[MAXN],dep[MAXN],sz[MAXN],dex,tp[MAXN],f[MAXN];

struct node{
	int from,to,cost,next;
}e[MAXN << 1];

struct node2{
	int color,maxl,lazy,sum;
}t[MAXN * 6];

void add(int x , int y , int z){
	tot++;
	e[tot].from = x;
	e[tot].to = y;
	e[tot].cost = z;
	e[tot].next = h[x];
	h[x] = tot;
}

int dfs(int now , int fa){
	dep[now] = dep[fa] + 1;
	sz[now] = 1;
	f[now] = fa;
	for(int i = h[now] ; i != (-1) ; i = e[i].next){
		if(e[i].to == fa)continue;
		dfs(e[i].to , now);
		sz[now] += sz[e[i].to];
	}
	for(int i = h[now] ; i != (-1) ; i = e[i].next){
		if(e[i].to == fa)continue;
		ch[now] = (sz[ch[now]] < sz[e[i].to] ? e[i].to : ch[now]);
	}
}

int dfs2(int now , int fa){
	dex++;id[now] = dex;ik[dex] = now;
	if(ch[now]){
		tp[ch[now]] = tp[now];
		dfs2(ch[now] , now);
	}
	for(int i = h[now] ; i != (-1) ; i = e[i].next){
		if(e[i].to == fa || e[i].to == ch[now])continue;
		tp[e[i].to] = e[i].to;
		dfs2(e[i].to , now);    
	}
}

int build(int rt , int l ,int r){
	t[rt].lazy = 0;
	t[rt].color = 0;
	if(l == r){
		t[rt].sum = t[rt].maxl = w[l];
		return 0;	
	}
	int mid = (l + r) >> 1;
	build(rt << 1 , l , mid);
	build((rt << 1) | 1 , mid + 1 , r);
	t[rt].maxl = max(t[rt << 1].maxl , t[(rt << 1) | 1].maxl);
	t[rt].sum = t[rt << 1].sum + t[(rt << 1) | 1].sum;
}

int push_down(int rt , int l , int r){
	if(t[rt].lazy == 0)return 0;
	int mid = (l + r) >> 1;
	t[rt << 1].color = t[rt].lazy;
	t[(rt << 1) | 1].color = t[rt].lazy;
	t[rt << 1].lazy = t[rt].lazy;
	t[(rt << 1) | 1].lazy = t[rt].lazy;
	t[rt].lazy = 0;
}

int cc(int rt , int l , int r , int x , int y , int z){
	if(r < x || l > y)return 0;
	if(x <= l && r <= y){
		if(t[rt].color == (z - 1)){
			t[rt].color = z;
			t[rt].lazy = z;	
		}
		return 0;
	}
	push_down(1 , l , r);
	int mid = (l + r) >> 1;
	cc(rt << 1 , l , mid , x , y , z);
	cc((rt << 1) | 1 , mid + 1 , r , x , y , z);
}
//
int csum(int rt , int l , int r , int x , int y){
	if(r < x || l > y)return 0;
	if(x <= l && r <= y){
		return t[rt].sum;
	}
	push_down(1 , l , r);
	int mid = (l + r) >> 1 , zz = 0;
	zz = zz + csum(rt << 1 , l , mid , x , y);
	zz = zz + csum((rt << 1) | 1 , mid + 1 , r , x , y);
	return zz;
}
//
int que(int rt , int l , int r , int x , int y , int z){
	if(r < x || l > y)return 0;
	if(x <= l && r <= y){
		if(t[rt].color == z)return t[rt].maxl;
		return 0;
	}
	push_down(1 , l , r);
	int zz = 0 , mid = (l + r) >> 1;
	zz = max(zz , que(rt << 1 , l , mid , x , y , z));
	zz = max(zz , que((rt << 1) | 1 , mid + 1 , r , x , y , z));
	return zz;
	
}

int add1(int x , int y , int z){
	while(tp[x] != tp[y]){
		if(dep[tp[x]] < dep[tp[y]])swap(x , y);
		cc(1 , 1 , n , id[tp[x]] , id[x] , z);
		x = f[tp[x]];
	}
	if(id[x] > id[y])swap(x , y);
	cc(1 , 1 , n , id[x] + 1 , id[y] , z);
}

int que1(int x , int y , int z){
	int zz = 0;
	while(tp[x] != tp[y]){
		if(dep[tp[x]] < dep[tp[y]])swap(x , y);
		zz = max(zz , que(1 , 1 , n , id[tp[x]] , id[x] , z));
		x = f[tp[x]];
	}
	if(id[x] > id[y])swap(x , y);
	zz = max(zz , que(1 , 1 , n , id[x] + 1 , id[y] , z));
	return zz;
}

int que2(int x , int y){
	int zz = 0;
	while(tp[x] != tp[y]){
		if(dep[tp[x]] < dep[tp[y]])swap(x , y);
		zz += csum(1 , 1 , n , id[tp[x]] , id[x]);
		x = f[tp[x]];
	}
	if(id[x] > id[y])swap(x , y);
	zz += csum(1 , 1 , n , id[x] + 1 , id[y]);
	return zz;
}

void init(){
	memset(h , -1 , sizeof(h));
	tp[1] = 1;
	tot = 0;
	cin>>n>>m;
	for(int i = 1 ; i < n ; i++){
		int x,y,z;cin>>x>>y>>z;
		add(x , y , z);
		add(y , x , z);
	}
	dfs(1 , 1);
	dfs2(1 , 1); 
	for(int i = 1 ; i <= tot ; i++){
		int x = e[i].from;
		int y = e[i].to;
		if(dep[x] < dep[y])swap(x , y);
		w[id[x]] = e[i].cost;
	}
	build(1 , 1 , n);
}

struct node3{
	int u,v,val;
}c[MAXN];

bool cmp(node3 x , node3 y){
	return x.val > y.val;
}

void solve(){
	for(int i = 1 ; i <= m ; i++){
		cin>>c[i].u>>c[i].v;
		c[i].val = que2(c[i].u , c[i].v);
	}
	sort(c + 1 , c + 1 + m , cmp);
	int s1 = c[1].val , minl;
	add1(c[1].u , c[1].v , 1);
	minl = s1 - que1(c[1].u , c[1].v , 1);
	for(int i = 2 ; i <= m ; i++){
		int u,v,k;
		u = c[i].u;
		v = c[i].v;
		add1(u , v , i); 
		k = que1(u , v , i);
		if(k == 0){cout<<max(minl , que2(u , v))<<endl;exit(0);}
		minl = min(minl , max(c[i].val , s1 - k));
	}
	cout<<minl<<endl;
}

int main(){
	//freopen("P2680_2.in" , "r" , stdin);
	init();
	solve();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章