首页 > 其他分享 >CF1779D Boris and His Amazing Haircut 题解

CF1779D Boris and His Amazing Haircut 题解

时间:2023-01-06 21:45:57浏览次数:66  
标签:Boris le return int 题解 pos His maxn hei

可能更好的阅读体验

题目传送门
题目翻译

题目解析

如果有 \(a_i<b_i\) 直接输出 NO
我们发现:如果 \(b_l=b_r=x\) 并且所有的 \(l\le i \le r\) 都有 \(b_i\le x\) 那么就可以一次解决。
也就是说,如果 \(b_l=b_r\) 并且所有的 \(l\le i \le r\) 都有 \(b_i\le x\) 那么我们就可以合并 \(l,r\),否则就要分开两次。当然 \(a_i=b_i\) 的话直接忽略 \(i\) 即可。
所以问题就转化为求一个区间内是不是比 \(x\) 都小。
我们考虑可以再转化为求一个区间内比 \(x\) 小的数的个数,所以直接树套树就好了!
考虑从小到大处理所有数,然后处理好了这个数字就把辅助序列的对应位置加一,然后树状数组维护区间和。
这样我们就知道对于每个 \(x\) 至少要用几次,看看是不是给出的数量大于等于需要的数量即可。
时间复杂度:\(\Theta(n\log n)\)

赛时写的一点都不简单易懂的代码:

int n,m,a[maxn],b[maxn],c[maxn],f[maxn];
struct JTZ{
	int pos,hei;
	bool operator < (const JTZ x) const {
		if(this->hei == x.hei) return this->pos < x.pos;
		return this->hei < x.hei;
	}
}arr[maxn];
int cc[maxn];
#define lowbit(x) (x&-x)
void add(int x,int y){ while(x<=n) cc[x]+=y,x+=lowbit(x); return; }
int que(int x){ int sum=0; while(x) sum+=cc[x],x-=lowbit(x); return sum; }
int que_i(int l,int r){ if(l>r) return 1; return que(r)-que(l-1)==r-l+1; }
void work(){
	n=read(); int i,r,j=1,k,cnt,las; for(i=1;i<=n;i++) cc[i]=0;
	for(i=1;i<=n;i++) a[i]=read(); for(i=1;i<=n;i++) b[i]=read();
	m=read(); for(i=1;i<=m;i++) c[i]=read(); sort(c+1,c+m+1);
	for(i=1;i<=n;i++) if(a[i]<b[i]){ puts("NO"); return; }
	for(i=1;i<=n;i++) arr[i].pos=i,arr[i].hei=b[i]; sort(arr+1,arr+n+1);
	for(i=1;i<=n;i=r){
		for(r=i;r<=n;r++) if(arr[i].hei!=arr[r].hei) break;
		las=cnt=0;
		for(k=i;k<r;k++){
			add(arr[k].pos,1); if(arr[k].hei==a[arr[k].pos]) continue;
			if(las==0){ cnt=1; las=arr[k].pos; }
			else{
				if(!que_i(las+1,arr[k].pos-1)) cnt++;
				las=arr[k].pos;
			}
		}
		while(j<=m&&c[j]<=arr[i].hei) cnt-=(c[j]==arr[i].hei),j++;
		if(cnt>0){ puts("NO"); return; }
	} puts("YES"); return;
}

标签:Boris,le,return,int,题解,pos,His,maxn,hei
From: https://www.cnblogs.com/jiangtaizhe001/p/17031653.html

相关文章

  • MaoWei-2020-HistoryRepeatsItself-ECCV
    HistoryRepeatsItself:HumanMotionPredictionviaMotionAttention#paper1.paper-info1.1MetadataAuthor::[[WeiMao]],[[MiaomiaoLiu]],[[MathieuSal......
  • CF1779A Hall of Fame 题解
    可能更好的阅读体验题目传送门题目翻译有\(n\)个纪念碑以及对应的\(n\)个台灯。给定一个由L和R组成的序列\(a\),代表台灯的朝向。如果第\(i\)个台灯为L,代......
  • 【题解】P4027 [NOI2007] 货币兑换
    题意好长,但是不想概括了。\cdq/!思路cdq分治+凸包。首先考虑令\(f_i\)表示第\(i\)天可以得到的最大金额,\(f_1=s\)因为\(rate_i\)是常数,并且保证存在最优方......
  • 【题解】CF1178G The Awesomest Vertex
    题意给定一棵大小为\(n\)的树以及\(m\)个操作,定义一个结点\(u\)的权值为:\(|\sum\limits_{w\inR(v)}a_w|\cdot|\sum\limits_{w\inR(v)}b_w|\)其中\(R(v)......
  • 230102模拟题解
    t1容易发现对于奇数和偶数,能满足条件的长度分别是单调的,所以可以分别二分答案检查。检查的时候对于差分序列做哈希即可,然后用set/map/哈希表判\(B\)的子段是否有\(A......
  • CF865B Ordering Pizza 题解
    简要题意:有\(n\)个人去披萨店吃披萨,有两种披萨,每个披萨有\(m\)片。现在第\(i\)个人要吃\(c_i\)片披萨,如果吃一片第一种披萨会获得\(a_i\)的幸运值,如果吃一片第二......
  • configmap出现/n问题解决
    1.现象原始文件肉眼显示正常,如下图命令行显示整个data部分成了一坨,回车全变成了/n,虽然不影响使用,但是对维护查看比较麻烦,如下图2.问题原因1.配置文件里有一些Tab......
  • [CTSC2009]魔幻花园 题解
    [CTSC2009]魔幻花园题解洛谷链接。一、问题转化原问题等价于求某个水平面上所有点围成凸包的面积的最小值。首先考虑把三维问题转化到二维上:考虑到任意时刻所有点都在......
  • 【C语言】解决error C4996: 'fopen': This function or variable may be unsafe. Cons
    转载:http://t.csdn.cn/WkbhK几天编译文件的时候报错,编译出错信息:错误1errorC4996:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinst......
  • I. 西行妖下题解
    题目内容原题链接样例输入5201样例输出?44232?35155?52431!32154题解首先,题目有一个很难解决的痛点,就是他只会返回最前面的那......