题面: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;
}

最新文章

  1. HTTPS科普扫盲帖 对称加密 非对称加密
  2. TokuDB 引擎安装测试
  3. Android-开发工具
  4. GCC选项 &ndash;I,-l,-L
  5. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
  6. iOS开发UI篇—实现一个私人通讯录小应用【转】
  7. Block之变量作用域
  8. iscroll-lite.js源码注释
  9. Prisma
  10. 删除sql计划 调用的目标发生了异常。 (mscorlib) 其他信息: 用户 &#39;sa&#39; 登录失败。
  11. Linux下查找大文件以及目录
  12. 应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
  13. T57274 黑暗城堡
  14. 讲解wpe抓包,封包
  15. 【Python3练习题 020】 求1+2!+3!+...+20!的和
  16. ES6 &amp; Map &amp; hashMap
  17. COUNT分组条件去重的sql统计语句示例(mysql)
  18. hadoop 文件合并
  19. Python之包管理工具
  20. 2-Tenth Scrum Meeting20151210

热门文章

  1. Windows copy
  2. 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)
  3. Elasticsearch日志之删除索引
  4. 暑假集训test-8-14~8-15
  5. golang中time包一个简单的时间格式输出
  6. (function($){….})(jQuery)与$(function(){})的区别
  7. js input框限制输入为数字并限制长度
  8. PropertyPlaceholderConfigurer的注意事项
  9. mac下Spark的安装与使用
  10. hdu5952 Counting Cliques 技巧dfs