反正都炸糊了
只写一道题
(3)star
在无相连通图中求一个由四边五点组成的图形
其实这个题就是一个复杂度分析
我们人为地划分轻重点,所以我们人为地分出了三种边
轻点连轻点:
(n−m−−√)∗(m−−√)
重点连轻点:
(m−−√)∗(m−−√)
重点连重点:
(m−−√)∗m
所以总复杂度为
m1.5
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<vector>
#define mod (1<<19)-1
using namespace std;
inline int read(){
int i=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())
if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar())
i=(i<<3)+(i<<1)+(ch^48);
return i*f;
}
int buf[1024];
inline void write(long long x){
if(!x){putchar('0');return ;}
if(x<0){putchar('-');x=-x;}
while(x) buf[++buf[0]]=x%10,x/=10;
while(buf[0]) putchar(buf[buf[0]--]+48);
return ;
}
#define stan 111111
#define id(i,j) (long long)i*100009+j
long long ans,cnt;
int d[stan],linked[stan],T,n,m,a,b;
bool vis[stan];
vector<int> edge[stan];
struct hashmap{
long long set[mod+10],val[mod+10];
int sze[mod+10],top;
inline void insert(long long x){
set[++top]=x;
return ;
}
void preact(){
for(int i=1;i<=top;++i)
++sze[set[i]&mod];
for(int i=1;i<=mod+1;++i)
sze[i]+=sze[i-1];
for(int i=1;i<=top;++i)
val[sze[set[i]&mod]--]=set[i];
return ;
}
bool find(long long x){
for(int i=sze[(x&mod)+1];i!=sze[x&mod];--i)
if(val[i]==x)
return true;
else return false;
}
void clear(){
top=0;
memset(sze,0,sizeof(sze));
return ;
}
}hash;
signed main(){
T=read();
while(T--){
memset(d,0,sizeof(d));
memset(vis,false,sizeof(vis));
memset(linked,0,sizeof(linked));
ans=0;
hash.clear();
n=read();m=read();
for(int i=1;i<=n;++i)
edge[i].clear();
for(int i=1;i<=m;++i){
a=read();b=read();
edge[a].push_back(b);++d[a];
edge[b].push_back(a);++d[b];
hash.insert(id(a,b));
hash.insert(id(b,a));
}
hash.preact();
for(int i=1;i<=n;++i){
vis[i]=true;
for(int j=0;j<edge[i].size();++j)
linked[edge[i][j]]=i;
for(int j=0;j<edge[i].size();++j)
if(!vis[edge[i][j]]){
cnt=0;
if(d[edge[i][j]]<=650){
for(int k=0;k<edge[edge[i][j]].size();++k)
cnt+=(linked[edge[edge[i][j]][k]]==i);
}else{
for(int k=0;k<edge[i].size();++k)
cnt+=hash.find(id(edge[i][k],edge[i][j]));
}
ans+=(cnt-1)*cnt/2;
}
}
write(ans);puts("");
}
return 0;
}