A类数据:

$n,q\leq1000$

修改:$O(1)$直接改

查询:$O(n)$BFS

B类数据:

$n,q\leq100000$,保证是一条链

用线段树维护区间最大前缀、后缀和

修改:$O(\log n)$

查询:答案为max([1,x]的最大后缀和,[x,n]的最大前缀和),$O(\log n)$

C类数据:

$n,q\leq100000$,保证以1为根时树高不超过40

设val[x]为从x向下走的最大和,val[x]=max(val[son[x]],0)+a[x]

每个点维护一棵平衡树,平衡树里每个节点存孩子id以及该孩子的val

预处理:$O(n\log n)$

修改:修改a[x],然后从x开始把它的所有父亲都修改掉,$O(d\log n)$

查询:从x开始往上走,设sum[x]为到x时的总和(包括x),ans=max(sum[x]+x平衡树中不是从之前儿子走过来的最大值),$O(d\log n)$

总时间复杂度:$O((n+qd)\log n)$

#include<cstdio>
#include<set>
#include<algorithm>
#define P make_pair
#define T pair<int,int>
#define N 100010
#define M 200010
using namespace std;
struct qq{int k,x,y;}op[N];
int n,m;
int a[N],g[N],nxt[N<<1],v[N<<1],ed;
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
namespace subtask1{
int q[N],h,t,vis[N],sum[N];
inline int cal(int x){
int ans=a[x],i;
for(i=1;i<=n;i++)vis[i]=0;
q[h=t=1]=x;vis[x]=1;sum[x]=a[x];
while(h<=t)for(i=g[x=q[h++]];i;i=nxt[i])if(!vis[v[i]])vis[q[++t]=v[i]]=1,ans=max(ans,sum[v[i]]=sum[x]+a[v[i]]);
return ans;
}
inline void work(){
for(int i=1;i<m;i++)if(op[i].k)a[op[i].x]=op[i].y;
else printf("%d\n",cal(op[i].x));
}
}
namespace subtask2{
struct msg{int ml,mr,sum;msg(){ml=mr=sum=0;}msg(int x){ml=mr=sum=x;}
inline msg operator+(const msg b){
msg c;
c.sum=sum+b.sum;
c.ml=max(ml,sum+b.ml);
c.mr=max(b.mr,b.sum+mr);
return c;
}
}val[M];
int l[M],r[M],tot;
void build(int c,int d){
int x=++tot;
if(c==d){val[x]=msg(a[c]);return;}
int mid=(c+d)>>1;
l[x]=tot+1;build(c,mid);
r[x]=tot+1;build(mid+1,d);
val[x]=val[l[x]]+val[r[x]];
}
void change(int x,int a,int b,int c,int p){
if(a==b){val[x]=msg(p);return;}
int mid=(a+b)>>1;
if(c<=mid)change(l[x],a,mid,c,p);else change(r[x],mid+1,b,c,p);
val[x]=val[l[x]]+val[r[x]];
}
msg ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return val[x];
int mid=(a+b)>>1;
if(d<=mid)return ask(l[x],a,mid,c,d);
if(c>mid)return ask(r[x],mid+1,b,c,d);
return ask(l[x],a,mid,c,d)+ask(r[x],mid+1,b,c,d);
}
inline void work(){
build(1,n);
for(int i=1;i<m;i++)if(op[i].k)change(1,1,n,op[i].x,op[i].y);
else printf("%d\n",max(ask(1,1,n,1,op[i].x).mr,ask(1,1,n,op[i].x,n).ml));
}
}
namespace subtask3{
int f[N],val[N];
set<T,greater<T> >b[N];
void dfs(int x,int pre){
f[x]=pre;b[x].insert(P(0,0));
for(int i=g[x];i;i=nxt[i])if(v[i]!=pre)dfs(v[i],x),b[x].insert(P(val[v[i]],v[i]));
val[x]=b[x].begin()->first+a[x];
}
inline void change(int x,int p){
int old=val[x],y=x;
a[x]=p;
val[x]=b[x].begin()->first+a[x];
while(f[x]){
b[f[x]].erase(P(old,y));
b[f[x]].insert(P(val[y],y));
old=val[f[x]],y=f[x];
val[f[x]]=b[f[x]].begin()->first+a[f[x]];
x=f[x];
}
}
inline int ask(int x){
int ans=val[x],sum=a[x],y=x;
x=f[x];
while(x){
sum+=a[x];
b[x].erase(P(val[y],y));
ans=max(ans,sum+b[x].begin()->first);
b[x].insert(P(val[y],y));
y=x;
x=f[x];
}
return ans;
}
inline void work(){
dfs(1,0);
for(int i=1;i<m;i++)if(op[i].k)change(op[i].x,op[i].y);
else printf("%d\n",ask(op[i].x));
}
}
int main(){
char c;int L,now,tmp,A,B,Q,i;
scanf("%c%d%d%d%d%d%d%d",&c,&n,&m,&L,&now,&A,&B,&Q);
for(i=1;i<=n;i++){
now=(now*A+B)%Q,tmp=now%10000;
now=(now*A+B)%Q;
if(now*2<Q)tmp*=-1;
a[i]=tmp;
}
for(i=1;i<n;i++){
now=(now*A+B)%Q;
tmp=(i<L)?i:L;
add(i-now%tmp,i+1);add(i+1,i-now%tmp);
}
for(i=1;i<m;i++){
now=(now*A+B)%Q;
if(now*3<Q){
now=(now*A+B)%Q;
op[i].x=now%n+1;
}else{
now=(now*A+B)%Q,tmp=now%10000;
now=(now*A+B)%Q;
if(now*2<Q)tmp*=-1;
now=(now*A+B)%Q;
op[i].k=1,op[i].x=now%n+1,op[i].y=tmp;
}
}
if(c=='A')subtask1::work();
if(c=='B')subtask2::work();
if(c=='C')subtask3::work();
return 0;
}

  

BZOJ2158 : Crash 的旅行计划的更多相关文章

  1. Crash的旅行计划

    除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...

  2. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划

    [BZOJ2117] [2010国家集训队]Crash的旅游计划 Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Cra ...

  3. COGS 2. 旅行计划

    2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...

  4. [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树

    [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树 题目大意: 给出一个\(n(n\le10^5)\)个结点的树,每条边有 ...

  5. 【51Nod】1273 旅行计划 树上贪心

    [题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...

  6. 51nod 1273 旅行计划——思维题

    某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...

  7. 洛谷P1137 旅行计划

    P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...

  8. 洛谷 P1137 旅行计划

    旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  9. 51nod-1273: 旅行计划

    [传送门:51nod-1273] 简要题意: 给出一棵树,点数为n,现在你有一个旅行计划,从k城市出发,每天前往一个没去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去 ...

随机推荐

  1. cf378C(模拟)

    题目链接:http://codeforces.com/contest/733/problem/C 思路:模拟 因为数组b里的元素是顺序对应a数组元素的和,可以开个c数组储存b数组元素对应的a数组元素区 ...

  2. C#关键字params

    using System; using System.Threading; namespace Test { /// <summary> /// params用法: 1.用来修饰方法的参数 ...

  3. 【Javascript】IE8兼容 背景图片与a标签的onclick事件

    先说几句牢骚话. 虽然IE8比之IE6.7有很大的进步,但是在执行效率.兼容性上仍然有很多问题.被广大开发者喜爱的平台才是好平台. 可惜多亏当年盗版XP打开中国的计算机市场,IE作为一款捆绑软件仍然在 ...

  4. Cash Cow【dfs较难题应用】【sdut2721】

    Cash Cow Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdut ...

  5. AIX扩展文件系统的大小

    由于AIX系统空间不够需要增加硬盘,希望增加文件系统的空间,折腾了好几天怎么都不能扩展文件系统的空间,原来是把硬盘加错了卷组 首先,确定文件系统所在的LV /dev/datalv      270.0 ...

  6. Linux环境下使用C/C++编写CGI(httpd)

    step1下载: ftp://ftp.gnu.org/gnu/cgicc/ step2: tar xzf cgicc-X.X.X.tar.gz(用最新版本) cd cgicc-X.X.X ./conf ...

  7. TCP通讯程序设计

    TCP通讯程序设计 这里主要包含客户机和服务器的编程. 一.编程模型函数化 使用函数说明:socket的理解 服务器: 创建socket使用函数----->socket 绑定地址使用函数---- ...

  8. 第二十五篇:在SOUI中做事件分发处理

    不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...

  9. WebView相关

    Android WebView使用基础 Android WebView中的JavaScript代码使用 很不错的例子:android webview js交互 第一节 (java和js交互)

  10. Cygwin的安装,卸载,以及安装gdb

    转载来源 http://10000001.blog.51cto.com/4600383/1341484   1.安装 其实Cygwin的安装时很简单的,需要的安装相应的就可以了,要详细的去网上找,很多 ...