10.30考试爆炸记

反正都炸糊了
只写一道题

(3)star
在无相连通图中求一个由四边五点组成的图形
其实这个题就是一个复杂度分析
我们人为地划分轻重点,所以我们人为地分出了三种边
轻点连轻点: (nm)(m)
重点连轻点: (m)(m)
重点连重点: (m)m
所以总复杂度为 m1.5

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;jfor(int j=0;jif(!vis[edge[i][j]]){
                    cnt=0;
                    if(d[edge[i][j]]<=650){
                        for(int k=0;kelse{
                        for(int k=0;k1)*cnt/2;
                }
        }
        write(ans);puts("");
    }
    return 0;
}

你可能感兴趣的:(OI,琐题集萃门,图论纲)