• CH Round #55


    http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20%28NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9Bday2%29

    犯了sb错误。。。。t2的longlong的mul我没分别开modQAQ爆了两个点。。。可是就算开了我也是230.。。在此orz神犇zyfAK爷orzzzz还有jiryAK爷orzzzz

    upd:成绩出来了。。。。。。。。。。我110滚粗。。。。。。。。。。。。。。。。果然太弱吗。。。。。。。。。。。。。。。t3 喜闻乐见的ce了。。。因为今天刚装了g++ 4.9.。。sad stroy。。它不提示cmp那里引用要加const啊!!!!

    然后尽管改了这里还有地方写挫了。。。。。。。。。我的并查集写得太快没有写路径压缩。。。。。。。。。。sad,,调了n久。。。

    蒟蒻的生存史就这样了。。。。。。sad。。

    t1:九九归一

    唯一没能a的就是这题了。。。t1啊。。t1我都搞不出来。。。

    暴力30分QAQ

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << (#x) << " = " << (x) << endl
    #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
    #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '	'; cout << endl
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    int md, n;
    int gcd(int a, int b) { return b?a:gcd(b, a%b); }
    int main() {
    	read(md); read(n);
    	int phi=md, t=md, sqr=sqrt(md+0.5);
    	for1(i, 2, sqr) if(t%i==0) {
    		phi=phi/i*(i-1);
    		while(t%i==0) t/=i;
    	}
    	if(t>1) phi=phi/t*(t-1);
    	rep(i, n) {
    		int a=getint(), len=1; t=a;
    		//if(gcd(a, n)!=1) { printf("0"); continue; }
    		if(a==0) { printf("0"); continue; }
    		while((t%md)!=1) {
    			t=(t*a)%md, ++len;
    			if(len>phi) break;
    		}
    		printf("%d", len==phi);
    	}
    	return 0;
    }
    

    t2:LCA的统计

    这题找找规律会发现。

    节点x可以得到的ans有

    w[i]*sum{sum[j]*sum[other]},然后乘上自己然后加上自己到子树节点的sum[x]*2即可。这里的longlong我不想说了QAQ自己弱。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << (#x) << " = " << (x) << endl
    #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
    #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '	'; cout << endl
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    typedef unsigned long long ll;
    const int N=100005, md=1000000007;
    int ihead[N], cnt, n;
    ll w[N], ans, sum[N];
    struct ED { int to, next; }e[N<<1];
    void add(int u, int v) {
    	e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;
    	e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u;
    }
    inline ll mul(ll a, ll b) { return ((a%md)*(b%md))%md; } //我sb了。。这里没分开md
    void dfs(int x, int fa) {
    	sum[x]=w[x];
    	int y;
    	for(int i=ihead[x]; i; i=e[i].next) if(fa!=(y=e[i].to)) {
    		dfs(y, x); sum[x]+=sum[y];
    	}
    	ll s=0;
    	for(int i=ihead[x]; i; i=e[i].next) if(fa!=(y=e[i].to)) {
    		ll other=(((sum[x]-sum[y]+md)%md)-w[x]+md)%md;
    		s=(s+mul(other, sum[y]))%md;
    	}
    	ans=(ans+mul(s, w[x]))%md;
    	ans=(ans+mul(2, mul(w[x], mul(w[x], (sum[x]-w[x]+md)%md))))%md;
    	ans=(ans+mul(mul(w[x], w[x]), w[x]))%md;
    }
    int main() {
    	read(n); read(w[1]);
    	for1(i, 2, n) { int v=getint(); read(w[i]); add(v, i); }
    	dfs(1, 0);
    	printf("%lld", ans);
    	return 0;
    }
    

    t3:四驱兄弟

    最裸的一题了,直接mst。

    发现不能有环果断是生成树

    发现有排名,果断最小生成树。

    没了。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <map>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << (#x) << " = " << (x) << endl
    #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
    #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '	'; cout << endl
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=100005;
    int ihead[N], cnt, n, m, p[N], tot;
    struct dat { int x, y, w; }e[N];
    map<string, int> mp;
    int ifind(int x) { return x==p[x]?x:ifind(p[x]); }
    int cmp(dat& a, dat& b) { return a.w<b.w; }
    int id(char *ch) {
    	string s(ch);
    	if(mp[s]) return mp[s];
    	mp[s]=++tot;
    	return mp[s];
    }
    int main() {
    	read(n); read(m);
    	string s; char ch[10];
    	for1(i, 1, m) {
    		read(e[i].w);
    		scanf("%s", ch); e[i].x=id(ch);
    		scanf("%s", ch); e[i].y=id(ch);
    	}
    	for1(i, 1, tot) p[i]=i;
    	sort(e+1, e+1+m, cmp);
    	int num=0;
    	for1(i, 1, m) {
    		int fx=ifind(e[i].x), fy=ifind(e[i].y);
    		if(fx!=fy) {
    			p[fy]=fx;
    			++num;
    			if(num>n) break;
    			printf("%d
    ", e[i].w);
    		}
    	}
    	for1(i, num+1, n) puts("INF");
    	return 0;
    }
    
  • 相关阅读:
    zabbix 主被动模式
    MySQL角色(role)功能介绍
    MySQL权限管理实战
    创建索引,这些知识应该了解
    MySQL锁等待与死锁问题分析
    Navicat操作MySQL简易教程
    职场里,对数据库要有敬畏之心!
    MySQL字段默认值设置详解
    MySQL查看及杀掉链接方法大全
    MySQL字段类型最全解析
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4006473.html
Copyright © 2020-2023  润新知