题面: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题解的更多相关文章

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

    题目传送门(内部题51) 输入格式 第一行一个整数$t$表示数据组数.每组数据的第一行有三个整数$s,k,n$.第二行有$n$个整数$A_1,A_2,...,A_n$,依次表示黑白条的长度. 输出格式 ...

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

    题目描述 中二少年$cenbo$幻想自己统治着$Euphoric\ Field$.由此他开始了$Endless\ Fantasy$.$Euphoric\ Field$有$n$座城市,$m$个民族.这些 ...

  3. CSPS模拟 47

    考试时T1没玩明白,用一个WA90把100盖住了? T1 Emotional Flutter 题目非常蠢萌,只是注意当你把黑块前伸s距离后,应把脚的长度视为0,而不应为1. T2 Endless Fa ...

  4. jzoj5832. 【省选模拟8.20】Emotional Flutter

    tj:我們發現,每一次走過的步長都是k,設當前走的步數是x,走到了一個白條 那麼,每一次走就是把所有黑條都向前移k位,我們可以考慮把所有黑條的左邊界不斷的向前移動k,直到下一次移動時,其左邊界小於0, ...

  5. 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2

    考场 T1 一下想到了这题,将白块缩短 \(s\) 后维护类似的区间即可. T2 T3 俩计数,直接跳了. T4 的可行 \(t\) 集合相同相当与从 \(n\) 往前跳 kmp 数组,途径点相同,从 ...

  6. Noip模拟47 2021.8.25

    期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...

  7. 题解 Emotional Flutter

    传送门 因为一个等号挂掉了10pts 发现每个黑色段一定对应了一段不可行的出发区间 检查是否存在所有黑色段的并集的补集即可 具体来说,我们对于每个黑色段计算出一个(有的是两个)区间 \([l, r]\ ...

  8. noip模拟47

    原版在 \(linux\) 本地写完没保存关机给没了-- 再简单写一下 \(t2\) 用 \(dp\) 转移 \(f[i]=\sum _ {j=last[a[i]]}^{i-1} f[j]\) 用前缀 ...

  9. [考试总结]noip模拟47

    感觉自己放弃题目还是过于容易. 其实第一题不是很难,但是自己拿了一个暴力就走人了.. 然后其实简单优化一下子就有不少分数. 然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \( ...

随机推荐

  1. swoole手册

    https://wiki.swoole.com/wiki/ Swoole Github项目地址:https://github.com/swoole/swoole-src/ (支持请点Star) 开源中 ...

  2. PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的

    PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库 ...

  3. VS2010-MFC(常用控件:滚动条控件Scroll Bar)

    转自:http://www.jizhuomi.com/software/191.html 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合框设置了相应属性 ...

  4. qfc 问题汇总(TO BE CONTINUED)

    硬件问题 增加一个复位按钮 程序问题 /* uart allocation: PB6-7: UART1 -> TELEM PD5-6 : UART2 -> SBUS PD8-9: UART ...

  5. Day 8 : Python 文档操作

    Python 文件的操作方法: 打开文件 f = open('test','r',encoding='utf-8') #f :文件句柄 #test:文件绝对路径 #r:打开方式 #encoding 打 ...

  6. <每日一题>题目2:编写装饰器,为多个函数加上认证功能(用户账号和密码来源于文件)

    这里做个最简单的账号密码验证,主要为了实现装饰器同时对多个函数起作用 FLAG = False #加一个变量防止多次登录验证 def wrapper(f): def inner(*args,**kwa ...

  7. Activiti添加批注(comment)信息

    在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等 1.添加批注 // 由于流程用户上下文对象是线程独立的,所以要在需要的位置设置, ...

  8. php断点续传之文件上传与文件下载

    下载: 原理: Http头的 Range.Content-Range()未启用单点登录GerenalRequest URL: http://www.demotest.com/php/fileDownl ...

  9. printk函数打开和关闭消息

    在驱动开发的早期, printk 非常有助于调试和测试新代码. 当你正式发行驱动时, 换句 话说, 你应当去掉, 或者至少关闭, 这些打印语句. 不幸的是, 你很可能会发现, 就在你 认为你不再需要这 ...

  10. 通过真值树解析布尔表达式(eg:A&B|C)

    第一步:求出一个表达式的truth tree 1.生成真值表 2.根据真值表生成真值树(合并短路产生相同的两个子树) /**************************************** ...