csp-s模拟47 Emotional Flutter,Endless Fantasy题解

Posted juve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csp-s模拟47 Emotional Flutter,Endless Fantasy题解相关的知识,希望对你有一定的参考价值。

题面:https://www.cnblogs.com/Juve/articles/11558523.html

A:Emotional Flutter

如果起点确定,那么我们后面走的点都是固定的,及mod k余数相同

如果路径中有一个%k在黑块里,那么这个起点是不可行的

然后我们可以对于所有黑块,看它限制了哪些余数

最后我们要判断的就是有没有一个长度为s的连续区间,使得它没有被限制

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=5e5+5;
inline int read()
	int x=0;char ch=getchar();
	while(ch<‘0‘||ch>‘9‘) ch=getchar();
	while(ch>=‘0‘&&ch<=‘9‘)x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();
	return x;

int t,s,k,n,a[MAXN],sum[MAXN];
struct node
	int l,r;
	friend bool operator < (node x,node y)
		return x.l==y.l?x.r<y.r:x.l<y.l;
	
lim[MAXN];
int tot=0;
signed main()
	//freopen("test.in","r",stdin);
	//freopen("vio.out","w",stdout);
	t=read();
	while(t--)
		s=read(),k=read(),n=read();
		sum[0]=tot=0;
		bool flag=0;
		for(int i=1;i<=n;++i)
			a[i]=read();
			sum[i]=sum[i-1]+a[i];
			if(i%2==0) continue;
			if(a[i]>=k) flag=1;
			int p=(sum[i-1]+1)%k;
			int q=sum[i]%k;
			if(a[i]-1==q-p)
				lim[++tot]=(node)p,q;
			
			else
				lim[++tot]=(node)p,k-1;
				lim[++tot]=(node)0,q;
			
		
		if(flag)
			puts("NIE");
			continue;
		
		sort(lim+1,lim+tot+1);
		int mn=0x7fffffffffffff,mx=0;
		for(int i=1;i<=tot;++i)
			//cout<<lim[i].l<<‘ ‘<<lim[i].r<<endl;
			mn=min(mn,lim[i].l);
			mx=max(mx,lim[i].r);
		
		lim[++tot]=(node)k,k;
		flag=0;
		int i=1;
		int l=0,r=0;
		while(i<=tot)
			while(i<=tot&&l<=lim[i].l&&lim[i].l<=r)
				r=max(r,lim[i].r);
				++i;
			
			if(lim[i].l-r-1>=s)
				flag=1;
				break;
			else
				l=lim[i].l,r=lim[i].r;
				++i;
			
		
		if(mn+k-mx-1>=s) flag=1;
		if(s>k) flag=0;
		if(flag) puts("TAK");
		else puts("NIE");
	
	return 0;

B:Endless Fantasy

线段树合并模板题

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=4e5+5;
inline int read()
	int x=0;char ch=getchar();
	while(ch<‘0‘||ch>‘9‘) ch=getchar();
	while(ch>=‘0‘&&ch<=‘9‘)x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();
	return x;

int n,m,a[MAXN],b[MAXN],ans[MAXN],id[MAXN];
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v)
	++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;

int root[MAXN],tot=0;
struct node
	int ls,rs,mx,id;
tr[MAXN*40];
int update(int k)
	if(tr[tr[k].ls].mx>=tr[tr[k].rs].mx) tr[k].mx=tr[tr[k].ls].mx,tr[k].id=tr[tr[k].ls].id;
	else tr[k].mx=tr[tr[k].rs].mx,tr[k].id=tr[tr[k].rs].id;

void insert(int &k,int l,int r,int pos,int val)
	if(!k) k=++tot;
	if(l==r)
		tr[k].mx=val;
		tr[k].id=pos;
		return ;
	
	int mid=(l+r)>>1;
	if(pos<=mid) insert(tr[k].ls,l,mid,pos,val);
	else insert(tr[k].rs,mid+1,r,pos,val);
	update(k);

int merge(int x,int y,int l,int r)
	if(!x||!y) return x+y;
	if(l==r)
		tr[x].mx+=tr[y].mx;
		return x;
	
	int mid=(l+r)>>1;
	tr[x].ls=merge(tr[x].ls,tr[y].ls,l,mid);
	tr[x].rs=merge(tr[x].rs,tr[y].rs,mid+1,r);
	update(x);
	return x;

void dfs(int x,int fa)
	for(int i=pre[x];i;i=nxt[i])
		int y=to[i];
		if(y==fa) continue;
		dfs(y,x);
		root[x]=merge(root[x],root[y],1,m);
	

int main()
	n=read(),m=read();
	for(int i=1,u,v;i<n;++i)
		u=read(),v=read();
		add(u,v),add(v,u);
	
	for(int i=1;i<=n;++i)
		scanf("%d%d",&a[i],&b[i]);
		insert(root[i],1,m,a[i],b[i]);
	
	dfs(1,0);
	for(int i=1;i<=n;++i)
		printf("%d %d\\n",tr[root[i]].id,tr[root[i]].mx);
	
	return 0;

 

以上是关于csp-s模拟47 Emotional Flutter,Endless Fantasy题解的主要内容,如果未能解决你的问题,请参考以下文章

csp-s模拟47

2019.9.19 csp-s模拟测试47 反思总结

[考试反思]1001csp-s模拟测试(b):逃离

csp-s模拟测试92

csp-s模拟测试96

反省——关于csp-s模拟50