首页 > 其他分享 >2023.7.6拷逝

2023.7.6拷逝

时间:2023-07-06 20:37:06浏览次数:47  
标签:200005 int cntl 括号 2023.7 cntr 拷逝 include

T1

原题链接

对于区间 \([l,r]\) ,答案是 \(max(cntr,cntl)-x\) (其中 \(cntl,cntr\) 分别表示区间内左括号和右括号的数量, \(x\) 表示匹配的括号数量)。

首先考虑 \(max(cntr,cntl)\) 。该柿子可以转化成 \((cntl+cntr+|cntr-cntl|)/2\) 。前面的 \(cntl+cntr\) 非常好算,就是 \(\sum_{i=1}^n i*(n-i+1)\) 。后面带绝对值的柿子怎么算呢?可以令 \(1\) 表示左括号, \(-1\) 表示右括号,求一个前缀和。然后将前缀和从小到大排序。对于排序后的前缀和 \(sum[i]\) ,它对答案的贡献是 \(i\times sum[i]-\sum_{j=0}^{j-1}sum[j]\) 。最后别忘了除以 \(2\) 。

再考虑 \(x\) 。我们用栈模拟匹配过程,如果发现一对匹配的括号(用 \(posl\) 表示左括号的位置, \(posr\) 表示右括号的位置),那么它会在 \((n-posr+1)\times posl\) 个区间中出现。那么它对答案的贡献就是 \(-(n-posr+1)\times posl\) 。

这样就可以在 \(O(n)\) 的复杂度内求得答案。

\(code:\)

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long n,t,s[200005],stk[200005],r,ans;char a[200005];
int main(){
	freopen("common.in","r",stdin);
	freopen("common.out","w",stdout);
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%s",&n,a);
		ans=0;s[0]=0;
		for(int i=1;i<=n;++i)
			ans+=i*(n-i+1);
		for(int i=1;i<=n;++i){
			if(a[i-1]=='(') s[i]=s[i-1]+1;
			else s[i]=s[i-1]-1;
		}
		sort(s,s+n+1);
		long long sum=0;
		for(int i=0;i<=n;++i){
			ans+=s[i]*i-sum;
			sum+=s[i];
		}//cout<<ans<<endl;
		ans/=2;
		r=0;
		for(int i=0;i<n;++i){
			if(a[i]=='(')
				stk[++r]=i+1;
			else if(r>0){
				ans-=(n-i)*stk[r];//stk[r]~i+1
				--r;
			}
		}
		printf("%lld\n",ans);
	}
	fclose(stdin);fclose(stdout); 
	return 0;
}

T3

原题链接

首先有一个性质,任意两个三角形没有公共的部分,因为如果有公共部分一定不如把它们合起来更优。

然后就可以考虑 \(dp\) 。设 \(f[i]\) 表示考虑了 \(x\) 坐标在 \([0,i]\) 内的所有点,存在一个右下角的横坐标为 \(i\) 的三角形时的最小代价。枚举上一个三角形的结束位置,则状态转移方程为:

\(f[i]=min_{j<i}(f[j]+(i-j-1)\times A+cost)\)

其中, \(cost\) 为所有满足 \(j<x<=i,1<=y<k-i\) 的点的 \(c\) 之和。

然后用线段树维护即可。

\(code:\)

#include<iostream>
#include<vector>
#include<cstdio>
#define ll long long
using namespace std;
ll n,k,A,ans,x,y,z,cnt[200005],f[200005];
struct node{
	int l,r;ll minn,lazy;
} p[800005];
struct node2{
	int x;ll w;
};vector <node2> a[200005];
void build(int u,int l,int r){
	p[u].l=l;p[u].r=r;
	if(l==r)
		return ;
	int mid=(l+r)>>1;
	build(u<<1,l,mid);build(u<<1|1,mid+1,r);
}
void push_down(int u){
	p[u<<1].minn+=p[u].lazy;
	p[u<<1|1].minn+=p[u].lazy;
	p[u<<1].lazy+=p[u].lazy;
	p[u<<1|1].lazy+=p[u].lazy;
	p[u].lazy=0;
}
void add(int u,int l,int r,ll w){
	if(p[u].l>=l&&p[u].r<=r){
		p[u].minn+=w;p[u].lazy+=w;
		return ;
	}
	push_down(u);
	int mid=(p[u].l+p[u].r)>>1;
	if(mid>=l)
		add(u<<1,l,r,w);
	if(mid<r)
		add(u<<1|1,l,r,w);
	p[u].minn=min(p[u<<1].minn,p[u<<1|1].minn); 
}
ll ask(int u,int l,int r){
	if(p[u].l>=l&&p[u].r<=r)
		return p[u].minn;
	push_down(u);
	int mid=(p[u].l+p[u].r)>>1;ll re=1e18;
	if(mid>=l)
		re=min(re,ask(u<<1,l,r));
	if(mid<r)
		re=min(re,ask(u<<1|1,l,r));
	return re;
}
int main(){
	ans=1e18;
	scanf("%lld%lld%lld",&n,&k,&A);
	build(1,1,k+2);
	for(int i=1;i<=n;++i){
		scanf("%lld%lld%lld",&x,&y,&z);
		a[y].push_back((node2){x,z});
		if(x+y!=k)
			cnt[x]+=z;
	}
	for(int i=0;i<=k;++i){
		for(int j=0;j<a[k-i].size();++j)
			add(1,1,a[k-i][j].x+1,-a[k-i][j].w);
		add(1,1,i+1,cnt[i]);
		if(i!=0)
			add(1,1,i,A);
		f[i]=ask(1,1,i+1);
		add(1,i+2,i+2,f[i]);
	}
	printf("%lld\n",f[k]);
	fclose(stdin);fclose(stdout);
	return 0;
}

标签:200005,int,cntl,括号,2023.7,cntr,拷逝,include
From: https://www.cnblogs.com/andyl/p/17533255.html

相关文章

  • 2023.7.6做题笔记
    数论矩阵快速幂[NOI2012]随机数生成器这道题递推公式已经给我们了\[X_{n+1}=(aX_n+c)\bmodm\]但是如果用这个递推式如果直接使用的会超时,所以我们用矩阵快速幂来优化首先我们构造初始矩阵:\(\begin{bmatrix}X_{i-1}&c\end{bmatrix}\)根据递推式我们可以知道\[X_i=X_......
  • 2023.7.6
    1//2023.7.6周四2//java流程控制3//scanner45publicstaticvoidmain(String[]args)6{7//next方式不能读取有空格的字符串89//创建一个扫描对象用于接收键盘数据10Scannerscanner=newScanner(System.in);1112S......
  • 2023.7.6
    学习java中的类面向对象与面向过程面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象:强调具备了功能的对象,以类/对象为最小单位类与对象的关系类:对一类事物的描述,是抽象的、概念上的定义对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)面向对象......
  • day82(2023.7.5)
    1.什么是框架? ......
  • 2023.7.5
    快乐的一天从牛肉面开始,早上吃完东西后就去乡下的老家了,和舅舅约定好去钓鱼的,他还在忙着装修老房子呢,我就刷了一会儿手机,等到中午吃完饭才忙完,我带了我爸的渔具,舅舅可是个钓鱼行家,装备十分精良,钓了一下午,我只起了一条一斤的鲤鱼,他才厉害,钓了一条大的好像是2斤半的鲫鱼,总共加起来的......
  • 2023.7.5
    1//2023.7.5周三2publicstaticvoidmain(String[]args)3{4//字符串连接符+5inta=10;6intb=20;7System.out.println(""+a+b);//输出:10208System.out.println(a+b+"");//输出:30910}11//java......
  • 2023.7.5
    过了零点应该就算是今天了吧,所以说是在今天睡前了解到了p2p这个东西,听的一知半解但是很高兴能了解到它。今天准备学习,但是不多,似乎又被睡觉占领了大部分时间。上午又重新下了一个编译器,据说那个很好用。之后开始看《大道至简》,准备写读后感。但是中午清醒的大脑又被困倦占领,于......
  • 2023.7.5 杂题
    CF1174FEhabandtheBigFinale树链剖分。先s1求出\(x\)所在子树\(y\)。若\(y\)为\(1\)轻儿子,递归求解\(y\)。若\(y\)为重儿子,那么找到重链上与\(x\)深度相同的节点\(c\).调用dc,此时\(c\)向上跳\(x\)与\(c\)距离的一半便是\(lca\),递归求解。相当......
  • 2023.7.5
    学习java中的类面向对象与面向过程面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象:强调具备了功能的对象,以类/对象为最小单位类与对象的关系类:对一类事物的描述,是抽象的、概念上的定义对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)面向对象......
  • 2023.7.4
    今天读了几页《大道至简》,做了几道pta的题目,学习了Java程序的运行,也就是《疯狂Java讲义》1.5.3部分的内容,刚刚启蒙,明天打算再读三节,pta明天多做一些,计划大概8-10个。在语系的过程中遇到一些问题,通过网上查资料解决了问题,今天大概就这样,明天见。......