P102
zhx

a

【问题描述】
你是能看到第一题的 friends 呢。
——hja
两种操作:
1、加入一个数。
2、询问有多少个数是?的倍数。
【输入格式】
第一行一个整数?,代表操作数量。
接下来?行,每行两个数???,?。其中???表示是哪种操作,第二个?是操作的
参数。
【输出格式】
一行一个整数,代表所有询问答案的异或值。
【样例输入】
5
1 2
1 3
2 2
1 6
2 3
【样例输出】
3
【数据范围与规定】
对于第?组数据,? ≤ ? = 1000?。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #define maxn 400010
  5. using namespace std;
  6. int n,opt,x,sum[maxn];
  7. long long ans=;
  8. int main(){
  9. //freopen("a.in","r",stdin);
  10. freopen("a.in","r",stdin);freopen("a.out","w",stdout);
  11. scanf("%d",&n);
  12. while(n--){
  13. scanf("%d%d",&opt,&x);
  14. if(opt==){//插入一个数
  15. int i;
  16. for(i=;i*i<x;i++){
  17. if(x%i==){
  18. sum[i]++;
  19. sum[x/i]++;
  20. }
  21. }
  22. int w=sqrt(x);
  23. if(w*w==x)sum[w]++;
  24. }
  25. if(opt==)
  26. ans=ans^sum[x];
  27. }
  28. cout<<ans;
  29. fclose(stdin);fclose(stdout);
  30. return ;
  31. }

100分

b

【问题描述】
你是能看到第二题的 friends 呢。
——laekov
Hja 有一棵?个点的树,树上每个点有点权,每条边有颜色。一条路径的权
值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻
的两条边颜色都不相同。问这棵树上所有合法路径的权值和是多少。
【输入格式】
第一行一个数?。
一行?个数代表每个点的权值。
接下来? − 1行每行三个整数?,?,?,代表?到?之间有一条颜色为?的边。
【输出格式】
一行一个整数代表答案。
【样例输入】
6
6 2 3 7 1 4
1 2 1
1 3 2
1 4 3
2 5 1
2 6 2
【样例输出】
134
【数据范围与规定】
30%的数据,1 ≤ ? ≤ 1000。
数据随机 另外20%的数据,是一条链。
对于100%的数据,1 ≤ ? ≤ 3 × 10 5 ,1 ≤ ? ≤ 10 9 。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define maxn 300010
  5. int n,w[maxn],num,head[maxn],s[maxn],col[maxn],nu[maxn];
  6. bool vis[maxn];
  7. long long ans;
  8. struct node{
  9. int to,pre,v;
  10. }e[maxn*];
  11. void Insert(int from,int to,int v){
  12. e[++num].to=to;
  13. e[num].v=v;
  14. e[num].pre=head[from];
  15. head[from]=num;
  16. }
  17. bool flag;
  18. void dfs(int now,int father,int sum){
  19. flag=;ans+=sum;
  20. for(int i=head[now];i;i=e[i].pre){
  21. int to=e[i].to;
  22. if(e[i].v==father)continue;
  23. flag=;
  24. dfs(to,e[i].v,sum+w[to]);
  25. }
  26. }
  27. int du[maxn];
  28. int main(){
  29. //freopen("Cola.txt","r",stdin);
  30. freopen("b.in","r",stdin);freopen("b.out","w",stdout);
  31. scanf("%d",&n);
  32. for(int i=;i<=n;i++)scanf("%d",&w[i]);
  33. int x,y,z;
  34. for(int i=;i<n;i++){
  35. scanf("%d%d%d",&x,&y,&z);
  36. Insert(x,y,z);Insert(y,x,z);
  37. du[x]++;du[y]++;
  38. }
  39. bool fl=;
  40. int st;
  41. for(int i=;i<=n;i++){
  42. if(du[i]==)st=i;
  43. if(du[i]>){
  44. fl=;
  45. break;
  46. }
  47. }
  48. if(fl){//是一条链
  49. int cnt=;
  50. s[]=w[st];
  51. vis[st]=;
  52. while(){
  53. for(int i=head[st];i;i=e[i].pre){
  54. if(vis[e[i].to])continue;
  55. vis[e[i].to]=;
  56. cnt=cnt+;
  57. col[cnt]=e[i].v;
  58. st=e[i].to;
  59. }
  60. s[cnt+]=s[cnt]+w[st];
  61. if(du[st]==)break;
  62. }
  63. s[cnt+]=s[cnt]+w[st];
  64. nu[]=;nu[]=;
  65. for(int i=;i<=cnt;i++){
  66. if(col[i]!=col[i-]){
  67. nu[i+]=nu[i]+;
  68. }
  69. else nu[i+]=;
  70. }
  71. for(int i=;i<=cnt+;i++){
  72. for(int j=;j<=nu[i];j++){
  73. ans+=s[i]-s[i-j-];
  74. }
  75. }
  76. cout<<ans;
  77. return ;
  78. }
  79. for(int i=;i<=n;i++){
  80. flag=;
  81. dfs(i,,w[i]);
  82. if(!flag)ans-=w[i];
  83. }
  84. ans/=;
  85. cout<<ans;
  86. fclose(stdin);fclose(stdout);
  87. return ;
  88. }

50分 爆搜+链的特判

  1. #define ll long long
  2. #include<iostream>
  3. #define N 300005
  4. #include<cstdio>
  5. #define M 2*N
  6. using namespace std;
  7. int n,a[N],head[N],to[M],Next[M],e,col[M];
  8. ll g[N],nu[N];
  9. ll ans;
  10. void buid(int u,int v,int c){
  11. Next[++e]=head[u];head[u]=e;
  12. to[e]=v,col[e]=c;
  13. }
  14. void dfs(int now,int f,int cf){
  15. ll G=;
  16. g[now]=a[now];nu[now]=;
  17. int fl=;
  18. for(int i=head[now];i;i=Next[i]){
  19. int j=to[i];if(j==f) continue;
  20. dfs(j,now,col[i]);
  21. if(col[i]!=cf){
  22. fl=;
  23. nu[now]+=nu[j];
  24. g[now]+=nu[j]*a[now]+g[j];
  25. }
  26. G+=nu[j]*a[now]+g[j];
  27. }
  28. ans+=G;
  29. if(fl)return;
  30. for(int i=head[now];i;i=Next[i]){
  31. int j=to[i];
  32. if(j==f) continue;
  33. for(int I=i;I;I=Next[I]){
  34. int J=to[I];
  35. if(J==f) continue;
  36. if(col[i]!=col[I])
  37. ans+=g[j]*nu[J]+g[J]*nu[j]+a[now]*nu[j]*nu[J];
  38. }
  39. }
  40. }
  41. int main(){
  42. freopen("b.in","r",stdin);
  43. freopen("b.out","w",stdout);
  44.  
  45. scanf("%d",&n);
  46. for(int i=;i<=n;++i) scanf("%d",&a[i]);
  47. for(int i=;i<n;++i){
  48. int u,v,c;scanf("%d%d%d",&u,&v,&c);
  49. buid(u,v,c);
  50. buid(v,u,c);
  51. }
  52. dfs(,,);
  53. cout<<ans<<endl;
  54. return ;
  55. }

100分 树形dp

c

【问题描述】
你是能看到第三题的 friends 呢。
——aoao
Hja 特别有钱,他买了一个? × ?的棋盘,然后 Yjq 到这个棋盘来搞事。一
开始所有格子都是白的,Yjq 进行?次行操作?次列操作,所谓一次操作,是将对
应的行列上的所有格子颜色取反。 现在 Yjq 希望搞事之后棋盘上有?个黑色格子,
问 Yjq 有多少种搞事的方法。
【输入格式】
第一行五个整数?,?,?,?,?。
【输出格式】
一行一个整数代表答案对10 9 + 7取模之后的值。
【样例输入】
2 2 2 2 4
【样例输出】
4
【数据规模与约定】
对于100%的数据,1 ≤ ?,?,?,? ≤ 100000,0 ≤ ? ≤ ? × ?,有部分分。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #ifdef WIN32
  6. #define LL "%I64d"
  7. #else
  8. #define LL "%lld"
  9. #endif
  10. using namespace std;
  11. #define maxn 100010
  12. #define mod 1000000007
  13. int n,m,r,c,ans;
  14. int v0[maxn],v1[maxn],v2[maxn],v3[maxn],v4[maxn];
  15. long long s;
  16. int mul(long long a,int b){
  17. a*=b;
  18. if (a>=mod) a%=mod;
  19. return (int)a;
  20. }
  21. int Pow(int a,int b){
  22. int res=;
  23. while(b){
  24. if(b&)res=mul(res,a);
  25. a=mul(a,a);
  26. b>>=;
  27. }
  28. return res;
  29. }
  30. void inc(int &a,int b){
  31. a+=b;
  32. if(a>=mod)a-=mod;
  33. }
  34. int main(){
  35. freopen("c.in","r",stdin);freopen("c.out","w",stdout);
  36. scanf("%d%d%d%d"LL,&n,&m,&r,&c,&s);
  37. v1[]=;
  38. for(int i=;i<=;i++)v0[i]=Pow(i,mod-); // v0[i] 存放的是 i 的逆元
  39. int tmp=;
  40. for(int i=;i<=(r>>);i++){ // v1[i] 即C(n+i-1, i)
  41. v1[i]=tmp;
  42. tmp=mul(tmp,mul(i+n,v0[i+]));
  43. }
  44. tmp=;
  45. for(int i=;i<=(c>>);i++){ // v2[i] 即C(m+i-1, i)
  46. v2[i]=tmp;
  47. tmp=mul(tmp,mul(i+m,v0[i+]));
  48. }
  49. tmp=;
  50. for(int i=;i<=n;i++){ // v3[i] 即C(n, i)
  51. v3[i]=tmp;
  52. tmp=mul(tmp,mul(n-i,v0[i+]));
  53. }
  54. tmp=;
  55. for(int i=;i<=m;i++){ // v4[i] 即C(m, i)
  56. v4[i]=tmp;
  57. tmp=mul(tmp,mul(m-i,v0[i+]));
  58. }
  59. for(int i=r&;i<=min(n,r);i+=){ //枚举.....(r-6), (r-4), (r-2), r
  60. if(i*!=n){
  61. if(((s-(long long)i*m))%(n-i*))continue; // s = r0*m+c0*n-2*r0*c0 ==> (s-r0*m) = c0*(n-r0*2)
  62. int b=(int)((s-(long long)i*m)/(n-i*)); // 计算 c0
  63. if(b>c||b<||((c-b)&))continue; // 判断这个c0是否可能
  64. int nowans=v3[i];
  65. nowans=mul(nowans,v1[(r-i)>>]);
  66. nowans=mul(nowans,v4[b]);
  67. nowans=mul(nowans,v2[(c-b)>>]);
  68. //答案就是首先在n行里面选r0行,在m列里面选c0的方案数,再乘上选(r-r0)/2个行的方案数(这些行被操作两次,相当于没有动),再乘上选(c-c0)/2个列的方案数
  69. inc(ans,nowans);
  70. }
  71. else{ //在这种条件下呢,无论列数怎么变,黑色格子数量都不会变了,恒定为r0*m,(这个时候等式(s-r0*m) = c0*(n-r0*2)中n-r0*2为0,c0的值不唯一)
  72. if((long long)i*m!=s)continue;
  73. int nowans=v3[i];
  74. nowans=mul(nowans,v1[(r-i)>>]); //这部分同上
  75. int cnt=;
  76. for(int b=(c&);b<=min(r,c);b+=) //因为列的数量不影响答案所以要枚举所有可能的列数分别计算一遍
  77. inc(cnt,mul(v4[b],v2[(c-b)>>]));
  78. inc(ans,mul(nowans,cnt)); // 这里应该是mul(nowans, cnt)吧?
  79. }
  80. }
  81. printf("%d\n",ans);
  82. return ;
  83. }

100分

2017-10-4 清北刷题冲刺班p.m的更多相关文章

  1. 2017-10-4 清北刷题冲刺班a.m

    P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...

  2. 2017-10-3 清北刷题冲刺班p.m

    a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...

  3. 2017-10-3 清北刷题冲刺班a.m

    P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...

  4. 2017-10-2 清北刷题冲刺班a.m

    一道图论神题 (god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...

  5. 2017-10-2 清北刷题冲刺班p.m

    最大值 (max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...

  6. 2017-10-1 清北刷题冲刺班p.m

    一道图论好题 (graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...

  7. 2017-10-7 清北刷题冲刺班p.m

    测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...

  8. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

  9. 2017-10-1 清北刷题冲刺班a.m

    位运算1 (bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...

随机推荐

  1. 分享知识-快乐自己:redis集群搭建

    Redis介绍: 1.开源的NoSql数据库 2.C语言编写 3.基于内存运行,并且支持持久化 4.Key value存储 5.是主流的Nosql数据库之一 Redis优点: 1.内存使用方面,表现优 ...

  2. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现

    最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...

  3. css绝对对齐

    方法1:使用text-align:justify 能够兼容所有的浏览器,但是一定要在模块和模块或者字之间存在空格,换行符或者制表符,这样才能起作用 ;;} /* 说明: 1.IE中要实现块内单行两端对 ...

  4. stl_multiset.h

    stl_multiset.h // Filename: stl_multiset.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: ...

  5. Python 爬虫 —— 网页内容解析(lxml)

    0. xpath 语法 找到所有 <img src=....> 图像的链接: xpath = './/img/@src' img_urls = html.xpath(xpath) @修饰节 ...

  6. BLOB (binary large object)

    BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型. BLOB是一个大文件,典型的BL ...

  7. 优秀开源项目之一:视频监控系统iSpy

    iSpy是一个开源的视频监控软件,目前已经支持中文.自己用了一下,感觉还是很好用的.翻译了一下它的介绍. iSpy将PC变成一个完整的安全和监控系统 iSpy使用您的摄像头和麦克风来检测和记录声音或运 ...

  8. BZOJ3700: 发展城市

    BZOJ3700: 发展城市 https://lydsy.com/JudgeOnline/problem.php?id=3700 分析: 枚举两个人,先求链交,求到两个端点的时间. 链交求法:求两两\ ...

  9. bzoj 3545: [ONTAK2010]Peaks Kruskal重构树

    题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...

  10. NOIP2018爆炸记

    又是一年\(NOIP\),可能是梦结束的地方? 之所以咕了这么久是得先确定自己不会退役,因为分太低了. 和去年一样在学校门前照了相,然后上车走了.高三回来考的只剩下\(p2oileen\)学姐了.新一 ...