首页 > 其他分享 >有意思的比赛trick

有意思的比赛trick

时间:2023-05-13 09:57:19浏览次数:43  
标签:i64 有意思 比赛 head int cnt st trick where

根号分治

CF : https://codeforces.com/contest/1822/problem/G2

//常用头文件! 
#include <bits/stdc++.h>
using namespace std;
typedef int64_t i64;
#define INF 0x3f3f3f3f  //这个是int的最大值  可直接赋值
#define lINF 0x3f3f3f3f3f3f3f //这个是long long 的最大值 
int t;
void solve()
{
	int n;
	cin>>n;
	vector<i64> a(n+1);
	map<i64,i64> s;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		s[a[i]]++;
	}
	i64 ans=0;
	for(auto [x,y]:s)
	{
		ans+=y*(y-1)*(y-2);
	if(x<1e6)
	{
		for(int i = 1; i * i<= x; i ++ )
		{
			if(x % i == 0)
			{
				if(i != 1) {
					if(s.count(x / i) && s.count(x * i)) ans += s[x / i] * s[x] * s[x * i];
				}
				int i1 = x / i;
				if(i1 != i) {
					if(s.count(x / i1) && s.count(x * i1)) ans += s[x / i1] * s[x] * s[x * i1];
				}
			}
		}
	}
	else
	{
		for(int i = 1; i * x <= 1e9; i ++ ) {
			if(x % i == 0) {
				if(i != 1) {
					if(s.count(x / i) && s.count(x * i)) ans += s[x / i] * s[x] * s[x * i];
				}
				int i1 = x / i;
				if(i1 != i) {
					if(s.count(x / i1) && s.count(x * i1)) ans += s[x / i1] * s[x] * s[x * i1];
				}
			}
		}
	}
	}
	cout<<ans<<'\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);     
	while(t--)
	{
		solve();
	}
	
	
}

换根dp的模板子

//常用头文件! 
#include <bits/stdc++.h>
using namespace std;
typedef int64_t i64;
#define INF 0x3f3f3f3f  //这个是int的最大值  可直接赋值
#define lINF 0x3f3f3f3f3f3f3f //这个是long long 的最大值 
int t;
bool st[300011];
struct node {
	int where;
	node *next;
}*head[200011],a[400011];
i64 f[2000011][2][2],v[2000011];//记录换根树的东西!
i64 h[2000011];//记录要花费多少来换根节点
int makelist(int x,int y,int cnt)
{
	a[++cnt].where=y;
	a[cnt].next=head[x];
	head[x]=&a[cnt];
	return cnt;
}
void up(int i)
{
	st[i]=1;
	for(node *y=head[i];y;y=y->next)
	{
		if(!st[y->where])
		{
			up(y->where);
			if(f[y->where][0][0]+1>f[i][0][0])
			{
				f[i][1][0]=f[i][0][0],f[i][1][1]=f[i][0][1];
				f[i][0][0]=f[y->where][0][0]+1,f[i][0][1]=y->where;
			}else if(f[y->where][0][0]+1>f[i][1][0])
			{
				f[i][1][0]=f[y->where][0][0]+1,f[i][1][1]=y->where;
			}
		}
	}

}
void bfs(int x,int c)//必须得bfs 才能求出准确代价!!
{
	vector<int> q(200015);
	int rear=0,front=1;
	q[++rear]=x;
//	cout<<q[1];
//	cout<<x;
//	cout<<1;
	while(front<=rear)
	{
		auto t=q[front++];
		//cout<<t<<endl;
		st[t]=1;
		for(node *p=head[t];p;p=p->next)
		{
			if(!st[p->where])
			{
				q[++rear]=p->where;
				h[p->where]=h[t]+c;
			}
		}
	}
}
void down(int i)
{
	st[i]=true;
	for(node *x=head[i];x;x=x->next)
	{
		if(!st[x->where])
		{
			if(f[i][0][1]==x->where)
			{
				if(v[i]>f[i][1][0])
					v[x->where]=v[i]+1;
				else v[x->where]=f[i][1][0]+1;
			}else {
				v[x->where]=max(v[i],f[i][0][0])+1;
			}
			down(x->where);
		}
	}
}
void solve()
{
	int n,k,c;
	cin>>n>>k>>c;
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		f[i][0][0]=0,f[i][0][1]=0;
		f[i][1][0]=0,f[i][1][1]=0;
		head[i]=0;
		h[i]=0;
		st[i]=0;
		v[i]=0;
	}
//	memset(f,0,sizeof(f));
//	memset(v,0,sizeof(v));
//	memset(head,0,sizeof(head));
//	memset(st,0,sizeof(st));
//	memset(h,0,sizeof(h));
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
//		cout<<x<<y<<endl;
		cnt=makelist(x,y,cnt);
		cnt=makelist(y,x,cnt);//这里去更新cnt
		//cout<<a[cnt].where;
	}
	bfs(1,c);//去看换根的花费!
	for(int i=1;i<=n;i++)
	st[i]=0;
	up(1);
	for(int i=1;i<=n;i++)
		st[i]=0;
	down(1);
	i64 ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,max(f[i][0][0],max(f[i][1][0],v[i]))*k-h[i]);
	}
	cout<<ans<<'\n';
}
int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(NULL);
//	cout.tie(NULL);
	cin>>t;
	while(t--)
	{
		solve();
	}
	//int i,j,k;
	//	__int128 a;
	//	a=1222;	
}

标签:i64,有意思,比赛,head,int,cnt,st,trick,where
From: https://www.cnblogs.com/--Lance/p/17396795.html

相关文章

  • 夺冠秘诀?华为软件精英挑战赛两届冠军这样复盘比赛经验
    摘要:作为两次获得全球总冠军的软挑老兵,刘露撰文分享其赛队参赛体验,包括解题思路及对抗策略、比赛收获等。本文分享自华为云社区《夺冠秘诀?华为软件精英挑战赛两届冠军这样复盘比赛经验》,作者:华为云社区精选。4月23日,2023第九届华为软件精英挑战赛-“普朗克计划”全球总决赛及颁......
  • 3651: 确定比赛名次
    描述 有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。  输入 输入有若......
  • 比赛胜率
    Problem有\(n\)天,每天有\(a_i\)场比赛。如果截止到第\(i\)天的胜率小于第\(i-1\)天的胜率,乐乐就会在第天心情变得更好;否则,他的心情会变得更糟。其中,第\(i\)天的胜率指的是,当\(i=0\)时为\(0\),否则指的是第\(i\)天之前玩游戏赢的次数总和除以第\(i\)天之前玩游戏......
  • AtCoder比赛记录(一)
    这里记录的是这个账号的比赛情况。ARC1572023-2-25Solved:4/62189->2216C(Medium,1802)给定一个XY矩阵,一条左上角到右下角的路径的分值定义为路径上连续两个Y的组数。求所有可能路径的分值的平方和。Solution:经典DP。递推两个量,一个是到(i,j)所有路径的分值和\(f_{i,j}\),......
  • AtCoder比赛记录(二)
    这里记录的是这个账号的比赛情况。ABC3002023-4-29Solved:7/80->1200F(Medium-,1846)给定由o和x组成的字符串\(S\)。将\(S\)复制\(m\)遍,然后将其中\(k\)个x改成o,求改完之后连续的o最多可能有多少个。Solution:贪心。设最多能改完\(t\)个完整的\(S\),考虑三类情况:最长连续......
  • 记录-有意思的气泡 Loading 效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助今日,群友提问,如何实现这么一个Loading效果:这个确实有点意思,但是这是CSS能够完成的?没错,这个效果中的核心气泡效果,其实借助CSS中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们之前的:使用纯C......
  • 比赛分析(完整版)
    一、数据分析该数据集采用COCO格式给出标注信息,即将所有训练图像的标注都存放到一个json文件中,数据以字典嵌套的形式存放。对数据集进行分析:检测数据集涉及3个场景,分别是“火灾检测”、“工业仪表检测”和“安全帽检测”,共7114张图像。这些图像按8:2的比例划分为训练集、验证集......
  • 不良条件视觉感知专栏(二)数据集和比赛总结
    前言 本文介绍了不良条件视觉感知专栏中的数据集和比赛总结。本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框......
  • 观"名声大震"绝赛,挖比赛内幕
           湖南台的"名声大震"已经结束,最终以4:2的结果结束.        就是在这个样一个结果里,让我看到了不少疑惑的地方.      1.主办方的分区以何为依据      2.主办方公布各分区成绩的次序又是以何为标准      3......
  • 2022年中国大学生程序设计竞赛女生专场-比赛题解
    比赛链接:Dashboard-2022年中国大学生程序设计竞赛女生专场-CodeforcesA.减肥计划(模拟)模拟,如果队列第一个人体重是最大的了,则这个人的位置不会再变,直接输出即可。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_......