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
感觉自己放弃题目还是过于容易. 其实第一题不是很难,但是自己拿了一个暴力就走人了.. 然后其实简单优化一下子就有不少分数. 然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \( ...
随机推荐
- MYSQL - 外键、约束、多表查询、子查询、视图、事务
MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...
- MySQL 笔记一
一.基本语法 1.数据库操作 create database [IF NOT EXIEST ] 数据库名 --创建数据库 drop database 数据库名 ...
- 机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源
机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源 相关主题 在信息时代,公司和个人的成功越来越依赖于迅速 ...
- error C2220: warning treated as error - no object file generated的处理方法
WDK/DDK中掉 error C2220: warning treated as error - no 'object' file generated 2009-04-01 15:54 网上搜索而来 ...
- VS2010-MFC(常用控件:按钮控件的编程实例)
转自:http://www.jizhuomi.com/software/184.html 因为Button控件在前面的例子中涉及到了,比较简单,本文就不作深入分析了,而是重点讲解单选按钮Radio B ...
- 记录一次idea因为修改子模块名称而引申的一大堆问题(未完全解决)
文章目录 背景 看图说话 解决 因为这个案例引申出来的错误 修改了之后莫名出现在java 和resource文件后面出现sources root字样 修改了之后java和resource后面出现了[c ...
- 转: sizeof,总结
源地址:http://blog.csdn.net/freefalcon/article/details/54839 0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少 ...
- day 61 Django基础之django分页
Django基础之django分页 一.Django的内置分页器(paginator) view from django.shortcuts import render,HttpRespons ...
- USACO 2012 March Silver Tractor /// 优先队列BFS oj21567
题目大意: 输入n,(x,y):n为阻挡的草堆数量,(x,y)为开始时拖拉机所在的位置 接下来n行每行一个坐标(a,b):为各个草堆的坐标 输出拖拉机要回到原点(0,0)需要移动的草堆数量 Sampl ...
- 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题
问题描述: Error occured processing XML 'org/aopalliance/intercept/MethodInterceptor'. See Error Log for ...