领导集团问题

考虑对每一个点暴力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. 转载--无弹窗APT渗透实验

    转载--无弹窗APT渗透实验 文章作者:亚信安全,转载自 FreeBuf.COM APT攻击方式花样繁多,我研究最近的流行的APT攻击方式,在本地搭建环境模拟一次简单的APT攻击,在模拟攻击过程中发现 ...

  2. SQL 中 CASE - WHEN - THEN - ELSE - END 的小结

    在SQLServer中给变量赋备件值 可以用 @var = CASE WHEN EXPRESSION THEN STATEMENT01 ELSE STATEMENT02 END 当表达式 EXPRES ...

  3. 第19课 类型萃取(3)_类型选择的traits

    1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T ...

  4. JS数据类型的判断

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示:    基本类型:String.Number.Boolean.Symbol.Undefine ...

  5. 解决idea创建Maven项目卡在running tmp archetypexxxtmp

    打开IDEA settings 然后在VM Options内添加-DarchetypeCatalog=internal 运行参数

  6. ActiveMQ(1)---初识ActiveMQ

    消息中间件的初步认识 什么是消息中间件? 消息中间件是值利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,可以在分布式架构下扩展进 ...

  7. MATLAB——矩阵排序详解

    <span style="font-size:18px;">(1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排 ...

  8. intllij IDE 中git ignore 无法删除target目录下的文件

    原因: git的本地忽略设置必须保证git的远程仓库分支上没有这个要忽略的文件,如果远程分支上存在这个文件,本地在设置ignore 这个文件,将会失败,无法commit忽略.(有人说是git的bug, ...

  9. 29 _react-router说明

    一.SPA的理解 1.单页面web应用(single page web application ,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的链接不会刷新页面,本身也不会向服务器发请求 ...

  10. OS模块的介绍

    os,语义为操作系统,模块提供了访问多个操作系统服务的功能,可以处理文件和目录这些我们日常手动需要做的操作.os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路 ...