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;
}

原文地址:https://www.cnblogs.com/Juve/p/11558693.html

时间: 2024-11-02 02:27:13

csp-s模拟47 Emotional Flutter,Endless Fantasy题解的相关文章

[CSP-S模拟测试]:Emotional Flutter(贪心)

题目传送门(内部题51) 输入格式 第一行一个整数$t$表示数据组数.每组数据的第一行有三个整数$s,k,n$.第二行有$n$个整数$A_1,A_2,...,A_n$,依次表示黑白条的长度. 输出格式 若能通过输出$"TAK"$,否则输出$"NIE"$. 样例 样例输入: 22 8 72 5 6 3 2 1 22 8 41 6 7 4 样例输出: TAKNIE 数据范围与提示 样例解释: 数据范围: $30\%$的数据,$n\leqslant 1300$: $50\

[CSP-S模拟测试]:Endless Fantasy(DFS)

题目描述 中二少年$cenbo$幻想自己统治着$Euphoric\ Field$.由此他开始了$Endless\ Fantasy$.$Euphoric\ Field$有$n$座城市,$m$个民族.这些城市之间由$n-1$条道路连接形成了以城市$1$为根的有根树.每个城市都是某一民族的聚居地,$cenbo$知道第$i$个城市的民族是$A_i$,人数是$B_i$.为了维护稳定,$cenbo$需要知道某个区域内人数最多的民族.他向你提出$n$个询问,其中第$i$个询问是:求以$i$为根的子树内,人数最

CSPS-S 模拟47

考试考得一般般,改题改到天昏地暗 T1 TLE10分, T2 TLE90,T3-不用说了(目前还没读懂题) 并列的有十个人 T1 Emotional Flutter 先把题意理解一下,千万不要按点来干,应该按照一个个长度为1的格来看,比如脚长为2时,占两格,脚尖部分(第二个格)不能在下一个黑条的第一个格上 所以先把脚长S(缩成脚后跟)整成一个格 1,只要把白条减去最后S-1个格(脚跟不能在这几个格里,但从后往前数的第S个格是可以放脚跟的),那么黑条的长度加上这S-1个格,表示脚跟不能在这个区域内

csp-s模拟47

T1: 考虑每个黑条的限制范围其实是一个区间,于是把脚长的限制计算在里面后去掉 而每次只能走k,所以可以在模k意义下进行线段覆盖 若全覆盖则无解,否则有解. (注意若某一个黑条第限制区间大于k,则一定无解) (还要注意若一个黑条跨越了模k的序列,则需要拆成两个) T2: 暴力线段树合并就完了 T3: kmp处理出原串的t集合 考虑实际上问题就是:构造一个字典序最小的01串使其与原串的nxt数组某些位置相同 考虑当满足第i个限制后如何满足第i+1个限制 设\(delta=len_{i+1}-len

【日常学习】【SPFA负环+数组模拟链表实现】codevs2645 Spore题解

之前刚刚写了一道"香甜的黄油",是USACO的经典题目了.那道题用SPFA怎么找都过不了,看着别人的PAS轻松过各种拙计.黄学长说最佳方案应当是堆优化的dij,我还没有血,等学了那个之后再写黄油题解吧. 题目: 题目描述 Description 在星系1 的某颗美丽的行星之上.某陈将去标号为N 的星系,从星系g1 到达g2,某陈需要花费c1 的代价[主要是燃料,另外还有与沿途Grox 的势力作战的花费],c1 小于0 则是因为 这样的星系旅行,会给某陈带来收益[来源于物流差价,以及一些

csp-s模拟测试52平均数,序列题解

题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数减去 x,则我们只需求区间和小于 0 的区间数量. 我们对这个序列求前缀和,则区间[L,R]和小于 0 当且仅当 SL-1>SR, 答案即为前缀和序列 S 的逆序对数量,使用经典的归并排序即可解决 #include<iostream> #include<cstdio> #incl

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

思路接近正解?都想到了?这都是借口呀. 没有用的,往前走吧. T1:Emotional Flutter 我的做法和题解不太一样,我把s放在最后考虑了. 因为出发以后步幅是一样的,所以每一个黑条可以ban掉一段出发点.把黑条的左右边界%k存成区间,每个黑条可以存一个或者两个区间[跨越k这个边界].然后像以前写区间覆盖的贪心一样按左端点排序,看看有没有长至少为s的空余. 代码: #include<iostream> #include<cstdio> #include<cstrin

9月份总结(模拟34-50)

深夜发文 注意了这个,这一篇blog涵盖范围很广,并且不涉及任何题目知识的这个. 个人能力过于蒟蒻,但还因重度强迫症不想断掉blog,所以只能把过去一个月欠的东西用这一晚上总结一下, 先把一些没有发布的有用心得补一下 模拟41: 怕的就是麻木啊 考场上心态爆炸,T1没看懂???!!!!!虽然最后大概yy出来了出题人的意思,但是没想全,没过样例, 然后怀疑人生,似乎没了动力已经麻木, 模拟43: 对于想到的东西,一定要打上去!!!什么减枝的,对了就写 模拟47爆零纪念 问题:应该不算是“压宝”吧,

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环