牛客网暑期ACM多校训练营(第一场)

牛客网暑期ACM多校训练营(第一场)


D. Two Graphs

\(n!\) 枚举与 \(G1\) 同构的图,在 \(G2\) 中找到相应的边,如果 \(m1\) 条边都可以匹配到,则将这种方案中用到的边压成一个64位二进制数,放到set里去重。另一种思路是,出现重算的情况就是,这个同构的图与自身的图相同,即使用这些点的映射,形成的新图与原图一致,这种自同构的情况要从答案中除去。

#include <bits/stdc++.h>
typedef unsigned long long ll;
const ll seed = 31;
const ll mod = 1e9 + 7;
inline int read() {
    char c = getchar();int x=0, f=1;
    while(c<'0'||c>'9'){if(c=='-')f = -1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
using namespace std;
int n,m1,m2,g[11][11],PH[11];
pair<int,int> p[1111];
int main() {
    while(scanf("%d%d%d",&n,&m1,&m2)!=EOF) {
        set<int> s;s.clear();
        memset(g,0,sizeof(g));
        for(int i=1;i<=m1;++i) {
            int u=read(),v=read();
            g[u][v] = g[v][u] = 1;
        }
        for(int i=1;i<=m2;++i) {
            int u=read(),v=read();
            p[i] = make_pair(u,v);
        }
        for(int i=1;i<=n;++i) PH[i]=i;
        do{
            ll hs=0,cnt=0;
            for(ll i=1;i<=m2;++i){
                if(g[PH[p[i].first]][PH[p[i].second]]) {
                    hs |= ((ll)1<<(i-(ll)1));
                    ++cnt;
                }
            }
            if(cnt == m1)s.insert(hs);
        }while(next_permutation(PH+1,PH+1+n));
        printf("%d\n",(int)s.size());
    }
    return 0;
}

J. Different Integers

先写了分块莫队tle,然后写了曼哈顿mst莫队tle,然后分块乱狗tle,t到终场。结束后,加了个快读,分块莫队ac..。还有其他一些做法,其实把整个序列在后边复制一份,不就变成了单个区间询问数字种类的模板题了。(让快读成为习惯。。。为何泥萌常数辣么小

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
typedef long long ll;
const int N = 1e5 + 7;
inline int read() {
    char c = getchar();int x=0, f=1;
    while(c<'0'||c>'9'){if(c=='-')f = -1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
using namespace std;
int n,q,a[N];
struct pp{int l,r,id,ans;}Q[N];
int B,belong[N];
void build() {
    B = sqrt(n);
    for(int i=1; i<=n; i++) belong[i] = (i-1)/B + 1;
}
bool cmp(pp a, pp b) {
    if(belong[a.l] == belong[b.l]) return a.r < b.r;
    return belong[a.l] < belong[b.l];
}
int sum=0,num[N];
void update(int p,int d) {
    if(num[a[p]]==1&&d==-1) --sum;
    else if(num[a[p]]==0&&d==1) ++sum;
    num[a[p]]+=d;
}
bool cmp1(pp a,pp b) {
    return a.id < b.id;
}
int main() {
    while(scanf("%d%d",&n,&q)!=EOF) {
        for(int i=1;i<=n;++i)num[i]=0;
        build();
        for(int i=1;i<=n;++i)a[i]=read();
        for(int i=1;i<=q;++i) {
            Q[i].l=read(),Q[i].r=read();Q[i].id=i;
        }
        sort(Q+1,Q+1+q,cmp);
        int l=0, r=n+1;sum = 0;
        for(int i=1;i<=q;++i) {
            while(r<Q[i].r)update(r,-1),++r;
            while(r>Q[i].r)--r,update(r,1);
            while(l<Q[i].l)++l,update(l,1);
            while(l>Q[i].l)update(l,-1),--l;
            Q[i].ans = sum;
        }
        sort(Q+1,Q+1+q,cmp1);
        for(int i=1;i<=q;++i)printf("%d\n",Q[i].ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/RRRR-wys/p/9339002.html