这场edu我原本以为能清真一点……

后来发现不仅是七题

还有各种奇奇怪怪的骚操作……

A.

随便枚举

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int main(){
  5. scanf("%d",&n);int x=;
  6. for(;n/(x*);x*=);
  7. printf("%d\n",n/x*x+x-n);
  8. }

B.

xjb按照定义分一下就行了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll n,k,m,a[];
  5. double ans;
  6. int main(){
  7. cin>>n>>k;ll i;
  8. for(i=;i<=n;i++)cin>>a[i];
  9. for(i=;i<=n;i++)ans+=a[i]*min(min(i,n-i+),min(k,n-k+));
  10. ans/=(n-k+);
  11. printf("%16.15f",ans);
  12. }

C.

将茶杯排序,然后从后往前贪心地构造就行了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[],b[],n,w;
  4. inline int read(){
  5. int f=,x=;char ch;
  6. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  7. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  8. return f*x;
  9. }
  10. int main(){
  11. n=read();w=read();
  12. for(int i=;i<=n;i++)a[i]=read();
  13. for(int i=;i<=n;i++){b[i]=(a[i]+)>>;w-=b[i];}
  14. if(w<){puts("-1");return ;}
  15. while(w){
  16. int minv=;
  17. for(int i=;i<=n;i++)if((!minv||a[i]>=a[minv])&&a[i]>b[i])minv=i;
  18. int x=min(a[minv]-b[minv],w);
  19. b[minv]+=x;w-=x;
  20. }
  21. for(int i=;i<=n;i++)printf("%d ",b[i]);
  22. }

D.

求出前缀和,二分下标。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[],b[],n,w;
  4. inline int read(){
  5. int f=,x=;char ch;
  6. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  7. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  8. return f*x;
  9. }
  10. int main(){
  11. n=read();w=read();
  12. for(int i=;i<=n;i++)a[i]=read();
  13. for(int i=;i<=n;i++){b[i]=(a[i]+)>>;w-=b[i];}
  14. if(w<){puts("-1");return ;}
  15. while(w){
  16. int minv=;
  17. for(int i=;i<=n;i++)if((!minv||a[i]>=a[minv])&&a[i]>b[i])minv=i;
  18. int x=min(a[minv]-b[minv],w);
  19. b[minv]+=x;w-=x;
  20. }
  21. for(int i=;i<=n;i++)printf("%d ",b[i]);
  22. }

E.

大数据版01背包……

不知道正解是啥,我sort一下+鬼畜剪枝玄学过去……

  1. #include<bits/stdc++.h>
  2. #define N 1000005
  3. using namespace std;
  4. typedef long long ll;
  5. int w[N],c[N],rk[N];
  6. int n,m;
  7. ll f[N],p[N];
  8. inline int read(){
  9. int f=,x=;char ch;
  10. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  11. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  12. return f*x;
  13. }
  14. bool cmp(int x,int y){return p[x]<p[y];}
  15. int main(){
  16. n=read();m=read();
  17. for(int i=;i<=n;i++){
  18. w[i]=read();c[i]=read();p[i]=c[i]*6LL/w[i];rk[i]=i;
  19. }
  20. sort(rk+,rk+n+,cmp);int s=;
  21. for(int i=n;i;i--){
  22. int ww=w[rk[i]],cc=c[rk[i]];
  23. s+=ww;
  24. for(int j=s;j>=max(ww,s-);j--)f[j]=max(f[j],f[j-ww]+cc);
  25. }
  26. for(int i=;i<=m;i++)f[i]=max(f[i],f[i-]);
  27. cout<<f[m]<<endl;
  28. }

F.

本场最恶心的题……

首先线性筛出素数,这个不用说。

其次有个显然的单调性。那么我们可以对等级二分答案。

这类问题很模型化,任取两个数不能为素数,那么我们考虑怎样才一定取不出素数。

问题其实也就是一个二分匹配问题,左集合全部为奇数(我们暂时先不考虑1的问题),右集合全部为偶数,那么只有从左边取一个数或者从右边取一个数才可能构成素数。

那么这里就构成了一个二分图模型。

我们考虑建图:

①建立源点,连入各个奇数,流为各个奇数其本身的价值。

②建立汇点,将各个偶数连入汇点,流为各个偶数其本身的价值。

③对应遍历各个奇数,如果其右边有偶数和其相加能够构成素数,那么将其连入那个点,流为INF.

那么我们跑出的最大流就是最小割,也就是最小花费,同样可以理解为最小抛掉的点的价值总和。

那么我们此时最优选取方案的价值和就是Sum-maxlfow.这里Sum就是能够选择的数的价值总和。

于是就这么恶心的写完了……

  1. #include<bits/stdc++.h>
  2. #define N 200005
  3. #define inf 1000000007
  4. using namespace std;
  5. int n,m,opt[N],e,s,t,vis[N];int prime[N],cnt=;
  6. struct Data{int p,c,l;}a[N];
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. inline void calcpri(){
  9. memset(vis,,sizeof(vis));
  10. for(int i=;i<=N;i++){
  11. if(vis[i]){prime[++cnt]=i;}
  12. for(int j=;j<=cnt;j++){
  13. int t=i*prime[j];if(t>N)break;
  14. vis[t]=;
  15. if(i%prime[j]==)break;
  16. }
  17. }
  18. }
  19. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. namespace Maxflow{
  21.  
  22. struct Edge{int u,v,f,next;}G[N<<];
  23. int head[*N],tot=;
  24. inline void addedge(int u,int v,int f){
  25. G[tot].u=u;G[tot].v=v;G[tot].f=f;G[tot].next=head[u];head[u]=tot++;
  26. G[tot].u=v;G[tot].v=u;G[tot].f=;G[tot].next=head[v];head[v]=tot++;
  27. }
  28. int level[N];
  29. bool bfs(int s,int t){
  30. memset(level,,sizeof(level));
  31. queue<int>q;q.push(s);level[s]=;
  32. while(!q.empty()){
  33. int u=q.front();q.pop();
  34. if(u==t)return ;
  35. for(int i=head[u];~i;i=G[i].next){
  36. int v=G[i].v,f=G[i].f;
  37. if(f&&!level[v])level[v]=level[u]+,q.push(v);
  38. }
  39. }
  40. return ;
  41. }
  42. int dfs(int u,int maxf,int t){
  43. int ret=;if(u==t)return maxf;
  44. for(int i=head[u];~i;i=G[i].next){
  45. int v=G[i].v,f=G[i].f;
  46. if(f&&level[v]==level[u]+){
  47. f=dfs(v,min(maxf-ret,f),t);
  48. ret+=f;G[i].f-=f;G[i^].f+=f;
  49. }
  50. }
  51. if(!ret)level[u]=inf;
  52. return ret;
  53. }
  54. inline void init(){memset(head,-,sizeof(head));tot=;}
  55. inline int dinic(int s,int t){
  56. int ans=;
  57. while(bfs(s,t))ans+=dfs(s,inf,t);
  58. return ans;
  59. }
  60.  
  61. }
  62. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. bool check(int x){
  64. int k=;for(int i=;i<=n;i++)if(a[i].l<=x)if(a[i].c==&&a[i].p>a[k].p)k=i;
  65. Maxflow::init();
  66. int s=,t=n+;
  67. int sum=;
  68. for(int i=;i<=n;i++)if(a[i].l<=x){
  69. if(a[i].c==&&i!=k)continue;
  70. sum+=a[i].p;if(a[i].c&)Maxflow::addedge(s,i,a[i].p);
  71. else Maxflow::addedge(i,t,a[i].p);
  72. }
  73. for(int i=;i<=n;i++)for(int j=;j<=n;j++)if(vis[a[i].c+a[j].c]){
  74. if(a[i].c&)Maxflow::addedge(i,j,inf);
  75. else Maxflow::addedge(j,i,inf);
  76. }
  77. return (sum-Maxflow::dinic(s,t)>=m);
  78. }
  79.  
  80. inline int read(){
  81. int f=,x=;char ch;
  82. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  83. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  84. return f*x;
  85. }
  86.  
  87. int main(){
  88. n=read();m=read();calcpri();
  89. for(int i=;i<=n;i++)a[i].p=read(),a[i].c=read(),a[i].l=read();
  90. int l=,r=,ret=;
  91. for(int i=;i<=n;i++)r=max(r,a[i].l);ret--;
  92. while(l<=r){
  93. int mid=(l+r)>>;
  94. if(check(mid))ret=mid,r=mid-;
  95. else l=mid+;
  96. }
  97. printf("%d\n",ret);
  98. }

G.

一个挺妙的dp。

记录dp[i],表示到了位置i最多的出现次数。

cnt[i],表示最后一次出现的 B 以 i 结尾 0-i中最多能出现几次B

首先dp[i]初始为dp[i-1]

接着用kmp,O(m)求出可以从之前的哪个位置转移

求和之后比较即可。

  1. #include<bits/stdc++.h>
  2. #define N 100005
  3. using namespace std;
  4. char s[N],p[N];
  5. int nxt[N],dp[N],cnt[N];
  6. void calcnext(char *s,int len,int *nxt){
  7. int i=,j;nxt[]=j=-;
  8. while(i<len){
  9. while(j!=-&&s[i]!=s[j])j=nxt[j];
  10. nxt[++i]=++j;
  11. }
  12. }
  13. int main(){
  14. scanf("%s",s);scanf("%s",p);
  15. calcnext(p,strlen(p),nxt);int slen=strlen(s),plen=strlen(p);
  16. //for(int i=0;i<plen;i++)printf("%d ",nxt[i]);puts("");
  17. if(plen>slen){puts("");return ;}
  18. else{
  19. memset(cnt,,sizeof(cnt));memset(dp,,sizeof(dp));
  20. for(int i=plen-;i<slen;i++){
  21. bool sqc=;
  22. for(int k=;k<plen;k++)
  23. if(s[i-k]!=p[plen--k]&&s[i-k]!='?'){sqc=;break;}
  24. dp[i]=dp[i-];
  25. if(sqc){
  26. cnt[i]=dp[i-plen];
  27. for(int k=nxt[plen];~k;k=nxt[k])cnt[i]=max(cnt[i],cnt[i-(plen-k)]);
  28. cnt[i]++;
  29. dp[i]=max(dp[i],cnt[i]);
  30. }
  31. }
  32. printf("%d\n",dp[slen-]);
  33. }
  34. }

这场没有DS题好差评……

不过有几道好题真是不错的呀。

【Educationcal Codeforces Round 21】的更多相关文章

  1. 【Educational Codeforces Round 19】

    这场edu蛮简单的…… 连道数据结构题都没有…… A.随便质因数分解凑一下即可. #include<bits/stdc++.h> #define N 100005 using namesp ...

  2. 【Educational Codeforces Round 22】

    又打了一场EDU,感觉这场比23难多了啊…… 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; ,ans=- ...

  3. 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra

    题意 给定一张无向图,对每个点$i\in S$求$\min_{j\in S} {2\times d(i,j)+a_j}$ 考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$ ...

  4. 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

    题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...

  5. 【Educational Codeforces Round 48】

    A:https://www.cnblogs.com/myx12345/p/9843001.html B:https://www.cnblogs.com/myx12345/p/9843021.html ...

  6. Educational Codeforces Round 21

    Educational Codeforces Round 21  A. Lucky Year 个位数直接输出\(1\) 否则,假设\(n\)十进制最高位的值为\(s\),答案就是\(s-(n\mod ...

  7. 【Codeforces Round 1137】Codeforces #545 (Div. 1)

    Codeforces Round 1137 这场比赛做了\(A\).\(B\),排名\(376\). 主要是\(A\)题做的时间又长又交了两次\(wa4\)的. 这两次错误的提交是因为我第一开始想的求 ...

  8. 【Codeforces Round 1132】Educational Round 61

    Codeforces Round 1132 这场比赛做了\(A\).\(B\).\(C\).\(F\)四题,排名\(89\). \(A\)题\(wa\)了一次,少考虑了一种情况 \(D\)题最后做出来 ...

  9. 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)

    Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...

随机推荐

  1. 【bzoj1617】[Usaco2008 Mar]River Crossing渡河问题 dp

    题目描述 Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木 ...

  2. HTML表单之input元素的23种type类型

    摘自:http://www.cnblogs.com/xiaohuochai/p/5179909.html 了解HTML表单之input元素的23种type类型 随着HTML5的出现,input元素新增 ...

  3. [NOIP2016] 天天爱跑步 桶 + DFS

    ---题面--- 题解: 很久以前就想写了,一直没敢做,,,不过今天写完没怎么调就过了还是很开心的. 首先我们观察到跑步的人数是很多的,要一条一条的遍历显然是无法承受的,因此我们要考虑更加优美的方法. ...

  4. 自学Python快速入门

    1 helloworld#基本语法print("hello") #换行print('1221312\12312312\2312312321312\21312312') ##表示注释 ...

  5. Android Canvas 绘图

    画布(Canvas)是图形编程中一个很普通的概念,通常由三个基本的绘图组件组成:       Canvas  提供了绘图方法,可以向底层的位图绘制基本图形.       Paint  也称为" ...

  6. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  7. [AHOI2008] 逆序对

    link 我们可以很容易的推断出$-1$是单调不降的,若$i>j$且$a_i$与$a_j$都没有填数,若填完之后$a_i>a_j$或者$a_i<a_j$,则对答案产生影响的只在$[i ...

  8. django项目初探

    一:创建django项目 设置数据库(默认sqlit3) mysql: setting:中设置 DATABASES = { 'default': { 'ENGINE': 'django.db.back ...

  9. snmp理论篇

    SNMP协议入门 1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询 ...

  10. Dynamic len(set(a[L:R])) UVA - 12345(这么过分一定要写博客)

    给出一个有n个元素的数组,有以下两种操作:Q x y,求出区间[x,y)内不同元素的个数, M x y,把第x个元素的值修改为y.注意题目中的下标是从0开始的 这题超级超级坑 妈的一个水题找了几个小时 ...