【比赛报告】2018.10.17校赛[2014-10-6noip模拟赛] NOIP练习赛卷十六

比赛时间:2018.10.17 选手:lrllrl 得分:100+50+0 用时:2小时


在这里插入图片描述
在这里插入图片描述


大模拟一下就行了。

#include<cstdio>
const int N=510;
struct exe{
	char name[25];
	int st,ed,pm;
}e[N];
int n,m;
int main()
{
	//freopen("exercise.in","r",stdin);
	//freopen("exercise.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	    scanf("%s%d%d%d",e[i].name,&e[i].st,&e[i].ed,&e[i].pm);
	for(int i=1;i<=m;i++)
	{
		e[i].pm--;n+=e[i].st-e[i-1].ed-1;
		if(n-e[i].pm*(e[i].ed-e[i].st+1)>0)
		{
			n-=e[i].pm*(e[i].ed-e[i].st+1);continue;
		}
		else
		{
			int t=n/e[i].pm;if(t*e[i].pm<n)t++;
			printf("Runtime Error\n%d\n",e[i].st+t-1);return 0;
		}
	}
	n+=1440-e[m].ed;
	printf("Accepted\n%d\n",n);
	return 0;
}

在这里插入图片描述
在这里插入图片描述


打了个迭代深搜,TLE一半的点,交到codevs又是秒过的……后来把重量降序排序后过了学校的羊毛机。(气死了QAQ)

#include<cstdio>
#include<algorithm>
using namespace std;
int n,w,c[20],weight[20],Find;
int cmp(const int &a,const int &b){return a>b;}
void dfs(int now,int cnt,int lim)
{
	if(Find)return;if(cnt>lim)return;
	if(now==n+1){Find=1;return;}
	for(int i=1;i<=cnt;i++)
	    if(weight[i]+c[now]<=w)
	        weight[i]+=c[now],dfs(now+1,cnt,lim),weight[i]-=c[now];
	weight[cnt+1]=c[now];dfs(now+1,cnt+1,lim);weight[cnt+1]=0;
}
int main()
{
	//freopen("catclimb.in","r",stdin);
	//freopen("catclimb.out","w",stdout);
	scanf("%d%d",&n,&w);
	for(int i=1;i<=n;i++)
	    scanf("%d",&c[i]);
	sort(c+1,c+n+1,cmp);
	for(int i=1;i<=n;i++){dfs(1,1,i);if(Find){printf("%d\n",i);return 0;}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


这题一看裸的平衡树板子题,然后我背不到板子qwq
折腾半天splay样例都没过,后来发现是忘了排除-INF和INF的干扰qwq
结果后来提交还是不过,暴力也没了QAQ
写了个treap

#include<cstdio>
#include<cstdlib>
#define ls t[x].ch[0]
#define rs t[x].ch[1]
const int N=3e5+10;
struct treap{
	int ch[2],val,size,cnt,rd;
}t[N];
int root,cnt,n,m,hp[N];
void up(int x){t[x].size=t[ls].size+t[rs].size+t[x].cnt;}
void Rotate(int &x,int d)//d==0左儿子旋,d==1右儿子旋 
{
	int son=t[x].ch[d];
	t[x].ch[d]=t[son].ch[d^1];
	t[son].ch[d^1]=x;up(x);up(x=son);
}
void Insert(int &x,int val)
{
	if(!x)
	{
		x=++cnt;t[x].cnt=t[x].size=1;
		t[x].val=val;t[x].rd=rand();
		return;
	}
	t[x].size++;
	if(t[x].val==val){t[x].cnt++;return;}
	int d=t[x].val<val;Insert(t[x].ch[d],val);
	if(t[x].rd>t[t[x].ch[d]].rd)Rotate(x,d);
}
void Erase(int &x,int val)
{
	if(!x)return;//防止越界 
	if(t[x].val==val)
	{
		if(t[x].cnt>1){t[x].cnt--,t[x].size--;return;}//有相同的就直接-- 
		bool d=t[ls].rd>t[rs].rd;
		if(ls*rs==0)x=ls+rs;
		else Rotate(x,d),Erase(x,val);
	}
	else t[x].size--,Erase(t[x].ch[t[x].val<val],val);
}
int kth(int root,int k)
{
	int x=root;
	while(1)
	{
		if(k<=t[ls].size)x=ls;
		else if(k>t[ls].size+t[x].cnt)
		    k-=t[ls].size+t[x].cnt,x=rs;
		else return t[x].val;
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	    scanf("%d",&hp[i]),Insert(root,hp[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		char op[5];
		int x,y;
		scanf("%s",op);
		if(*op=='A'){scanf("%d%d",&x,&y);Erase(root,hp[x]);hp[x]-=y;if(hp[x]>0)Insert(root,hp[x]);else n--;}
		else if(*op=='C'){scanf("%d%d",&x,&y);Erase(root,hp[x]);hp[x]+=y;Insert(root,hp[x]);}
		else
		{
			scanf("%d",&x);
			if(x>n)puts("-1");
			else printf("%d\n",kth(root,n-x+1));
		}
	}
	printf("%d\n",n);
	return 0;
}

赛后总结

打这套题的时候感觉很简单,于是就飘了。T2我还想着要不要排序,后来又想迭代深搜不该有问题的……T3在平衡树记不清板子的情况下头铁去写,生动形象地诠释了铁头娃的内涵。
最后rank倒数……老子认真了

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/83176732
今日推荐