「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场
挺神仙的一题。涉及区间加、区间除、区间最小值和区间和。虽然标算就是暴力,但是复杂度是有保证的。
我们知道如果线段树上的一个结点,\(max=min\) 或者 \(max=min+1\) 并且 \(d|max\),是可以直接剪掉的。
我们定义线段树上一个结点的势能为 \(\log(max-min)\),那么我们每执行一次区间除,都会引起势能的减小。
但是执行区间加时我们涉及 \(\log n\) 个结点,最差情况下会将它们的势能恢复为 \(\log(max-min)\)
所以总时间复杂度就是势能总和,不难分析为 \(O(n\log d+q\log n\log d)\)
类似的,我们可以分析区间开根区间加的时间复杂度,在此就不赘述了。
\(Code\ Below:\)
#include <cstdio>
#include <iostream>
#define int long long
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=100000+10;
const int inf=1e18;
int n,m,a[maxn],sum[maxn<<2],Max[maxn<<2],Min[maxn<<2],add[maxn<<2];
inline int read(){
	register int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return (f==1)?x:-x;
}
inline void pushup(int rt){
	sum[rt]=sum[lson]+sum[rson];
	Max[rt]=max(Max[lson],Max[rson]);
	Min[rt]=min(Min[lson],Min[rson]);
}
inline void pushtag(int rt,int C,int len){
	sum[rt]+=C*len;
	Max[rt]+=C;Min[rt]+=C;add[rt]+=C;
}
inline void pushdown(int rt,int len){
	if(add[rt]){
		pushtag(lson,add[rt],len-(len>>1));
		pushtag(rson,add[rt],len>>1);
		add[rt]=0;
	}
}
void build(int l,int r,int rt){
	if(l == r){
		sum[rt]=Max[rt]=Min[rt]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,lson);
	build(mid+1,r,rson);
	pushup(rt);
}
void update_plu(int L,int R,int C,int l,int r,int rt){
	if(L <= l && r <= R){
		sum[rt]+=(r-l+1)*C;
		Max[rt]+=C;Min[rt]+=C;add[rt]+=C;
		return ;
	}
	pushdown(rt,r-l+1);
	int mid=(l+r)>>1;
	if(L <= mid) update_plu(L,R,C,l,mid,lson);
	if(R > mid) update_plu(L,R,C,mid+1,r,rson);
	pushup(rt);
}
void update_div(int L,int R,int C,int l,int r,int rt){
	if(L <= l && r <= R){
		int A,B;
		if(Max[rt]<0) A=(Max[rt]-C+1)/C;
		else A=Max[rt]/C;
		if(Min[rt]<0) B=(Min[rt]-C+1)/C;
		else B=Min[rt]/C;
		if(Max[rt]-A==Min[rt]-B){
			pushtag(rt,A-Max[rt],r-l+1);
			return ;
		}
	}
	pushdown(rt,r-l+1);
	int mid=(l+r)>>1;
	if(L <= mid) update_div(L,R,C,l,mid,lson);
	if(R > mid) update_div(L,R,C,mid+1,r,rson);
	pushup(rt);
}
int query_min(int L,int R,int l,int r,int rt){
	if(L <= l && r <= R){
		return Min[rt];
	}
	pushdown(rt,r-l+1);
	int mid=(l+r)>>1,ans=inf;
	if(L <= mid) ans=min(ans,query_min(L,R,l,mid,lson));
	if(R > mid) ans=min(ans,query_min(L,R,mid+1,r,rson));
	return ans;
}
int query_sum(int L,int R,int l,int r,int rt){
	if(L <= l && r <= R){
		return sum[rt];
	}
	pushdown(rt,r-l+1);
	int mid=(l+r)>>1,ans=0;
	if(L <= mid) ans+=query_sum(L,R,l,mid,lson);
	if(R > mid) ans+=query_sum(L,R,mid+1,r,rson);
	return ans;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,n,1);
	int op,l,r,k;
	for(int i=1;i<=m;i++){
		op=read(),l=read(),r=read();l++;r++;
		if(op==1) k=read(),update_plu(l,r,k,1,n,1);
		if(op==2) k=read(),update_div(l,r,k,1,n,1);
		if(op==3) printf("%lld\n",query_min(l,r,1,n,1));
		if(op==4) printf("%lld\n",query_sum(l,r,1,n,1));
	}
	return 0;
}
「雅礼集训 2017 Day1」矩阵
构造题。
发现无解的情况就是全空的情况,特判掉即可。
现在考虑怎么算出最少步数。
发现只要第 \(i\) 行有黑色,那么第 \(i\) 列会在 \(tot_{white}\) 步变成全黑,所以我们来构造一行全黑的,然后将整个棋盘染成黑色。
那么每行取个最小值即可,累加一下。
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,m,h[maxn],l[maxn],ans,sum;
char s[maxn][maxn];
int main()
{
	scanf("%d%d",&n,&m);
	int flag=0;
	for(int i=1;i<=n;i++){
		scanf("%s",s[i]+1);
		for(int j=1;j<=n;j++)
			if(s[i][j]=='#'){
				flag=1;
				h[i]++;l[j]++;
			}
	}
	if(!flag){
		printf("-1\n");
		return 0;
	}
	ans=n;
	for(int i=1;i<=n;i++) ans=min(ans,n-h[i]+!l[i]);
	for(int i=1;i<=n;i++) sum+=l[i]!=n;
	printf("%d\n",ans+sum);
	return 0;
}
												
											「雅礼集训 2017 Day1」 解题报告的更多相关文章
- 「雅礼集训 2017 Day2」解题报告
		
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
 - [LOJ 6031]「雅礼集训 2017 Day1」字符串
		
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
 - [LOJ 6030]「雅礼集训 2017 Day1」矩阵
		
[LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...
 - [LOJ 6029]「雅礼集训 2017 Day1」市场
		
[LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...
 - loj#6031. 「雅礼集训 2017 Day1」字符串(SAM 广义SAM 数据分治)
		
题意 链接 Sol \(10^5\)次询问每次询问\(10^5\)个区间..这种题第一感觉就是根号/数据分治的模型. \(K\)是个定值这个很关键. 考虑\(K\)比较小的情况,可以直接暴力建SAM, ...
 - loj#6030. 「雅礼集训 2017 Day1」矩阵(贪心 构造)
		
题意 链接 Sol 自己都不知道自己怎么做出来的系列 不难观察出几个性质: 最优策略一定是先把某一行弄黑,然后再用这一行去覆盖不是全黑的列 无解当且仅当无黑色.否则第一个黑色所在的行\(i\)可以先把 ...
 - loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
		
题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...
 - 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题
		
题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...
 - 【loj6029】「雅礼集训 2017 Day1」市场  线段树+均摊分析
		
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...
 
随机推荐
- 【Web】Sublime Text 3 连接sftp/ftp(远程服务器)
			
在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...
 - GameObject.SendMessage
			
Message相关有3条指令: 要接收消息的GameObject.SendMessage ("函数名",参数,SendMessageOptions) //自身和父Objec ...
 - markdown中自己偶尔需要的小技巧
			
慢慢积累,需要时搜索,并记录与此. 1.写文章时,由于markdown不负责首行缩进,所以“空格”需要特殊的方法去实现,最简单方便的是--输入全角空格(切换全角输入,点空格) 2.markdown中注 ...
 - SpringMVC环境搭建和详解
			
1.Spring容器和SpringMVC容器是父子容器 1.1 SpringMVC容器可以调用Spring容器中的所有内容 1.2 图示 2.SpringMVC环境搭建 1.导入jar包 2.在web ...
 - 字符串算法hash
			
思路:给字符串做一个映射,两个元素相同,则他们的hash值必定相同. 注意:hash表必须是unsigned int类型,保证每个映射都是正数. 例题: Description 给出两个字符串W和T, ...
 - CProgressCtrl进度条控件实现进度滚动效果
			
关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...
 - MFC单文档带窗体创建
			
我用的vs05.先随便起个名字qwerty. 确定以后在左边最下面有一个生成的类,点击生成的类,把基类改成CFormView 最后点击完成就创建好了. 单文档的窗口不是后来创建后插入的,是在创建后就自 ...
 - Mybatis-Plus 实战完整学习笔记(十)------条件构造器核心用法大全(下)
			
31.升序orderByAsc 31.升序orderByAsc List<Employee> employeeList = employeeMapper.selectList(new Qu ...
 - SVN被锁定的几种解决方法
			
用SVN经常出现被锁定而无法提交的问题,选择解锁又提示没有文件被锁定,很是头疼.这里整理了一下SVN被锁定的几种解决方法: 1.出现这个问题后使用“清理”即"Clean up"功能 ...
 - BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)
			
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 6519 Solved: 3026[Submit] ...