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模拟测试]:Emotional Flutter(贪心)
题目传送门(内部题51) 输入格式 第一行一个整数$t$表示数据组数.每组数据的第一行有三个整数$s,k,n$.第二行有$n$个整数$A_1,A_2,...,A_n$,依次表示黑白条的长度. 输出格式 ...
- [CSP-S模拟测试]:Endless Fantasy(DFS)
题目描述 中二少年$cenbo$幻想自己统治着$Euphoric\ Field$.由此他开始了$Endless\ Fantasy$.$Euphoric\ Field$有$n$座城市,$m$个民族.这些 ...
- CSPS模拟 47
考试时T1没玩明白,用一个WA90把100盖住了? T1 Emotional Flutter 题目非常蠢萌,只是注意当你把黑块前伸s距离后,应把脚的长度视为0,而不应为1. T2 Endless Fa ...
- jzoj5832. 【省选模拟8.20】Emotional Flutter
tj:我們發現,每一次走過的步長都是k,設當前走的步數是x,走到了一個白條 那麼,每一次走就是把所有黑條都向前移k位,我們可以考慮把所有黑條的左邊界不斷的向前移動k,直到下一次移動時,其左邊界小於0, ...
- 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2
考场 T1 一下想到了这题,将白块缩短 \(s\) 后维护类似的区间即可. T2 T3 俩计数,直接跳了. T4 的可行 \(t\) 集合相同相当与从 \(n\) 往前跳 kmp 数组,途径点相同,从 ...
- Noip模拟47 2021.8.25
期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...
- 题解 Emotional Flutter
传送门 因为一个等号挂掉了10pts 发现每个黑色段一定对应了一段不可行的出发区间 检查是否存在所有黑色段的并集的补集即可 具体来说,我们对于每个黑色段计算出一个(有的是两个)区间 \([l, r]\ ...
- noip模拟47
原版在 \(linux\) 本地写完没保存关机给没了-- 再简单写一下 \(t2\) 用 \(dp\) 转移 \(f[i]=\sum _ {j=last[a[i]]}^{i-1} f[j]\) 用前缀 ...
- [考试总结]noip模拟47
感觉自己放弃题目还是过于容易. 其实第一题不是很难,但是自己拿了一个暴力就走人了.. 然后其实简单优化一下子就有不少分数. 然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \( ...
随机推荐
- LCD Common电压
因为驱动液晶翻转靠的是两个玻璃电极上的电压差,而电压差是由电容提供的,电容一端接到S基,另一端接到一个基准电压上,这个电压就是Common电压.
- 【JZOJ2867】Contra
description 偶然间,chnlich 发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗 MOD. 有 N 个关卡,初始有 Q 条命. 每通过 ...
- Windows 虚拟机 VM
VMware是全球台式电脑及资料中心虚拟化解决方案的领导厂商.VMWare Workstation是该公司出品的“虚拟 PC”软件(即:大家常说的“虚拟机”),通过它可在一台电脑上同时运行更多的Mic ...
- luoguP3414 SAC#1 - 组合数
题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数 ...
- LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)
传送门 解题思路 还是比较好想的,用一个队列,然后把所有点放在一起排个序,依次入队.每次检查队头元素的种类是否为当前入队元素种类,是的话就一直\(pop\),每次更新答案即可. 代码 #include ...
- BZOJ 1911 (APIO 2010) 特别行动队
题目描述 你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,-,i+k)的序列. 编 ...
- JS 拷贝传值和引用传值
1.拷贝传值:基本数据类型都是“拷贝传值”. 拷贝传值,就是将一个变量的值“拷贝”一份,传给了另一个变量. 拷贝传值中,两个变量之间没有任何联系,修改其中一个变量的值,另一个不会改变. 这两个变量之间 ...
- 第三方模块requests下载
requests下载 英文网站 http://docs.python-requests.org/en/master/ 中文网站 http://docs.python-requests.org/zh_C ...
- 01_springboot2.x之springboot入门
1.简介 Spring Boot来简化Spring应用开发,约定大于配置, 去繁从简,just run就能创建一个独立的,产品级别的应用. 优点: 1.简化Spring应用开发的一个框架: 2.整个S ...
- vue-router使用入门
安装及基本配置 # 安装 npm install vue-router # 使用 import Vue from 'vue' import VueRouter from 'vue-router' Vu ...