2018.07.12【2018提高组】模拟C组

8 篇文章 0 订阅
4 篇文章 0 订阅

7.11B组失利(其实是自己辣鸡)然后乖乖滚回C组。。。
历史总是出奇的相似,又水了40分暴力。。。
这套题的背景挺好玩(黑暗)的
0 【NOIP2015模拟10.28B组】序章-弗兰德的秘密

背景介绍
弗兰德,我不知道这个地方对我意味着什么。这里是一切开始的地方。3年前,还是个什么都没见过的少年,来到弗兰德的树下,走进了封闭的密室,扭动的封尘已久机关,在石板上知道了这个世界最角落的最阴暗的东西。那种事情,从未忘怀,从未动摇,我还记得,那一天,我,里修,第一次拔起了剑……

弗兰德的密室里,机关上方画着两棵树的字样,机关下方是一个有数字的刻度……
弗兰德最高的两棵树,只要知道两棵树的共同的相似度就行了……
给定两棵有根树,可以任意删除两棵树上的节点(删除一棵节点必须保证该节点的子树内的所有节点也必须要被删除,换一种说法,删除后的树必须联通并形成一棵树,且根节点不能被删除),使得删除后的两棵树同构,这两棵树有一个共同大小,即树的size,最大化同构的树的size即为机关的答案……

注:两棵同构的树要满足以下条件:
1、两棵树节点个数相等。
2、两棵树的以根节点的儿子为根子树对应同构。如下图,为两棵同构的有根树。

正解:树形DP(相当于暴力)
深度相同的两个,对于它们的儿子暴力枚举匹配,找出值最大的匹配方案,赋值给这两个点


1 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语

【背景介绍】
“魔法???算了吧,这种东西我肯定学不了的啦!”明明是个剑士,却被眼前这位洋洋自得的精灵使——弗洛莉拖出去学魔法,真是个没事找茬的家伙……
“没事啦。作为一名冒险者会发生很多情况,中毒啦,受伤啦,被咒语束缚之类的,没有魔法就很难办的呀!”她到是好像一副什么都懂的样子,真是令人火大。
“都说我是个人类了,魔法这种东西学起来很困难的吧!”我只好找个看似靠谱的借口。
然而,她那不屈不挠的声音又响了起来:“人类虽然与自然的共鸣,也就是魔法的连接较少,但如果认真训练的话还是可以做到的呢!总之,试试看吧!念念咒语之类的!”弗洛莉把魔法书一把拍在了我面前。
我没兴趣地瞟了一眼,“哼。这种东西我不看也会,伦福萨——密西卡!”才刚刚念完不知道从哪里偷学来的魔法咒语。随即,便听到弗洛莉的一声尖叫,使得整个酒店的人的视线都往这边看来。喂喂喂,别往我这边看啊,我有视线恐惧症啊!!!!况且,我只是把她正在吃的面包的样子变成虫子而已,谁会料到这种情况啊啊啊!!
“真是的,弗洛莉才是老拖我的后腿呢!”我没好气地笑道……
“里修!你……”她从牙缝里挤出了一个字。我顿感不妙,见到了那张比魔鬼还可怕的扭曲的面孔。“真是个魔法的天才哪!”她一扫之前不愉快的表情,想我露出大拇指,好像是在夸奖我的样子。
咦?她竟然没有打我,那真是我福大命大。我这样想着,便一屁股坐在了凳子上,松了口气……
【题目描述】
“伦福萨”【即" ( “】和“密西卡”【即” ) “】是两种不同的精灵咒语,已知一个成功的咒语符合如下的规定:
每一个密西卡之前都可以对应匹配到一个伦福萨,即为一个合法的精灵魔法咒语。
方便的是,我们将“伦福萨”视为” ( “,“密西卡”视为” ) “,合法的精灵魔法咒语即为一个合法的括号序列。
如:” ( ( ( ) ) ) “” ( ( ) ( ) ) “” ( ) ( ) ( ) “均为合法的魔法咒语,” ) ( “” ( ) ) ( “” ( ( “均为不合法的魔法咒语。
现在弗洛莉给我一个长长的“伦福萨”【即” ( “】和“密西卡”【即” ) “】的片段,每次给我一个l和r,让我判断需要在这个片段前最少添多少个“伦福萨”【即” ( “】,以及最少添多少个“密西卡”【即” ) “】可以成为一个合法的魔法咒语,更令人不爽的是,弗洛莉有的时候还会把一个“伦福萨”【即” ( “】变成“密西卡”【即” ) “】,或把一个“密西卡”【即” ) “】变为“伦福萨”【即” ( "】。

正解:线段树
记录每个区间左边需要的左括号数量,和右边需要的右括号数量
合并两个区间的具体操作:
左边需要的左括号数量=左儿子需要的左括号数量+max(右儿子需要的左括号数量-左儿子需要的右括号数量,0)
右边需要的右括号数量=右儿子需要的右括号数量+max(左儿子需要的右括号数量-右儿子需要的左括号数量,0)

在修改单点时将单点的值修改,然后向上更新(重新合并左右儿子)直到树根

查询时将分开在两边的值合并,用的是上面提到的合并操作
%%%%%%%%orzorzorzorzorzorzorzorzhsw女神

#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

struct node{
	int l,r,nl,nr,s,e,fa;
}t[600005];
int n,m,cnt,o,p,h;
char c[150005];

void build(int st,int ed,int f){
	t[++cnt].s=st;
	t[cnt].e=ed;
	t[cnt].fa=f;
	int cc=cnt;
	if (st!=ed){
		build(st,(st+ed)/2,cc);
		build((st+ed)/2+1,ed,cc);
		t[cc].nl=t[t[cc].l].nl+max(t[t[cc].r].nl-t[t[cc].l].nr,0);
		t[cc].nr=t[t[cc].r].nr+max(t[t[cc].l].nr-t[t[cc].r].nl,0);
	}
	else{
		if (c[st-1]=='(') t[cc].nr=1;
		           else t[cc].nl=1;
	}
	if (t[cc].e<t[t[cc].fa].e) t[t[cc].fa].l=cc;
	                      else t[t[cc].fa].r=cc;
  }

void change(int x){
	int cc=1;
	while (t[cc].l!=t[cc].r){
		if (x<=t[t[cc].l].e) cc=t[cc].l;
		                else cc=t[cc].r;
	}
	t[cc].nl^=1;
	t[cc].nr^=1;
	cc=t[cc].fa;
	while (cc!=0){
		t[cc].nl=t[t[cc].l].nl+max(t[t[cc].r].nl-t[t[cc].l].nr,0);
		t[cc].nr=t[t[cc].r].nr+max(t[t[cc].l].nr-t[t[cc].r].nl,0);
		cc=t[cc].fa;
	}
}

void find(int cc,int ll,int rr,int &nl,int &nr){
	int lson=t[cc].l,rson=t[cc].r;
	int lnr,lnl,rnl,rnr;
	if (ll==t[cc].s&&rr==t[cc].e){
		nl=t[cc].nl;nr=t[cc].nr;
		return;
	}
	if (ll<=t[lson].e&&rr>=t[rson].s){
		find(lson,ll,t[lson].e,lnl,lnr);
		find(rson,t[rson].s,rr,rnl,rnr);
		nl=lnl+max(rnl-lnr,0);
		nr=rnr+max(lnr-rnl,0);
    } else 
    {
    	if (rr<=t[lson].e){
    		find(lson,ll,rr,lnl,lnr);
    		nl=lnl;nr=lnr;
		} else
		{
			find(rson,ll,rr,rnl,rnr);
			nl=rnl;nr=rnr;
		}
	}
}

int main(){
	freopen("elf.in","r",stdin);
	freopen("elf.out","w",stdout);
	scanf("%d%d",&n,&m);
	scanf("%s",c);
	build(1,n,0);
	for (int i=1;i<=m;i++){
		char ch[7];
		scanf("%s",ch);
		if (ch[0]=='Q'){
			int ll,rr;
			scanf("%d%d",&ll,&rr);
			o=p=0;
			find(1,ll,rr,o,p);
			printf("%d %d\n",o,p);
		}
		else{
			int x;
			scanf("%d",&x);
			change(x);
		}
	}
}

2 【NOIP2015模拟10.28B组】终章-剑之魂

【背景介绍】
古堡,暗鸦,斜阳,和深渊……
等了三年,我独自一人,终于来到了这里……
“终焉的试炼吗?就在这里吗?”我自言自语道。
“终焉的试炼啊!就在这里啊!”我再一次自言自语道。
“这背后可能有那个东西吗?”我自言自语道。
“这背后一定有那个东西呢!”我又一次自言自语道。
我沉默着,踏上黑漆漆的索桥,小心翼翼地,拿出锋利的注入我灵魂的双剑……
“那么,我们开始吧……”我最后一次自言自语道。
【题目描述】
My soul of my sowrd!
终焉的试炼即将到来,作为一名有修养的剑士,虽然没有习得n刀流但是二刀流还是没问题的。然而我也是个剑的收藏者,家里屯着n把剑,每一把剑都有一个灵魂值a[i],由于一些剑之间可能有共鸣,所以我需要两把契合度最高的剑。据剑圣所说,两把编号为i,j剑的契合度为a[i] and a[j]。如何深得剑的灵魂呢?
注:AND 为按位与运算,先将数转成二进制,不满位数的补全0,然后成为两个长度相同的二进制数,处理的时候,两个相应的二进制位都为1,该位的结果值才为1,否则为0。

对于答案二进制下的每一位,自然让它尽可能为1使得答案最大,优先使高位最大
那么可以从高到低枚举答案的每一位,如果a[i]中有两个及以上的数能与已得出的ans的位数之值相等,且当前位为1,那么ans的这一位可以赋值为1,否则为0。最终得出的ans即为最大的答案

#include <cstdio>

using namespace std;

int n,ans=0;
int a[1000006];
int f[33];

int main(){
	freopen("sword.in","r",stdin);
	freopen("sword.out","w",stdout);
	scanf("%d",&n);
	f[0]=1;
	for (int i=1;i<=31;i++)
		f[i]=f[i-1]*2;
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=31;i>=0;i--){
		int c=0;
		for (int j=1;j<=n;j++)
			if (((a[j]&ans)==ans)&&(a[j]&f[i])){
				c++;
				if (c>=2){
					ans+=f[i];
					break;
				}
			}
	}			
	printf("%d",ans);
}

怕什么,若是我,骨灰送出去,管他是挫骨扬灰还是撒着玩儿。——花城

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值