首页 > 其他分享 >AtCoder Beginner Contest 252

AtCoder Beginner Contest 252

时间:2023-03-04 18:55:06浏览次数:56  
标签:AtCoder idx Beginner 面包 int void push 252 dis

AtCoder Beginner Contest 252

D

题意

在数组中形如 \(1\leq i<j<k\leq n\)使得\(a_i,a_j,a_k\)互不相同,求共有多少组满足条件

思路

它的数据范围\(1\leq a_i\leq 2*10^5\),这就用个数组求个前缀和就搞定了。

代码

void solve() 
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],cnt[a[i]]++;
	int ans=0;
	for(int i=1;i<N;i++) sum[i]=sum[i-1]+cnt[i];
	for(int i=1;i<N;i++) 
	{
		ans+=cnt[i]*sum[i-1]*(sum[N-1]-sum[i]);
	}
	cout<<ans<<endl;
}

E (最短路)

题意

给个n个节点m条边的图,问把最短路弄出来后需要保留哪些边。

思路

dijkstra 求一遍,加个参数表示当前边的序号,表示在最短路中当前结点和父节点是通过该条边连接的。
这题最大的收获不是复习这个最短路,而是发现了memset不能赋值
1e18,以后还是用fill初始化吧

代码

void add(int a,int b,int c,int i) 
{
	e[idx]=b;
	w[idx]=c;
	id[idx]=i;
	ne[idx]=h[a];
	h[a]=idx++;
}

void dijk() 
{
	memset(dis,inf,sizeof(dis));
	dis[1]=0;
	priority_queue<pii> q;
	q.push({0,1});
	while(q.size()) 
	{
		pii tmp = q.top();
		int u=tmp.second;
		q.pop() ;
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=h[u];i!=-1;i=ne[i]) 
		{
			int j=e[i];
			if(dis[j]>dis[u]+w[i]) 
			{
				dis[j]=dis[u]+w[i];
				q.push({-dis[j],j});
				use[j]=id[i];
			}
		}
	}
}

void solve() 
{	
	memset(h,-1,sizeof(h));
	cin>>n>>m;
	for(int i=1;i<=m;i++) 
	{
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c,i);
		add(b,a,c,i);
	}
	dijk();
	for(int i=2;i<=n;i++) cout<<use[i]<<" ";
	cout<<endl;
}

F

题意

一块长为L的面包,然后有n个小朋友,每个人要吃\(A_i\)长度的面包,将一块长为x的面包切一下需要花费x,这块面包就变成x-k和k了。问最少花费多少来满足小朋友的要求,面包可以有剩下。

思路

经典枯坐半小时, 还是灰溜溜看题解
逆向思维。贪心地想,一块面包肯定是从一块长度大于它且是最短的面包中切出来的,所以这块面包应该和其他面包中最短的那个组合起来的,这样是最优解。

代码

void solve() 
{
	cin>>n>>m;
	priority_queue<int> q;
	int sum=0;
	for(int i=1;i<=n;i++) 
	{
		int x;
		cin>>x;
		q.push(-x);
		sum+=x;
	} 
	if(m-sum>0) q.push(sum-m);
	int ans=0;
	while(q.size()>1) 
	{
		int x1=q.top();q.pop();
		int x2=q.top();q.pop();
		ans-=x1+x2;
		q.push(x1+x2);
	}
	cout<<ans<<endl;
}

车到山前必有路,而且有两条,一条是回去的路,而另一条,是上山的路

标签:AtCoder,idx,Beginner,面包,int,void,push,252,dis
From: https://www.cnblogs.com/LIang2003/p/17178833.html

相关文章

  • AtCoder Beginner Contest 251
    AtCoderBeginnerContest251D给定一个1e6范围内的数n,要你构造出一个数组,对于1~n中的任何一个数都能用数组中最多三个数的和加起来。这题真的是很好的一道思维题,想了我......
  • AtCoder Regular Contest 155
    期末考完复健,补一下一个月前打的ARC当时赛后9秒过D,太痛了,第一次体验这种只能说,幸好当时要打的时候感觉状态不行,就unrated了比赛的状况是:A不知道哪错了;C不会;D博弈DP原......
  • AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)(D,E,F)
    AtCoderBeginnerContest291(SponsoredbyTOYOTASYSTEMS)(D,E,F)DD又一次误解题意这个题的要求是相邻的两个数不同,而我的翻译上是整个数列的数都是不同的(ಥ﹏ಥ)大意是......
  • Gym101252B-Kakuro题解
    题目传送门题意:有一个矩阵,每个格子为黑色或白色。你需要向白色格子中填\(1\sim9\)的整整睡。从某一个黑色格子的右侧往右连续的一段极长的白色格子被称为一个run,往下......
  • AtCoder Beginner Contest 275 A-F 题解
    比赛链接砳赫賏,看懂扣1(A-FindTakahashi模拟。#include<cstdio>#include<algorithm>usingnamespacestd;intn,mx,id=1;intmain(){ intx; scanf("%d......
  • Atcoder ARC084D Small Multiple
    \(O(k)/O(k)\)解法标签:建图最短路考虑对于一个数\(x\),考虑由它在末尾改变能产生哪些状态:\(x+1\),此时对应的数位和\(+1\)\(x\times10\),对应数位和不变那直接把......
  • 数据库报ORA-00600 [2252]错误
    同事运维的数据库出现了一个ORA-00600 [2252]错误,针对该问题简单记录下。1、alter日志信息:TueFeb2814:22:302023Errorsinfiled:\app\diag\rdbms\pubb\pubb\trac......
  • [AtCoder Grand Contest 060][C. Large Heap]
    看了几篇题解都是从下往上(子树大小从小到大)推的,来整一个从上往下的。题目链接:C-LargeHeap题目大意:称一个大小为\(2^N-1\)的排列是好排列当且仅当其满足对任意\(1\l......
  • AtCoder Beginner Contest 280 A-F 题解
    比赛链接A-PawnonaGrid模拟。#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintN=15;intn,m,ans;chars[N];i......
  • AtCoder Beginner Contest 279 A-E 题解
    比赛链接A-wwwvvvvvv直接模拟#include<cstdio>#include<cstring>constintN=105;intn,ans;chars[N];intmain(){ scanf("%s",s+1); for(inti=1......