第五天,也是讲课的最后一天。

数据结构专题,讲师:杨志灿

他的blog我似乎找不到了……以前肯定是在百度博客里面。但是现在百度博客消失了。

PPT做的很有感觉,说了很多实用的技巧。

我觉得其实是收获最大的一天,因为听懂了XD


中午划水


下午的题也非常良心,然而@ghostfly233@Melacau说他们做过原题???

问题就是非常卡常!n=10^5的nlogn题目,400组询问,4秒?6亿复杂度啊!

然而就是跑过了,我也没办法,树状数组复杂度不满……

矩阵快速幂也卡……非常难受。

【T1】

题意:有\(1\leq a\leq b\leq c\leq n\),问多少个\((a,b,c)\)三元组满足\(a+b^2\equiv c^3(mod\;k)\)。

题解:枚举b,发现a+b^2的范围是b^2+1到b^2+b是连续的一段,考虑计算这段中的c大于等于b的c^3的个数。

显然用树状数组维护,复杂度有点问题,可是就是AC了XD。代码非常的优美。

#include<cstdio>
#include<cstring>
int n,k,bit[100001];
long long ans;
inline void I(int i){for(++i;i<=k;i+=i&-i)++bit[i];}
inline int Q(int i){int s=0;for(++i;i;i-=i&-i)s+=bit[i];return s;}
int main(){
freopen("exclaim.in","r",stdin);
freopen("exclaim.out","w",stdout);
int T; scanf("%d",&T);
for(int t=1;t<=T;++t){
scanf("%d%d",&n,&k); ans=0;
memset(bit,0,sizeof bit);
int sum=0;
for(int i=n;i;--i){
I(1ll*i*i*i%k); ++sum;
long long l=1ll*i*i+1, r=1ll*i*i+i;
ans+=1ll*(r/k-l/k)*sum+Q(r%k)-Q(l%k-1);
}
printf("Case %d: %lld\n",t,ans);
}
return 0;
}

【T2】

题意:你玩一个多结局RPGgalgame(???),游戏流程类似树形结构,你总共通关了k次,每个场景你都会获得该场景的价值(可能还有好感度和浪费手纸?),但是多次经历该场景就只有一次价值了。

价值都是正整数。

问他怎样攻略能获得最大价值?

题解:有一个贪心思路:每次都走最大价值的路线,这样一定最终价值也最大。

如何证明?

我们先证明最大的一定要选吧,这样后面的归纳一下就完了。

先分类讨论:

假设我们没有选择最大的,那么我们从最大的这条路线往回回溯,遇到第一个有选取的场景,那么走这个场景的这条(任意一条)路线,都可以换成走最大的路线。

为什么?假设走到这个场景的路线只有一条,那么显然更优,因为前面的价值都一样,换成这条会更优。

假设有多条,那么其中任意一条换掉之后,多了最优的这一条的价值收益,并且自己这条的收益还不用完全减掉,因为还有其他的路线走过,所以比上一种情况还来得优。

那么我们就证明了,最大的路线一定要选,接下来把最大的路线的收益删去,变成0,那么这时再选取最大的还是一样的。于是证明完毕。

那么如何处理呢?包括查询最大收益和修改。

其实这就是一个线段树能够维护的:

把节点按照DFS序排序,一个点的所有孩子就是一段区间。

把所有的叶子节点(结局)按照DFS序扔进线段树,初始值就是路线收益,查询时直接查最大值,修改时,我们知道一个点的孩子对应一段区间,所以区间减法即可。

查询k次,每次O(1),修改最多n次,每次O(log 叶子节点数)。

那么这题就算做完了。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,a[200001],fa[200001],t[200001],cnt;
int h[200001],to[200001],nxt[200001],tot;
inline void ins(int x,int y){nxt[++tot]=h[x];to[tot]=y;h[x]=tot;}
int L[200001],R[200001],vis[200001];
long long dat[524289],lazy[524289],ans;
int pos[524289];
void dfs(int u){
if(!h[u]) {L[u]=R[u]=++cnt, t[cnt]=u; return;}
L[u]=n; for(int i=h[u];i;i=nxt[i]) dfs(to[i]), L[u]=min(L[u],L[to[i]]), R[u]=max(R[u],R[to[i]]);
}
inline void pushdown(int i){
lazy[i<<1]+=lazy[i];
lazy[i<<1|1]+=lazy[i];
dat[i<<1]+=lazy[i];
dat[i<<1|1]+=lazy[i];
lazy[i]=0;
}
void build(int i,int l,int r){
pos[i]=l;
if(l==r) return;
int mid=l+r>>1;
build(i<<1,l,mid), build(i<<1|1,mid+1,r);
}
void Ins(int i,int l,int r,int a,int b,int v){
if(a<=l&&r<=b) {dat[i]+=v; lazy[i]+=v; return;}
if(r<a||b<l) return;
pushdown(i); int mid=l+r>>1;
Ins(i<<1,l,mid,a,b,v); Ins(i<<1|1,mid+1,r,a,b,v);
dat[i]=max(dat[i<<1],dat[i<<1|1]);
pos[i]=dat[i<<1]>=dat[i<<1|1]?pos[i<<1]:pos[i<<1|1];
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d",&n,&k); k=min(k,n);
for(int i=1;i<=n;++i) scanf("%d",a+i);
for(int i=1,x,y;i<n;++i) scanf("%d%d",&x,&y), ins(x,y), fa[y]=x;
dfs(1);
build(1,1,cnt);
for(int i=1;i<=n;++i) Ins(1,1,cnt,L[i],R[i],a[i]);
for(int i=1;i<=k;++i){
int p=t[pos[1]];
ans+=dat[1];
int sum=0;
while(p&&!vis[p]) Ins(1,1,cnt,L[p],R[p],-a[p]), vis[p]=1, sum+=a[p], p=fa[p];
}
printf("%lld",ans);
return 0;
}

【T3】

题意:求有向图中长度小于k的环的个数,没有自环。

题解:简单矩阵,有著名定理支持:邻接矩阵的k次方就是从一个节点出发,经过k步到达另一个节点的路径数。

即求\(A^1+A^2+\cdots+A^{k-1}\)。

简单矩阵快速幂即可,加一个稀疏矩阵优化,跑的飞快。根本不需要分治。

#include<cstdio>
#include<cstring>
int n,n2,k,p,ans;
struct Mat{int fk[200][200];}M1,M2;
inline Mat operator*(Mat p1,Mat p2){
Mat p3;memset(p3.fk,0,sizeof p3.fk);
for(register int i=0;i<n2;++i)
for(register int k=0;k<n2;++k) if(p1.fk[i][k])
for(register int j=0;j<n2;++j)
p3.fk[i][j]=(p3.fk[i][j]+1ll*p1.fk[i][k]*p2.fk[k][j])%p;
return p3;
}
int main(){
freopen("tour.in","r",stdin);
freopen("tour.out","w",stdout);
scanf("%d",&n); n2=n<<1;
char ch;
for(register int i=0;i<n;++i) M1.fk[i][i]=M2.fk[i][i]=M2.fk[i+n][i+n]=1;
for(register int i=n;i<n2;++i) for(register int j=0;j<n;++j) (ch=getchar())=='Y'?M1.fk[i][j]=M1.fk[i][j+n]=1:(ch!='N'?--j:0);
scanf("%d%d",&k,&p); --k;
if(p==1){puts("0");return 0;}
while(k){
if(k&1) M2=M2*M1;
k>>=1; M1=M1*M1;
}
for(register int i=0;i<n;++i) ans=(ans+M2.fk[i+n][i])%p;
printf("%d",ans);
return 0;
}

【FCS NOI2018】福建省冬摸鱼笔记 day5的更多相关文章

  1. 【FCS NOI2018】福建省冬摸鱼笔记 day1

    省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...

  2. 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1

    记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...

  3. 【FCS NOI2018】福建省冬摸鱼笔记 day3

    第三天. 计算几何,讲师:叶芃(péng). dalao们日常不记笔记.@ghostfly233说他都知道了,就盼着自适应辛普森积分. 我计算几何基础不好……然而还是没怎么讲实现,感觉没听什么东西进去 ...

  4. 【FCS NOI2018】福建省冬摸鱼笔记 day2

    第二天. 同学还是不带本子记笔记.dalao. 第二天:图论,讲师:@ExfJoe 全程划水,前面都讲水算法[虽然我可能已经忘记了]什么最短路,Tarjan,最小生成树,2SAT,差分约束啥的,我现在 ...

  5. 【FCS NOI2018】福建省冬摸鱼笔记 day4

    第四天. 动态规划专题,讲师:闫神 讲了一些DP优化技巧,然而思想难度好大啊……根本没想到能优化那地步,连DP方程都没有呢. 不过有几题我还是想明白了. 讲了单调队列,决策单调性,四边形不等式,斜率优 ...

  6. Hash 日常摸鱼笔记

    本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...

  7. 可持久化Treap 赛前摸鱼笔记

    1.基本结构 随机化工具 unsigned int SEED = 19260817; //+1s inline int Rand(){ SEED=SEED*1103515245+12345; retu ...

  8. [摸鱼]cdq分治 && 学习笔记

    待我玩会游戏整理下思绪(分明是想摸鱼 cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法 对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态 ...

  9. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程

    下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...

随机推荐

  1. 【XSY2753】LCM

    Description 给你\(n,k\),要你选一些互不相同的正整数,满足这些数的lcm为\(n\),且这些数的和为\(k\)的倍数. 求选择的方案数.对\(232792561\)取模. \(n\l ...

  2. 【bzoj2594】 Wc2006—水管局长数据加强版

    http://www.lydsy.com/JudgeOnline/problem.php?id=2594 (题目链接) 题意 给出一个带边权的无向简单,要求维护两个操作,删除${u,v}$之间的连边: ...

  3. keepalived回顾

    Keepalived是lvs的扩展项目,因此它们之间具备良好的兼容性. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离: 负载均衡器之间的失败切换failover,通过VRRPv2 st ...

  4. JS的异步

    1.异步 程序中现在运行的部分和将来运行的部分之间的关系是异步编程的核心. 多数JavaScript开发者从来没有认真思考过自己程序中的异步到底是如何出现的,以及为什么会出现,也没有探索过处理异步的其 ...

  5. 一、初识java

    理论性的东西就不在笔记中作为纪录了. 先来解释下java安装过程中的一些问题,java安装和环境配置不多做强调,可以参考http://www.cnblogs.com/JianXu/p/5158404. ...

  6. Python【第三方模块&标准模块】

    模块: 模块其实就是一个python文件 1.标准模块.标准包 #python自带的这些模块,直接import就能用的 import string,random,datetime,os,json 2. ...

  7. P4394 [BOI2008]Elect 选举

    P4394 [BOI2008]Elect 选举 题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好 ...

  8. JavaScript中的apply()和call()

    可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用函数. call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对 ...

  9. day14 多态与抽象

    多态:相同的行为,不同的实现. 多态分为:静态多态和动态多态. 静态多态:在编译期即确定方法的实现和效果.——使用重载实现 动态多态:运行后才能确定方法的实现和执行效果.——使用动态绑定和重写实现 动 ...

  10. mongo同步到es

    刚开始我找到的方案是利用 ElasticSearch 的 River 来同步数据,并在 GitHub 上到了 MongoDB River 插件:elasticsearch-river-mongodb. ...