10.30考试爆炸记

20 篇文章 0 订阅
7 篇文章 0 订阅

反正都炸糊了
只写一道题

(3)star
在无相连通图中求一个由四边五点组成的图形
其实这个题就是一个复杂度分析
我们人为地划分轻重点,所以我们人为地分出了三种边
轻点连轻点: (nm)(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值