领导集团问题

考虑对每一个点暴力dpdpdp:fi,jf_{i,j}fi,j​表示iii为根的子树选出来的点集最小值不小于jjj的点集元素个数最大值。

那么显然fi,j=∑max⁡{fv,k≥j}+1f_{i,j}=\sum\max\{f_{v,k\ge j}\}+1fi,j​=∑max{fv,k≥j​}+1

直接上线段树合并来优化就完了。

注意要打懒标记

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=200005,M=8000005;
int n,a[N],rt[N],val[N],sig=0;
vector<int>e[N];
namespace SGT{
	int son[M][2],mx[M],add[M],tot=0;
	inline void pushup(int p){mx[p]=max(mx[son[p][0]],mx[son[p][1]]);}
	inline void pushnow(int p,int v){if(!p)return;mx[p]+=v,add[p]+=v;}
	inline void pushdown(int p){
		if(!add[p]||!p)return;
		pushnow(son[p][0],add[p]),pushnow(son[p][1],add[p]);
		add[p]=0;
	}
	inline void update(int&p,int l,int r,int k,int v){
		if(!p)p=++tot;
		if(l==r){mx[p]=max(v,mx[p])+1;return;}
		pushdown(p);
		int mid=l+r>>1;
		k<=mid?update(son[p][0],l,mid,k,max(v,mx[son[p][1]])):update(son[p][1],mid+1,r,k,v);
		pushup(p);
	}
	inline int merge(int x,int y,int l,int r,int a,int b){
		if(!x||!y)return pushnow(y,a),pushnow(x,b),x+y;
		if(l==r)return mx[x]=max(mx[x],a)+max(mx[y],b),x;
		pushdown(x),pushdown(y);
		int mid=l+r>>1;
		son[x][0]=merge(son[x][0],son[y][0],l,mid,max(a,mx[son[x][1]]),max(b,mx[son[y][1]]));
		son[x][1]=merge(son[x][1],son[y][1],mid+1,r,a,b);
		return pushup(x),x;
	}
}
void dfs(int p){
	for(ri i=0,v;i<e[p].size();++i)dfs(v=e[p][i]),rt[p]=SGT::merge(rt[p],rt[v],1,sig,0,0);
	SGT::update(rt[p],1,sig,a[p],0);
}
int main(){
	n=read();
	for(ri i=1;i<=n;++i)a[i]=read(),val[++sig]=a[i];
	sort(val+1,val+sig+1),sig=unique(val+1,val+sig+1)-val-1;
	for(ri i=1;i<=n;++i)a[i]=lower_bound(val+1,val+sig+1,a[i])-val;
	for(ri i=2;i<=n;++i)e[read()].push_back(i);
	dfs(1);
	cout<<SGT::mx[rt[1]];
	return 0;
}

所罗门王的宝藏

考虑O(Tn2)O(Tn^2)O(Tn2)的枚举算法。

我们设cic_ici​表示第iii行的增量,lil_ili​表示第iii列的增量,如果存在两个点(x,y,w1),(x,z,w2)(x,y,w_1),(x,z,w_2)(x,y,w1​),(x,z,w2​),那么ly−lz=w1−w2l_y-l_z=w_1-w_2ly​−lz​=w1​−w2​,同理如果存在两个点(x,y,w1),(z,y,w2)(x,y,w_1),(z,y,w_2)(x,y,w1​),(z,y,w2​),那么cx−cz=w1−w2c_x-c_z=w_1-w_2cx​−cz​=w1​−w2​,这样对于每一个点更新一下任意两列的增量判断是否冲突即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1005;
inline int read(){
	int ans=0;
	bool f=1;
	char ch=getchar();
	while(!isdigit(ch))f^=ch=='-',ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return f?ans:-ans;
}
int a[N][N],n,m,k,detc[N][N],detl[N][N],X[N],Y[N],C[N];
bool vis[N][N],visc[N][N],visl[N][N];
int main(){
	for(ri tt=read();tt;--tt){
		n=read(),m=read(),k=read();
		for(ri i=1;i<=n;++i)for(ri j=1;j<=m;++j)vis[i][j]=visc[i][j]=visl[i][j]=0;
		for(ri i=1,x,y,c,det;i<=k;++i){
			x=read(),y=read(),c=read();
			X[i]=x,Y[i]=y,C[i]=c;
			if(vis[x][y]&&(a[x][y]^c)){puts("No");goto XXX;}
			vis[x][y]=1,a[x][y]=c;
			for(ri j=1,mn,mx;j<i;++j){
				det=c-a[X[j]][Y[j]];
				if(Y[i]==Y[j]){
					mn=min(X[i],X[j]),mx=max(X[i],X[j]);
					if(X[i]>X[j])det*=-1;
					if(visc[mn][mx]&&detc[mn][mx]!=det){puts("No");goto XXX;}
					visc[mn][mx]=1,detc[mn][mx]=det;
					if(X[i]>X[j])det*=-1;
				}
				if(X[i]==X[j]){
					mn=min(Y[i],Y[j]),mx=max(Y[i],Y[j]);
					if(Y[i]>Y[j])det*=-1;
					if(visl[mn][mx]&&detl[mn][mx]!=det){puts("No");goto XXX;}
					visl[mn][mx]=1,detl[mn][mx]=det;
					if(Y[i]>Y[j])det*=-1;
				}
			}
		}
		puts("Yes");
		XXX:;
	}
	return 0;
}

邮递员问题

咕咕咕

FJOI2018 部分题解的更多相关文章

  1. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  2. 洛谷4578 & LOJ2520:[FJOI2018]所罗门王的宝藏——题解

    https://www.luogu.org/problemnew/show/P4578 https://loj.ac/problem/2520 有点水的. 先转换成图论模型,即每个绿宝石,横坐标向纵坐 ...

  3. 题解【[FJOI2018]所罗门王的宝藏】

    本题解同步于luogu emmm切了近年省选题来写题解啦qwq 该题较其他省选题较水吧(否则我再怎么做的出来 思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节 \[\tex ...

  4. 题解-FJOI2018 领导集团问题

    题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...

  5. 洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解

    https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blo ...

  6. 【BZOJ5471】[FJOI2018]邮递员问题(动态规划)

    [BZOJ5471][FJOI2018]邮递员问题(动态规划) 题面 BZOJ 洛谷 给定平面上若干个点,保证这些点在两条平行线上,给定起点终点,求从起点出发,遍历所有点后到达终点的最短路径长度. 题 ...

  7. 【BZOJ5470】[FJOI2018]所罗门王的宝藏()

    [BZOJ5470][FJOI2018]所罗门王的宝藏() 题面 BZOJ 洛谷 有\(n+m\)个变量,给定\(k\)组限制,每次告诉你\(a_i+b_j=c_k\),问是否有可行解. 题解 一道很 ...

  8. 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)

    [BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. note 0 Python介绍及Python IDE环境安装 Spyder with Anaconda

    高级语言分类 编译型语言(C/C++等) 解释型语言(BASIC.Python等) Python 诞生于1989年,创始人为吉多 范罗苏姆(Guido van Rossum) Python 语言特点 ...

  2. SELINUX工作原理

    SELinux工作原理 1. 简介 SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制. Security-Enhanced Linux (SELinux)由以下两部分组成 ...

  3. 记录 Ext 日历月份选择控件bug解决过程结果

    目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3 ...

  4. 入坑docker

    入坑docker docker入门指南 docker入门指南 docker基础概念 docker分 server/client. server后台管理着所有的images/instances. 用户通 ...

  5. python 贝叶斯算法

    自我理解贝叶斯算法也就是通过概率来判断C是属于A类还是B类,下面是具体代码(python3.5 测试通过) 文字流程解释一波 1 )  加载训练数据和训练数据对应的类别 2)   生成词汇集,就是所有 ...

  6. [Python]查询oracle导出结果至Excel并发送邮件

    环境:Linux +python2.7+oracle11g 1.提前安装xlwt(excel写入操作模块),cx_Oracle(oracle操作模块) cx_Oracle的安装步骤详见链接:https ...

  7. mongodb相关文章

    1.Windows 平台安装 MongoDB 2.MONGODB基本命令用 3.MongoDB 教程

  8. Java中锁的实现与内存语义

    目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...

  9. jQuery自定义alert,confirm方法及样式

    学过JavaScript的都知道,alert().confirm()都是window对象特有的方法,而这两个方法我们平时使用的频率也很高,但是比较扎心的就是他自带的样式太... 因此,我整理了一个比较 ...

  10. 解决HighChart开发遇到的2个问题

    需求很简单,显示一条24小时的变化曲线 写完代码效果是只有一条直线,连时间轴都没有 第1个错误  Highcharts error #12 当通过要绘制的点超过1000个时就会报这个错,我按分钟计算间 ...