最近好颓啊,所以啥都做不出来

简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻,

大概也只有这样的简单题,才能勉强水个rank 3吧........

其实不必管在哪个机房,努力便好,不必在意什么,这么多的考试,对于成绩的好与坏大概都看淡了,无论如何无愧于心便好。

************************

T1 字符串

一看就是卡特兰的裸题,

卡特兰........(留坑待补...)

然后C(n+m,n)-C(n+m,m-1)结束了

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<cmath>
  5. 5 #include<string>
  6. 6 #include<algorithm>
  7. 7 #define int long long
  8. 8 #define MAXN 2500001
  9. 9 using namespace std;
  10. 10 const int mod=20100403;
  11. 11 int n,m;
  12. 12 int jie[MAXN];
  13. 13 int poww(int x,int y)
  14. 14 {
  15. 15 int ans=1ll;
  16. 16 while(y)
  17. 17 {
  18. 18 if(y&1)ans=ans*x%mod;
  19. 19 x=x*x%mod;
  20. 20 y>>=1;
  21. 21 }
  22. 22 return ans%mod;
  23. 23 }
  24. 24 int C(int x,int y)
  25. 25 {
  26. 26 if(y>x)return 0;
  27. 27 if(y==0)return 1;
  28. 28 return jie[x]%mod*poww(jie[y]%mod,mod-2)%mod*poww(jie[x-y]%mod,mod-2)%mod;
  29. 29 }
  30. 30 signed main()
  31. 31 {
  32. 32 //freopen("text.in","r",stdin);
  33. 33 //freopen("a.out","w",stdout);
  34. 34 scanf("%lld%lld",&n,&m);
  35. 35 jie[0]=1;jie[1]=1;
  36. 36 for(int i=2;i<=n+m+1;++i)jie[i]=(jie[i-1]*i)%mod;
  37. 37 if(n<m)printf("0\n");
  38. 38 else
  39. 39 printf("%lld\n",(C(n+m,n)-C(n+m,m-1)+mod)%mod);
  40. 40 }

T2乌鸦喝水

打链接表能水到90??????

正解:

我们考虑维护变量pos_water(表示当前乌鸦在哪喝水),pos表示当前轮到谁喝完了

我们预处理出每缸水能下降的次数然后sort一边,

易知,在i被下降到不能喝之前,i+1肯定能喝

根据性质,我们令pos_water移动

树狀数组维护从当前喝水点到n可喝水的缸数,

假设缸数加上上一个状态的cnt<此时节点的val,那么直接跳

不然二分查找停在那个位置

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<cmath>
  5. 5 #include<string>
  6. 6 #include<algorithm>
  7. 7 #include<map>
  8. 8 #include<vector>
  9. 9 #include<stack>
  10. 10 #include<queue>
  11. 11 #define MAXN 2000001
  12. 12 #define ps push_back
  13. 13 #define int long long
  14. 14 using namespace std;
  15. 15 int c[MAXN];
  16. 16 struct node{int id,val;}e[MAXN];
  17. 17 int n,m;
  18. 18 int lowbit(int x){return x&(-x);}
  19. 19 void add(int x,int k)
  20. 20 {
  21. 21 for(int i=x;i<=n;i+=lowbit(i))
  22. 22 {
  23. 23 c[i]+=k;
  24. 24 }
  25. 25 }
  26. 26 int query(int x)
  27. 27 {
  28. 28 int ans=0;
  29. 29 for(int i=x;i>=1;i-=lowbit(i))
  30. 30 {
  31. 31 ans+=c[i];
  32. 32 }
  33. 33 return ans;
  34. 34 }
  35. 35 int adds[MAXN];
  36. 36 bool cmp(node a,node b)
  37. 37 {
  38. 38 return (a.val!=b.val)?(a.val<b.val):(a.id<b.id);
  39. 39 }
  40. 40 int k;
  41. 41 signed main()
  42. 42 {
  43. 43
  44. 44 //freopen("text.in","r",stdin);
  45. 45 //freopen("b.out","w",stdout);
  46. 46 scanf("%lld%lld%lld",&n,&m,&k);
  47. 47 for(int i=1;i<=n;++i){scanf("%lld",&e[i].val);e[i].id=i;add(e[i].id,1);}
  48. 48 for(int i=1;i<=n;++i)scanf("%lld",&adds[i]);
  49. 49 for(int i=1;i<=n;++i)
  50. 50 {
  51. 51 e[i].val=(k-e[i].val)/adds[i]+1;
  52. 52 //printf("e[%lld].val=%lld\n",i,e[i].val);
  53. 53 }
  54. 54 sort(e+1,e+n+1,cmp);
  55. 55 int pos=1,pos_water=0,cnt=0,cir=0;
  56. 56 for(pos=1;pos<=n;++pos)if(e[pos].val!=0)break;
  57. 57 int pos_id=e[pos].id;
  58. 58 while(pos<=n&&cir<m)
  59. 59 {
  60. 60 int nxt=query(n);
  61. 61 int last=query(pos_water);
  62. 62 pos_id=e[pos].id;
  63. 63 //printf("pos=%lld nxt=%lld last=%lld %lld\n",pos,nxt,last,cir);
  64. 64 //printf("比较%lld %lld\n",nxt+cnt-last,e[pos].val);
  65. 65 if(nxt+cnt-last<e[pos].val)
  66. 66 {
  67. 67 cnt+=nxt-last;
  68. 68 cir++;
  69. 69 pos_water=0;
  70. 70 //printf("更改 pos_water=%lld cnt=%lld cir=%lld\n",pos_water,cnt,cir);
  71. 71 }
  72. 72 else if(nxt+cnt-last==e[pos].val)
  73. 73 {
  74. 74 cnt+=nxt-last;
  75. 75 cir++;
  76. 76 pos_water=0;
  77. 77 add(e[pos].id,-1);
  78. 78 pos++;
  79. 79 pos_id=e[pos].id;
  80. 80 }
  81. 81 else
  82. 82 {
  83. 83 int l=pos_water+1;int r=n;int end_pos=pos_water;
  84. 84 //printf("l%lld r=%lld\n",l,r);
  85. 85 while(l+1<r)
  86. 86 {
  87. 87 int mid=(l+r)>>1;
  88. 88 if(query(mid)-last+cnt>e[pos].val)
  89. 89 r=mid;
  90. 90 else l=mid;
  91. 91 }
  92. 92 if(query(l)+cnt-last==e[pos].val)
  93. 93 {
  94. 94 end_pos=l;
  95. 95 }
  96. 96 else if(query(r)+cnt-last==e[pos].val)
  97. 97 end_pos=r;
  98. 98 cnt+=query(end_pos)-last;
  99. 99 if(end_pos!=n)
  100. 100 pos_water=end_pos;
  101. 101 else
  102. 102 {
  103. 103 cir++;
  104. 104 pos_water=0;
  105. 105 }
  106. 106 add(pos_id,-1);
  107. 107 pos++;pos_id=e[pos].id;
  108. 108 //printf("新pos_water=%lld cnt=%lld %lld %lld\n",pos_water,cnt,pos,cir);
  109. 109 }
  110. 110 if(cir>=m&&pos>=n)break;
  111. 111 }
  112. 112 printf("%lld\n",cnt);
  113. 113 }

T3

tarjan

然后DFS会炸成n^2

要用拓扑

记清楚!!!!!!!!!!!!!!!!!!

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<cmath>
  5. 5 #include<string>
  6. 6 #include<algorithm>
  7. 7 #include<map>
  8. 8 #include<vector>
  9. 9 #include<stack>
  10. 10 #include<queue>
  11. 11 #define MAXN 2000001
  12. 12 #define ps push_back
  13. 13 using namespace std;
  14. 14 int n,R,C;
  15. 15 vector<int>lie[MAXN];
  16. 16 vector<int>hang[MAXN];
  17. 17 int dx[8]={0,1,0,-1,1,1,-1,-1};
  18. 18 int dy[8]={1,0,-1,0,-1,1,1,-1};
  19. 19 map<pair<int,int>,int>h;
  20. 20 struct no{int to,n;}e1[MAXN*2],e2[MAXN*2];
  21. 21 int head1[MAXN],tot1;int head2[MAXN],tot2;
  22. 22 void add1(int u,int v)
  23. 23 {
  24. 24 e1[++tot1].to=v;e1[tot1].n=head1[u];head1[u]=tot1;
  25. 25 }
  26. 26 void add2(int u,int v)
  27. 27 {
  28. 28 e2[++tot2].to=v;e2[tot2].n=head2[u];head2[u]=tot2;
  29. 29 }
  30. 30 struct node{int x,y,data,id;}e[MAXN];
  31. 31 int read()
  32. 32 {
  33. 33 int x=0;char c=getchar();
  34. 34 while(c<'0'||c>'9')
  35. 35 {
  36. 36 c=getchar();
  37. 37 }
  38. 38 while(c>='0'&&c<='9')
  39. 39 {
  40. 40 x=(x<<1)+(x<<3)+(c^48);
  41. 41 c=getchar();
  42. 42 }
  43. 43 return x;
  44. 44 }
  45. 45 int d[MAXN];
  46. 46 bool vis[MAXN];int maxn;int cnt;
  47. 47 stack<int>q;int belong[MAXN];
  48. 48 vector<int>v[MAXN];
  49. 49 int de=0,dfn[MAXN],low[MAXN];
  50. 50 void tarjan(int x)
  51. 51 {
  52. 52 dfn[x]=low[x]=++de;vis[x]=1;q.push(x);
  53. 53 for(int i=head1[x];i;i=e1[i].n)
  54. 54 {
  55. 55 int to=e1[i].to;
  56. 56 if(!dfn[to])
  57. 57 {
  58. 58 tarjan(to);
  59. 59 low[x]=min(low[x],low[to]);
  60. 60 }
  61. 61 else if(vis[to])
  62. 62 {
  63. 63 low[x]=min(low[x],low[to]);
  64. 64 }
  65. 65 }
  66. 66 if(dfn[x]==low[x])
  67. 67 {
  68. 68 cnt++;
  69. 69 int top=0;
  70. 70 while(top!=x)
  71. 71 {
  72. 72 top=q.top();q.pop();vis[top]=0;v[cnt].ps(top);belong[top]=cnt;d[cnt]++;
  73. 73 }
  74. 74 }
  75. 75 }
  76. 76 int ru[MAXN];
  77. 77 void init()
  78. 78 {
  79. 79 for(int x=1;x<=n;++x)
  80. 80 {
  81. 81 for(int i=head1[x];i;i=e1[i].n)
  82. 82 {
  83. 83 int to=e1[i].to;
  84. 84 if(belong[x]==belong[to])continue;
  85. 85 add2(belong[x],belong[to]);
  86. 86 ru[belong[to]]++;
  87. 87 }
  88. 88 }
  89. 89 }
  90. 90 int len[MAXN];
  91. 91 queue<int>qq;
  92. 92 void tuopu()
  93. 93 {
  94. 94 for(int i=1;i<=cnt;++i)
  95. 95 {
  96. 96 if(ru[i]==0){qq.push(i);len[i]=d[i];}
  97. 97 }
  98. 98 while(!qq.empty())
  99. 99 {
  100. 100 int x=qq.front();
  101. 101 qq.pop();
  102. 102 for(int i=head2[x];i;i=e2[i].n)
  103. 103 {
  104. 104 int to=e2[i].to;
  105. 105 len[to]=max(len[x]+d[to],len[to]);
  106. 106 maxn=max(len[to],maxn);ru[to]--;
  107. 107 if(ru[to]==0)qq.push(to);
  108. 108 }
  109. 109 }
  110. 110 }
  111. 111 signed main()
  112. 112 {
  113. 113 n=read();R=read();C=read();
  114. 114 for(int i=1;i<=n;++i)
  115. 115 {
  116. 116 e[i].x=read();e[i].y=read();e[i].data=read();
  117. 117 e[i].id=i;
  118. 118 hang[e[i].x].ps(i);
  119. 119 lie[e[i].y].ps(i);
  120. 120 h[make_pair(e[i].x,e[i].y)]=e[i].id;
  121. 121 }
  122. 122 for(int i=1;i<=n;++i)
  123. 123 {
  124. 124 if(e[i].data==1)
  125. 125 {
  126. 126 for(int k=0;k<hang[e[i].x].size();++k)
  127. 127 {
  128. 128 int j=hang[e[i].x][k];
  129. 129 if(j==e[i].id)continue;
  130. 130 add1(e[i].id,j);
  131. 131 }
  132. 132 }
  133. 133 if(e[i].data==2)
  134. 134 {
  135. 135 for(int k=0;k<lie[e[i].y].size();++k)
  136. 136 {
  137. 137 int j=lie[e[i].y][k];
  138. 138 if(j==e[i].id)continue;
  139. 139 add1(e[i].id,j);
  140. 140 }
  141. 141 }
  142. 142 if(e[i].data==3)
  143. 143 {
  144. 144 for(int j=0;j<=7;++j)
  145. 145 {
  146. 146 int x=e[i].x;int y=e[i].y;
  147. 147 if(h[make_pair(x+dx[j],y+dy[j])]!=0)
  148. 148 {
  149. 149 add1(e[i].id,h[make_pair(x+dx[j],y+dy[j])]);
  150. 150 }
  151. 151 }
  152. 152 }
  153. 153 }
  154. 154 for(int i=1;i<=n;++i)
  155. 155 {
  156. 156 if(!dfn[i])tarjan(i);
  157. 157 }
  158. 158 init();tuopu();
  159. 159 printf("%lld\n",maxn);
  160. 160 }

「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)的更多相关文章

  1. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  2. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏

    T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...

  3. noip模拟5[string·matrix·big·所驼门王的宝藏]

    怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...

  4. 树状数组+二分答案查询第k大的数 (团体程序设计天梯赛 L3-002. 堆栈)

    前提是数的范围较小 1 数据范围:O(n) 2 查第k大的数i:log(n)(树状数组查询小于等于i的数目)*log(n)(二分找到i) 3 添加:log(n) (树状数组) 4 删除:log(n) ...

  5. 求序列A中每个数的左边比它小的数的个数(树状数组)

    给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...

  6. 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)

    题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名.  今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...

  7. 「BZOJ 1924」「SDOI 2010」所驼门王的宝藏「Tarjan」

    题意 一个\(r\times c\)的棋盘,棋盘上有\(n\)个标记点,每个点有三种类型,类型\(1\)可以传送到本行任意标记点,类型\(2\)可以传送到本列任意标记点,类型\(3\)可以传送到周围八 ...

  8. [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...

  9. [CSP-S模拟测试]:柱状图(树状数组+二分+三分)

    题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...

随机推荐

  1. SSM久别遇新坑

    SSM久别遇新坑 久别个锤子,也就几天没看,改bug改到怀疑人生 maven的父子模块问题 众所周知,用maven建立一个空的模块,在它之下,将原本的各层次结构分别新建为一个子模块,就能够将各业务进行 ...

  2. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  3. es6.4.0安装和配置IK+拼音插件 实现非全拼搜索

    安装IK分词器 一.进入到es的plugins文件夹创建文件夹analysis-ikmkdir analysis-ik二.下载ik压缩包文件wget https://github.com/medcl/ ...

  4. 加载usbserial驱动后,为什么adb不可用了?

    ​某设备提供了USB串口功能,上位机(Host端)可以通过USB串口与之通信.对于Linux上位机,比如Ubuntu,自带usbserial驱动,当安装usbserial驱动后,上位机就会生成ttyU ...

  5. 33.2.NIO

    4.1概述[理解] BIO Blocking IO,阻塞型IO NIO No Blocking IO,非阻塞型IO 阻塞IO的弊端 在等待的过程中,什么事也做不了 非阻塞IO的好处 不需要一直等待,当 ...

  6. [Java]数据分析--聚类

    距离度量 需求:计算两点间的欧几里得距离.曼哈顿距离.切比雪夫距离.堪培拉距离 实现:利用commons.math3库相应函数 1 import org.apache.commons.math3.ml ...

  7. 强哥JavaScript学习笔记

    js文件放header头最后,js代码放body体最后 js语言定位: js是基于对象的语言 php.java是面向对象的语言 定义变量: var str="hello world" ...

  8. Keepalived+nginx高可用

    这种方法会把Keepalived进程结束掉,在教育机构学习到的方法,我个人对这种方法不认可. 参考: https://www.cnblogs.com/gshelldon/p/14504236.html ...

  9. 06丨MongoDB基本操作

    使用 insert 完成插入操作 操作格式: db.<集合>.insertOne(<JSON对象>) db.<集合>.insertMany([<JSON 1& ...

  10. STM32 中的HARDFAULT 的查找方法

    http://blog.csdn.net/zyboy2000/article/details/7668331