首页 > 其他分享 >杂题 Solution 速通 #1

杂题 Solution 速通 #1

时间:2024-08-09 20:49:40浏览次数:12  
标签:return 速通 int Solution read lll buc 杂题 rk

[ICPC2021 Nanjing R] Ancient Magic Circle in Teyvat

设 \(f_x\) 表示钦定至少有 \(x\) 条边的四元子图个数,由容斥我们有一条边都没有的子图个数是 \(f_0-f_1+f_2-f_3+f_4-f_5+f_6\),而所有边都有的个数就是 \(f_6\)。作差之后只需要求 \(f_0,f_1,f_2,f_3,f_4,f_5\)。

子图计数只要不是数 \(K_4\),其它所有的四元图都是好做的,把你会的三元环、四元环、\(K_4\) 少一条边的计数方法全用上就可以了。

#include <cstdio>
#include <vector>
using namespace std;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=x*10+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int N=100003,M=200003;
typedef long long ll;
typedef __int128 lll;
int n,m;lll res;
void write(lll x){if(x>9) write(x/10);putchar((x%10)^48);}
lll C4(int x){return (lll)x*(x-1)*(x-2)*(x-3)/24;}
lll C3(int x){return (lll)x*(x-1)*(x-2)/6;}
lll C2(int x){return (lll)x*(x-1)>>1;}
int eu[M],ev[M],d[N];
vector<int> adj[N],vec[N],ec[N];
int vis[N],ps[N];
inline bool cmp(int x,int y){
	if(d[x]!=d[y]) return d[x]>d[y];
	return x<y;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;++i){
		eu[i]=read();ev[i]=read();
		adj[eu[i]].emplace_back(ev[i]);
		adj[ev[i]].emplace_back(eu[i]);
	}
	for(int i=1;i<=n;++i) d[i]=adj[i].size();
	for(int i=1;i<=m;++i)
		if(cmp(eu[i],ev[i])) vec[eu[i]].emplace_back(ev[i]);
		else vec[ev[i]].emplace_back(eu[i]);
	for(int i=1;i<=n;++i) ec[i].resize(vec[i].size());
	res=C4(n)-m*C2(n-2);
	lll tmp=0;
	for(int i=1;i<=m;++i){
		tmp+=(lll)(d[eu[i]]+d[ev[i]]-2)*(n-4);
		res-=(lll)(d[eu[i]]-1)*(d[ev[i]]-1);
	}
	res+=C2(m)+(tmp>>1);
	for(int x=1;x<=n;++x){
		res-=C3(d[x]);
		int id=0;
		for(int y:vec[x]) vis[y]=x,ps[y]=id++;
		id=0;
		for(int y:vec[x]){
			int nid=0;
			for(int z:vec[y]){
				if(vis[z]==x){
					res+=d[x]+d[y]+d[z]-n;
					res-=ec[x][id]++;
					res-=ec[x][ps[z]]++;
					res-=ec[y][nid]++;
				}
				++nid;
			}
			++id;
		}
	}
	for(int x=1;x<=n;++x){
		for(int y:vec[x])
			for(int z:adj[y]) vis[z]=0;
		for(int y:vec[x])
			for(int z:adj[y]) if(cmp(x,z)) res+=vis[z]++;
	}
	if(res<0) res=-res;
	write(res);putchar('\n');
	return 0;
}

[GDCPC2023] Classic Problem

套路题,离散化之后 Boruvka 一下就行了。

我为啥这玩意需要写拍才能调出来啊?

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define fi first
#define se second
typedef pair<int,int> pii;
typedef long long ll;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=x*10+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int N=100003,M=400013;
const int INF=0x3f3f3f3f;
int n,m;ll res;
int eu[N],ev[N],ew[N];
int buc[M],rk;
vector<pii> vec[M];
vector<int> arr[M];
int f[M],dir[M],mn[M];
int rt(int x){
	if(f[x]==x) return x;
	return f[x]=rt(f[x]);
}
int dis(int x,int y){
	if(x>y) swap(x,y);
	return buc[y-1]+1-buc[x];
}
int pre[M],suf[M],cur[M];
void solve(){
	n=read();m=read();rk=0;res=0;
	for(int i=1;i<=m;++i){
		buc[++rk]=eu[i]=read();if(eu[i]>1) buc[++rk]=eu[i]-1;
		buc[++rk]=ev[i]=read();if(ev[i]>1) buc[++rk]=ev[i]-1;
		ew[i]=read();
	}
	buc[++rk]=n;
	sort(buc+1,buc+rk+1);rk=unique(buc+1,buc+rk+1)-buc-1;
	n=rk;
	for(int i=1;i<=n;++i) vec[i].clear(),f[i]=i,res+=buc[i]-buc[i-1]-1;
	for(int i=1;i<=m;++i){
		eu[i]=lower_bound(buc+1,buc+n+1,eu[i])-buc;
		ev[i]=lower_bound(buc+1,buc+n+1,ev[i])-buc;
		vec[eu[i]].emplace_back(ev[i],ew[i]);
		vec[ev[i]].emplace_back(eu[i],ew[i]);
	}
	int cnt=n-1;
	while(cnt){
		for(int i=1;i<=n;++i) arr[rt(i)].emplace_back(i),cur[i]=-1;
		for(int i=1;i<=n;++i){
			dir[i]=-1;mn[i]=INF;
			if(f[i]==i){
				int sz=arr[i].size();
				for(int t=0;t<sz;++t){
					int x=arr[i][t];
					if(t&&arr[i][t-1]==x-1) pre[x]=pre[x-1];
					else pre[x]=x-1;
				}
				for(int t=sz-1;~t;--t){
					int x=arr[i][t];
					if(t+1<sz&&arr[i][t+1]==x+1) suf[x]=suf[x+1];
					else suf[x]=x+1;
				}
				for(int x:arr[i]){
					for(auto [y,w]:vec[x]){
						if(rt(y)!=i&&w<mn[i]) dir[i]=y,mn[i]=w;
						cur[y]=x;
					}
					int t;
					t=x-1;
					while(t){
						if(cur[t]==x){--t;continue;}
						if(rt(t)==i){t=pre[t];continue;}
						if(dis(x,t)<mn[i]) mn[i]=dis(x,t),dir[i]=t;
						break;
					}
					t=x+1;
					while(t<=n){
						if(cur[t]==x){++t;continue;}
						if(rt(t)==i){t=suf[t];continue;}
						if(dis(x,t)<mn[i]) mn[i]=dis(x,t),dir[i]=t;
						break;
					}
				}
			}
		}
		for(int i=1;i<=n;++i){
			arr[i].clear();
			if((~dir[i])&&rt(i)!=rt(dir[i])) f[rt(i)]=rt(dir[i]),res+=mn[i],--cnt;
		}
	}
	printf("%lld\n",res);
}
int main(){
	int tc=read();
	while(tc--) solve();
	return 0;
}

标签:return,速通,int,Solution,read,lll,buc,杂题,rk
From: https://www.cnblogs.com/yyyyxh/p/18351460/problemsset1

相关文章

  • 什么是大模型?一文速通了解什么才是真正的大模型
    在这个充满变革的时代里,人工智能领域的几个关键词——ChatGPT、OpenAI、大模型、提示词工程以及“幻觉”频繁出现在我们的视野中,它们如同一股不可忽视的力量,冲击并重塑着我们的认知。这些术语不仅代表了技术的前沿动态,也引发了社会各界的广泛讨论与关注。什么是大模型当......
  • 杂题瞎写
    来点乱搞题。灯塔首先,这是一个DP。观察到\(\sqrt{|i-j|}\)的取值范围是\(O(\sqrtn)\)的。所以枚举每个取值,转移就是区间\(\max\)。随便写写\(O(n\sqrtn)\)。当然,这复杂度太高了,看着不舒服。我们考虑删除一些无用的状态。考虑若目前的最大值为\(val\),由于\(......
  • 【题解】Solution Set - NOIP2024集训Day2 线段树
    【题解】SolutionSet-NOIP2024集训Day2线段树https://www.becoder.com.cn/contest/5431「CF1149C」TreeGenerator™结论:对于括号序列的一个子段,删去所有的匹配括号之后,剩下的不匹配的括号,按顺序构成树上的一条路径。Why?从括号序列的构造出发。每次(相当于开始遍历......
  • 「杂题乱刷2」CF1486C1 & CF1486C2
    题目链接CF1486C1CF1486C2解题思路提供一个比较显然的思路。我们发现我们可以先求出整体的最小值,然后设整体最小值所在的位置为\(id\),则我们可以通过\(1\)次询问\([1,id]\)来求出最大值的位置是在\([1,id)\)还是在\((id,n]\)。然后我们就有了整体最大值在一个前缀或......
  • 一文速通Redis常见问题,带你深入了解Redis数据结构、分布式锁、持久化策略等经典问题。
    本文参考资料:黑马Redis讲义本文参考资料:JavaGuide,guide哥的八股内容个人思考的Redis实践,面试问题的总结,反思目录Redis五大数据结构String1.String数据结构(SDS)2.String应用场景3.Hash与String存储对象的区别SetListHashSortedSetRedis三种特殊数据结构BitMap(位图)......
  • 【题解】Solution Set - NOIP2024集训Day1 数据结构
    【题解】SolutionSet-NOIP2024集训Day1数据结构https://www.becoder.com.cn/contest/5429「CF1428F」FruitSequences线段树是可以维护区间最长子段的1。记固定右端点在\(i\),的答案为\(f_i\)。那么:\(a_i=0\),\(f_i=f_{i-1}\);\(a_i=1\),打一个单调栈维护所有的最长子......
  • 24-MX-WF day 1 contest solution
    赛时:\(70+50+0+20=140\)\(pts\)题目链接\(A\)\(ball\)首先最朴素的思路肯定是暴力,\(70\)\(pts\)拿下。代码实现#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e7+5;lln,m;lla[N];intmain(){ cin>>n>>......
  • 【题解】Solution Set - 新高一矩阵选讲「陶治霖」
    新高一矩阵选讲「陶治霖」https://www.becoder.com.cn/contest/5348「CF1970E3」Trails(Hard)考虑DP。定义\(f_{i,j}\)表示,第\(i\)天走到\(j\)的方案数。有转移:\[f_{i,j}=\sum_{k=1}^mf_{i-1,k}\times(s_jl_k+s_kl_j+s_js_k)\]https://www.luogu.com.cn/article/i......
  • 一天速通顺序结构(0基础,软件“Dev-c++”需自己下载)
    今天浅浅带大家速通顺序结构,话不多说,上干货!1,cout语句我们都知道,任何程序都会用到输出,那该怎么实现输出呢,代码实现:#include<iostream>usingnamespacestd;intmain(){cout<<"字符串";cout<<endl;return0;}其中"#include<iostream>"是头文件,起到声明输入输出......
  • 速通c++(周六)
    前言hello大家好,我是文宇。今天是速通c++的最后一天。(周日是愉快的玩耍,学个毛线)今天是一些用循环写的骚操作(娱乐)正文以下是一些在C++中使用循环进行的有趣和骚操作的例子:打印三角形:intn=5;for(inti=0;i<n;i++){for(intj=0;j<=i;j++){cout......