CH Round #55 - Streaming #6 (NOIP模拟赛day2)(被虐哭)

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[_] << '\t'; 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[_] << '\t'; 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[_] << '\t'; 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\n", e[i].w);

		}

	}

	for1(i, num+1, n) puts("INF");

	return 0;

}

 

你可能感兴趣的:(Stream)