好气啊,本来以为比赛时间还有很多,结果回家养病两天回到学校怎么比赛就结束了(雾),大约是小高考弄错了时间?

挑3道有意思的写写题解吧。

Cloning

题目大意:给一个序列,每次询问两个等长区间,问区间内的数是否排序后至多只有一个对应位不同。

题解:主席树维护一下hash,求出最大的k,使得两个区间中的前k大在排序后相同,然后判一下后缀即可。

#include<cstdio>
#include<algorithm>
#define MN 110000
#define ull unsigned long long
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
const ull base=;
int T,n,m,ro[MN],num=,a,b,c,d;
ull H[MN];
struct na{int l,r,s;ull h;na(){s=h=;}}t[MN*];
inline void add(int &p,int x,int l,int r,int k){
p=++num;t[p]=t[x];
t[p].h+=H[k];t[p].s++;
if (l==r) return;
int mid=l+r>>;
if (k<=mid) add(t[p].l,t[x].l,l,mid,k);else add(t[p].r,t[x].r,mid+,r,k);
}
inline int aski(int a,int b,int c,int d,int l,int r){
if (t[b].h-t[a].h==t[d].h-t[c].h&&t[b].s-t[a].s==t[d].s-t[c].s) return t[b].s-t[a].s;
if (l==r) return min(t[b].s-t[a].s,t[d].s-t[c].s);
int mid=l+r>>;
int mmh=aski(t[a].l,t[b].l,t[c].l,t[d].l,l,mid);
if (mmh==t[t[b].l].s-t[t[a].l].s&&mmh==t[t[d].l].s-t[t[c].l].s) mmh+=aski(t[a].r,t[b].r,t[c].r,t[d].r,mid+,r);
return mmh;
}
inline int aska(int a,int b,int c,int d,int l,int r){
if (t[b].h-t[a].h==t[d].h-t[c].h&&t[b].s-t[a].s==t[d].s-t[c].s) return t[b].s-t[a].s;
if (l==r) return min(t[b].s-t[a].s,t[d].s-t[c].s);
int mid=l+r>>;
int mmh=aska(t[a].r,t[b].r,t[c].r,t[d].r,mid+,r);
if (mmh==t[t[b].r].s-t[t[a].r].s&&mmh==t[t[d].r].s-t[t[c].r].s) mmh+=aska(t[a].l,t[b].l,t[c].l,t[d].l,l,mid);
return mmh;
}
int main(){
int i;
T=read();
H[]=;
for (i=;i<=1e5;i++) H[i]=H[i-]*base;
while(T--){
n=read();m=read();num=;
for (i=;i<=n;i++) add(ro[i],ro[i-],,1e5,read());
while(m--){
a=read();b=read();c=read();d=read();
puts(aska(ro[a-],ro[b],ro[c-],ro[d],,1e5)+aski(ro[a-],ro[b],ro[c-],ro[d],,1e5)>=b-a?"YES":"NO");
}
}
}

Euler Sum

题目大意:求$\sum_{1}^{n}\left\lfloor i*e \right\rfloor$

题解:连分数求出e的近似分数以后类欧即可

z,m=1,0

def work(x):
global z,m
z,m=m,z
z+=m*x
def mmh(n,z,m):
if n==0 or z==0 or m==0:
return 0
p=int(z//m)
z-=int(p*m)
N=int(n*z//m)
return n*(n+1)//2*p+int(n*N)-int(mmh(N,m,z)) i=3000
while (i>0):
work(i*2)
work(1)
work(1)
i-=1
z+=m
n=int(input())
mmh=0
f=1
while(n>0):
p=z//m
z-=p*m
N=n*z//m
mmh+=f*(n*(n+1)//2*p+n*N)
f*=-1
n=N
z,m=m,z
print(mmh)

Persistent oak

题意:不想写啊

题解:链剖后可持久化线段树即可,注意打标记,下放标记的时候都要新建节点,不然会影响到历史版本。

#include<cassert>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 210000
#define lp t[p].l
#define rp t[p].r
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct na{int y,ne;}b[MN<<];
struct tree{int l,r,M,m,d;bool re;}t[MN*];
int T,n,m,ty,l[MN],fa[MN],si[MN],de[MN],son[MN],to[MN],x,y,w[MN],df[MN],pdf[MN],lo[MN],ro[MN],nm,NUM,num;
char s[];
inline void in(int x,int y){b[++num].y=y;b[num].ne=l[x];l[x]=num;}
inline int min(int a,int b){return a<b?a:b;}
void dfs(int x){
si[x]=;son[x]=;
for (int i=l[x];i;i=b[i].ne)
if (fa[b[i].y]=x,de[b[i].y]=de[x]+,dfs(b[i].y),si[x]+=si[b[i].y],si[son[x]]<si[b[i].y]) son[x]=b[i].y;
}
void DFS(int x,int p){
to[x]=p;df[x]=++nm;pdf[nm]=x;
if (son[x]) DFS(son[x],p);
for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=son[x]) DFS(b[i].y,b[i].y);
lo[x]=nm;
}
inline void hb(int &p,int d,bool bo=){
if (!p) return;
t[++NUM]=t[p];p=NUM;
if (bo) t[p].re=,t[p].m=t[p].M,t[p].d=;else t[p].m+=d,t[p].d+=d,assert(t[p].m<=t[p].M);
}
inline void pd(int &p){
t[++NUM]=t[p];p=NUM;
if (t[p].re) hb(lp,,),hb(rp,,),t[p].re=;
if (t[p].d) hb(lp,t[p].d),hb(rp,t[p].d),t[p].d=;
}
inline void gx(int &p){
t[p].m=min(t[lp].m,t[rp].m);
t[p].M=min(t[lp].M,t[rp].M);
}
void build(int &p,int l,int r){
p=++NUM;t[p].l=t[p].r=t[p].d=t[p].re=;
if (l==r){
t[p].M=t[p].m=w[pdf[l]];
return;
}
int mid=l+r>>;
build(t[p].l,l,mid);build(t[p].r,mid+,r);
gx(p);
}
void add(int &p,int x,int l,int r,int L,int R,int d){
p=++NUM;t[p]=t[x];
pd(p);x=p;
if (L==l&&R==r) hb(p,d);else{
int mid=l+r>>;
if (R<=mid) add(lp,t[x].l,l,mid,L,R,d);else
if (L>mid) add(rp,t[x].r,mid+,r,L,R,d);else
add(lp,t[x].l,l,mid,L,mid,d),add(rp,t[x].r,mid+,r,mid+,R,d);
gx(p);
}
}
int ask(int &p,int l,int r,int k){
pd(p);
if (l==r) return t[p].m;
int mid=l+r>>;
if (k<=mid) return ask(lp,l,mid,k);else return ask(rp,mid+,r,k);
}
int mask(int &p,int l,int r,int L,int R){
pd(p);
if (t[p].m>=) return -;
if (l==r) return pdf[l];
int mid=l+r>>,s;
if (R<=mid) return mask(lp,l,mid,L,R);else
if (L>mid) return mask(rp,mid+,r,L,R);else
if (s=mask(rp,mid+,r,mid+,R),s!=-) return s;else return mask(lp,l,mid,L,mid);
}
inline void reset(int &p,int x,int l,int r,int L,int R){
p=++NUM;t[p]=t[x];
pd(p);x=p;
if (L==l&&R==r) hb(p,,);else{
int mid=l+r>>;
if (R<=mid) reset(lp,t[x].l,l,mid,L,R);else
if (L>mid) reset(rp,t[x].r,mid+,r,L,R);else
reset(lp,t[x].l,l,mid,L,mid),reset(rp,t[x].r,mid+,r,mid+,R);
gx(p);
}
}
inline void dec(int &p,int x,int u,int d){
while (u){
add(p,x,,n,df[to[u]],df[u],d);x=p;
u=fa[to[u]];
}
}
inline void work(int &p,int x,int y,int d){
int u=y,s=-;
while (u){
add(p,x,,n,df[to[u]],df[u],-d);x=p;
if (s==-) s=mask(p,,n,df[to[u]],df[u]);
u=fa[to[u]];
}
if (s!=-){
printf("%d\n",s-);
y=w[s]-ask(p,,n,df[s]);
reset(p,p,,n,df[s],lo[s]);
dec(p,p,fa[s],y);
}else puts("");
}
int main(){
int i;
T=read();
while (T--){
n=read();m=read();n++;w[]=1e9;NUM=num=nm=;
memset(ro,,sizeof(ro));memset(l,,sizeof(l));
for (i=;i<=n;i++) in(read()+,i),w[i]=read();
dfs();DFS(,);build(ro[],,n);
for (i=;i<=m;i++){
x=read();ty=read();
if (ty==){
y=read()+;
work(ro[i],ro[x],y,read());
}else{
y=read()+;
printf("%d\n",ty=(w[y]-ask(ro[x],,n,df[y])));
reset(ro[i],ro[x],,n,df[y],lo[y]);
dec(ro[i],ro[i],fa[y],ty);
}
}
}
}

CodeChef June Challenge 2017的更多相关文章

  1. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

  2. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef and Hamming Distance of arrays

    https://www.codechef.com/DEC17/problems/CHEFHAM #include<cstdio> #include<cstring> #incl ...

  3. CF&&CC百套计划2 CodeChef December Challenge 2017 Total Diamonds

    https://www.codechef.com/DEC17/problems/VK18 #include<cstdio> #include<iostream> #includ ...

  4. CF&&CC百套计划2 CodeChef December Challenge 2017 Penalty Shoot-out

    https://www.codechef.com/DEC17/problems/CPLAY #include<cstdio> #include<algorithm> using ...

  5. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake

    https://www.codechef.com/DEC17/problems/GIT01 #include<cstdio> #include<algorithm> using ...

  6. codechef January Challenge 2017 简要题解

    https://www.codechef.com/JAN17 Cats and Dogs 签到题 #include<cstdio> int min(int a,int b){return ...

  7. [codechef July Challenge 2017] Calculator

    CALC: 计算器题目描述大厨有一个计算器,计算器上有两个屏幕和两个按钮.初始时每个屏幕上显示的都是 0.每按一次第一个按钮,就会让第一个屏幕上显示的数字加 1,同时消耗 1 单位的能量.每按一次第二 ...

  8. [codechef July Challenge 2017] Chef and Sign Sequences

    CHEFSIGN: 大厨与符号序列题目描述大厨昨天捡到了一个奇怪的字符串 s,这是一个仅包含‘<’.‘=’和‘>’三种比较符号的字符串.记字符串长度为 N,大厨想要在字符串的开头.结尾,和 ...

  9. [codechef July Challenge 2017] IPC Trainers

    IPCTRAIN: 训练营教练题目描述本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 ...

随机推荐

  1. 【ANT】java项目生成文件示例

    <?xml version="1.0" ?> <project default="dist"> <property name=&q ...

  2. Parcel:常见技术栈的集成方式

    前言 Parcel 是什么 Parcel 是一个前端构建工具,Parcel 官网 将它定义为极速零配置的Web应用打包工具.没错,又是一个构建工具,你一定会想,为什么前端的构建工具层出不穷,搞那么多工 ...

  3. java并发编程的艺术——第五章总结(Lock锁与队列同步器)

    Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...

  4. Java I/O---获取文件目录并写入到文本

    首先获取指定目录下的所有文件目录,存入List集合中,然后创建文本文件将List遍历写入文本中保存. 1.主程序类 public class Test { /** * @param args */ p ...

  5. python爬去电影天堂恐怖片+游戏

    1.爬去方式python+selenium 2.工作流程 selenium自动输入,自动爬取,建立文件夹,存入磁力链接到记事本 3.贴上代码 #!/usr/bin/Python# -*- coding ...

  6. lesson - 11 课程笔记

    一.sed  作用: sed 是一种流编辑器,它是文本处理中非常重要的工具, 能够完美的配合正则表达式使用.处理时,把当前处理的行存储在临时缓冲区中, 称为“模式空间(pattern space)”, ...

  7. Java ArrayIndexOutOfBoundsException: Exception Hierarchy

  8. rabbitmq 启动报错

    =============================================== 2017/10/24_第1次修改                       ccb_warlock = ...

  9. JavaUtil_06_DES加解密工具

    一.示例 CommonUtil.java package com.ray.test.des; import java.io.ByteArrayOutputStream; import java.io. ...

  10. Volatile的作用

    众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用.那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就是磁盘(硬盘),但是访问的速度也是最慢的,价格 ...