首页 > 其他分享 >二月の题

二月の题

时间:2024-02-02 11:12:18浏览次数:21  
标签:int ll rx 二月 ans 散块 lx

为什么会有文化课寒假作业???

P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I

傻逼卡常题去似吧

强制在线考虑分块。先把区间的贡献给拆开,珂以拆成下面图的形式:

其中绿色是整块内部的贡献,橙色是单个散块内部贡献,蓝色是散块对散块的贡献,红色是散块和整块之间的贡献。考虑分开来处理四个部分。

橙色部分,单个块的贡献考虑用树状数组求出逆序对,没啥好说,注意我们后面要维护前后缀和的时候注意树状数组加减值是什么以及加减的顺序。

绿色珂以预处理一个 \(sum\) 表示 \(i\) 到 \(j\) 块的贡献,处理这个珂以先记录每个块中小于等于 \(x\) 的数的个数,然后对这个做块之间的前缀和,处理的时候假设左块为 \(i\) 右块为 \(j\),对于 \(j\) 块的每一个数差分出前面比它大的数的个数,求和,最后加上 \(j\) 块内部的贡献还有 \(sum[i][j-\mathbf{1}]\)。

蓝色可以考虑新开一个数组赋值原数组,然后对这个数组在每个块内从小到大排序,还要按他原来的位置排。查询的时候就两个单调指针往后扫,如果指的数原下标不在查询区间内就跳过,左边指的数小于右边的就左边指针跳,否则右边的一直跳,贡献是左边剩下的有效的数,具体细节看代码。

红色部分考虑我们前面记录的 \(cnt\mathtt{2}\) 也就是每个块中小于等于 \(x\) 的数的个数,块之间的前缀和。直接枚举左右散块的数然后对中间整块差分就行了。

但是毒瘤 \(\mathtt{lxl}\) 他妈就喜欢卡常,这代码是对的,但是思路和实现还是太繁琐了,之后有时间再来写吧。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define in inline 
const ll N=100100,M=400;
struct xx{
	ll val;
	int id;
}b[N];
in bool cmp(xx x,xx y){
	return x.val==y.val?x.id<y.id:x.val<y.val;
} 
int n,m;
ll a[N];
int ns,nq,st[400],ed[400],bel[N];
ll sum1[400][400],sum2[400][N],sum3[400][N];
int sum[N];
//i~j整块贡献、每个块逆序对数前缀/后缀和
int cnt1[400][N];
ll cnt2[400][N];
int c[N];
//cnt1每个块内小于等于j的数的个数,cnt2是cnt1块间前缀和
in int lowbit(int x){return x&-x;}
in void update(int x,int k){
	while(x<=n){
		c[x]+=k;
		x+=lowbit(x);
	}
}
in int query(int x){
	int ans=0;
	while(x){
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}
int c1[350],c2[350];
in ll calc(ll l,ll r){
	if(l>r) return 0ll;
	ll ans=0; int lx=bel[l],rx=bel[r];
	if(lx==rx){
		ans=sum2[rx][r]-sum2[lx][l-1];
		int t1=0,t2=0;
		for(int i=st[lx];i<=ed[lx];++i)
			if(b[i].id<l) c1[++t1]=b[i].val;
			else if(b[i].id<=r) c2[++t2]=b[i].val;
		for(int i=1,j=1;i<=t1;++i){
			while(j<=t2&&c1[i]>c2[j]) ++j;
			ans-=j-1;
		}
		return ans;
	}
	ans+=sum2[rx][r]+sum3[lx][l]; //散块内部贡献
	int j=st[rx],i_cnt=0,i_n=ed[lx]-l+1;
	for(int i=st[lx];i<=ed[lx];++i){ //散块之间贡献 
		if(b[i].id<l) continue;
		++i_cnt;
		while(j<=ed[rx]&&b[j].val<b[i].val){
			if(b[j].id<=r) ans+=i_n-i_cnt+1;
			++j;
		}
	}
	if(rx>lx+1){
		ll siz=ns*((rx-1)-(lx+1)+1);
		for(int i=l;i<=ed[lx];++i) ans+=cnt2[rx-1][a[i]]-cnt2[lx][a[i]]; 
		for(int i=st[rx];i<=r;++i) ans+=siz-(cnt2[rx-1][a[i]]-cnt2[lx][a[i]]); //整散之间贡献
	}
	if(rx>lx+1) ans+=sum1[lx+1][rx-1]; //整块贡献
	return ans;
}
int main(){
	n=read(),m=read(); ns=260,nq=ceil(n*1.0/ns);
	for(int i=1;i<=n;++i) a[i]=read(),b[i]=(xx){a[i],i};
	for(int i=1;i<=nq;++i){
		st[i]=ns*(i-1)+1,ed[i]=min(ns*i,n);
		for(int j=st[i];j<=ed[i];++j){
			bel[j]=i;
			update(a[j],1);
			sum[j]=(j-st[i]+1)-query(a[j]);
			sum2[i][j]=sum2[i][j-1]+sum[j];
			//散块内部贡献,每个块内逆序对数前缀和
			++cnt1[i][a[j]];
		}
		for(int j=1;j<=n;++j) cnt1[i][j]+=cnt1[i][j-1],cnt2[i][j]=cnt2[i-1][j]+cnt1[i][j];
		for(int j=st[i];j<=ed[i];++j) update(a[j],-1);
		sort(b+st[i],b+ed[i]+1,cmp);
		
	}
	for(int i=1;i<=nq;++i){
		for(int j=i;j<=nq;++j){
			for(int k=st[j];k<=ed[j];++k){
				ll siz=ns*((j-1)-i+1);
				sum1[i][j]+=siz-(cnt2[j-1][a[k]]-cnt2[i-1][a[k]]);
			}
			sum1[i][j]+=sum1[i][j-1]+sum2[j][ed[j]];
		}
		for(int j=ed[i];j>=st[i];--j) update(a[j],1),sum[j]=query(a[j]-1);
		for(int j=ed[i];j>=st[i];--j) update(a[j],-1),sum3[i][j]=sum3[i][j+1]+sum[j];
	}
	ll las=0;
	for(int i=1;i<=m;++i){
		ll x,y;
		x=read(),y=read();
		x^=las,y^=las;
		las=calc(x,y);
		write(las),putchar('\n');
	}
	return 0;
}

但我还是想骂人,妈的这题想了两天写加调了两天半最后他妈被卡常,淦,再也不做傻逼卡常题了/fn

标签:int,ll,rx,二月,ans,散块,lx
From: https://www.cnblogs.com/heshuwan/p/18002747

相关文章

  • 十二月阅读笔记三
    书中指出,实例化需求仅仅只是防止退化的有效条件。从保证软件质量角度,实例化需求所做的长期投资并不是非常划算。 以文档为中心的模型所具有的好处: 交付团队应该把测试文档看做是一个单独工件,与交付的系统等同重要。把文档当成关键性交付物是以文档为中心的模型最核心的部分。 ......
  • 十二月十二日破防记录
    【详细解密】CQ-01怎样写Pollard-Rho写破防【既然遇到了就来学一学pollard-rho吧】.jpg这是怎么会是呢?感觉对着题解抄都抄不对啊!/fn/fn/fn把数据下下来一个一个调,最后发现是随机的时候RE了???经过仔细观察,发现我写随机的时候写的是:uniform_int_distribution<>u(2,x-1);......
  • 十二月阅读笔记一
    《实例化需求》阅读笔记一在苦寻敏捷测试的过程中,看一本书,关于如何提高敏捷过程中需求、开发和验收的测试效率,让我很是感兴趣,这本书名《实例化需求:团队如何交付正确的软件》。关于如何处理需求说明与测试,不同的组织使用不同的名称,或者说是不同的定义,但他们都有一套共同的核......
  • 机械转码,本来以为只能去比亚迪,没想到十二月份华为、百度、美团等都给我开了...
    作者:阿秀校招八股文学习网站:https://interviewguide.cn你好,我是阿秀。今天分享一位非科班师弟的两年学习经历,他是在上个月的时候跟我私聊说自己上岸华为了,华为给他开的是15级,然后马上就找比亚迪毁约了。。。迪子VS华子,肯定还是华子更香一些的。。。2022.12.19号的事情了秀......
  • “百度杯”CTF比赛 2017 二月场——Web-爆破-3
    ==================================个人收获:1.php中MD5()计算数组会返回null如果用==0则为真 ==================================  题目:主要是代码审计,大家可以自己百度下都能看得懂的,这里我就直说关键的部分 关键部分代码在这if($_SESSION['whoami']==($value[0].$value[1......
  • 农历为什么会有“闰月”,今年为啥要“闰二月”?一文读懂
    2023年2月21日是农历二月初二。“二月二”起码从元朝开始就是一个很重要的日子。老话讲:“二月二,龙抬头。”过了三十天,到了2023年3月23日,你猜怎么着?请看月份牌:......
  • 二月最后一天的总结
    今天找网友面基了,对方浓度过高导致我差点招架不住,正常存活,也算是多了一个朋友导致今天没学多少东西,不过收获还是有一点点的。首先是自己用原生的控件写了一个导航,具体如......
  • 二月二十一号
    今天练习时间大约一小时左右。解决了mysql数据库不能输入中文的编码问题,解决办法是打开my.ini文件,在在[client]下加default-character-set=utf8、在在[mysqld]下加charac......
  • 二月不减肥三月徒伤悲,手机怎么每天提醒自己减肥?
    进入2023年的公历2月后,我国很多地区的天气都在转暖,紧接着我们身上的衣服就要一件一件变薄了,再等一段时间就到了需要“露肉”的季节。爱美之心人皆有之,于是有不少女孩们都......
  • Jenkins 贡献者线上峰会 - 二月 23 日至 25 日
    翻译:0N0thingJenkins贡献者峰会让Jenkins项目目前以及将来的贡献者们能够齐聚一堂。今年我们主持本次线上峰会是为了鼓励全世界的贡献者们相互了解、讨论、规划未来。此......