犯了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; }