智力彻底没有了。。。看来再也拿不到奖金了QAQ。。。

A B君的游戏

因为数据是9B1L,所以我们可以hash试一下数据。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #define rep(i,s,t) for(int i=s;i<=t;i++)
  6. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  7. using namespace std;
  8. inline int read() {
  9. int x=0,f=1;char c=getchar();
  10. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  11. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  12. return x*f;
  13. }
  14. typedef unsigned long long ll;
  15. int main() {
  16. int n=read();ll ans=0,ans2=0;
  17. rep(i,1,n) {
  18. ll c;scanf("%llu",&c);
  19. ans^=c;ans2^=(c%52501);
  20. }
  21. if((ans&1)&&(!(ans&2))&&(ans&4)&&(ans2&1)&&(!(ans2&2))) puts("L");
  22. else puts("B");
  23. return 0;
  24. }

B 完美消除

这道数位DP题应该还是不错的,我们先考虑给定一个数消成0的最小步数如何计算。

从高位到低位依次考虑每一位,设当前数字为x,将栈里所有大于x的数字删除,如果此时栈里没有数字x则加入,并且答案+1。

我们把这个想法套到数位DP中,设f[len][S][k][c]表示前len位,栈中集合为S,当前已经进行过k次操作,当前的数与给定数的大小关系。

转移时枚举下一位填什么数字即可。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #define rep(i,s,t) for(int i=s;i<=t;i++)
  6. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  7. using namespace std;
  8. inline int read() {
  9. int x=0,f=1;char c=getchar();
  10. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  11. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  12. return x*f;
  13. }
  14. typedef long long ll;
  15. int k,bit[20];
  16. ll f[20][1050][20][2];
  17. //f[len][S][sumv][<?=]
  18. ll solve(ll n) {
  19. memset(f,0,sizeof(f));
  20. int len=0;
  21. while(n) bit[++len]=n%10,n/=10;
  22. reverse(bit+1,bit+len+1);
  23. f[0][1][0][0]=1;
  24. rep(i,1,len) rep(S,1,1023) rep(v,0,k) rep(c,0,1) {
  25. ll ans=f[i-1][S][v][c];if(!ans) continue;
  26. rep(y,0,9) if(y<=bit[i]||c) {
  27. int S2=S|(1<<y),k2=v+1;
  28. rep(j,y+1,9) if(S>>j&1) S2^=(1<<j);
  29. if(S>>y&1) k2--;
  30. f[i][S2][k2][c|(y<bit[i])]+=ans;
  31. }
  32. }
  33. ll ans=0;
  34. rep(S,1,1023) ans+=f[len][S][k][1];
  35. return ans;
  36. }
  37. int main() {
  38. ll l,r;scanf("%lld%lld",&l,&r);k=read();
  39. printf("%lld\n",solve(r+1)-solve(l));
  40. return 0;
  41. }

C lyk与gcd

枚举(i,j)= k,考虑维护S[k]=sigma{A[i]  |  k|i},然后再容斥一下就能计算出每次询问的答案了。

所以我们预处理出来所有数的因数和mu函数,然后就能每次O(sqrt(N))实现了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #define rep(i,s,t) for(int i=s;i<=t;i++)
  6. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  7. using namespace std;
  8. inline int read() {
  9. int x=0,f=1;char c=getchar();
  10. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  11. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  12. return x*f;
  13. }
  14. const int maxn=100010;
  15. const int maxm=2000010;
  16. typedef long long ll;
  17. int first[maxn],next[maxm],to[maxm],cnt,e;
  18. void Addpri(int u,int v) {to[++e]=v;next[e]=first[u];first[u]=e;}
  19. int vis[maxn],mu[maxn],pri[maxn];
  20. void init(int n) {
  21. rep(i,1,n) for(int j=i;j<=n;j+=i) Addpri(j,i);
  22. mu[1]=1;
  23. rep(i,2,n) {
  24. if(!vis[i]) pri[++cnt]=i,mu[i]=-1;
  25. rep(j,1,cnt) {
  26. if(pri[j]*i>n) break;
  27. vis[pri[j]*i]=1;
  28. if(i%pri[j]==0) {mu[i*pri[j]]=0;continue;}
  29. mu[i*pri[j]]=-mu[i];
  30. }
  31. }
  32. }
  33. int B[maxn],sum;
  34. int n,m,A[maxn];
  35. void Add(int x,int v) {
  36. sum+=v;
  37. for(int i=first[x];i;i=next[i]) B[to[i]]+=v*mu[to[i]];
  38. }
  39. int query(int x) {
  40. int res=0;
  41. for(int i=first[x];i;i=next[i]) res+=B[to[i]];
  42. return res;
  43. }
  44. int main() {
  45. n=read();m=read();init(n);
  46. rep(i,1,n) Add(i,A[i]=read());
  47. rep(i,1,m) {
  48. int t=read(),x=read();
  49. if(t==2) printf("%d\n",query(x));
  50. else {
  51. int v=read();Add(x,v-A[x]);
  52. A[x]=v;
  53. }
  54. }
  55. return 0;
  56. }

E Danganronpa

我的做法是基于AC自动机的。

考虑先将证言串和言弹串放在一棵AC自动机上,则一个言弹对一个证言的伤害即为证言有多少前缀在言弹对应fail树的子树。

考虑对每个询问以证言出现时间为第一关键字、以询问时间为第二关键字、AC自动机上位置为第三关键字,然后直接跑树上莫队即可。

时间复杂度为O(N^(5/3)logN)。但因为常数较小所以还可以跑过。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<cctype>
  5. #include<algorithm>
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. using namespace std;
  9. inline int read() {
  10. int x=0,f=1;char c=getchar();
  11. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  12. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  13. return x*f;
  14. }
  15. typedef long long ll;
  16. const int maxn=200010;
  17. int SIZE,ch[maxn][26],pa[maxn],cnt;
  18. int insert(int p,int c) {
  19. if(!ch[p][c]) ch[p][c]=++cnt;
  20. pa[ch[p][c]]=p;
  21. return ch[p][c];
  22. }
  23. int f[maxn],que[maxn],first1[maxn],first2[maxn],e1,e2;
  24. struct Edge {
  25. int to,next;
  26. }edges1[maxn],edges2[maxn];
  27. void AddEdge1(int u,int v) {edges1[++e1]=(Edge){v,first1[u]};first1[u]=e1;}
  28. void AddEdge2(int u,int v) {edges2[++e2]=(Edge){v,first2[u]};first2[u]=e2;}
  29. int dep[maxn],sta[maxn],cur[maxn],blo[maxn],top,tmp;
  30. void dfs1(int x) {
  31. dep[x]=dep[pa[x]]+1;cur[x]=top;
  32. for(int i=first1[x];i;i=edges1[i].next) {
  33. int v=edges1[i].to;dfs1(v);
  34. if(top-cur[x]>SIZE) {
  35. tmp++;
  36. while(top>cur[x]) blo[sta[top--]]=tmp;
  37. }
  38. }
  39. sta[++top]=x;
  40. }
  41. int st[maxn],en[maxn];
  42. void dfs2(int x) {
  43. st[x]=++tmp;
  44. for(int i=first2[x];i;i=edges2[i].next) dfs2(edges2[i].to);
  45. en[x]=tmp;
  46. }
  47. void getfail() {
  48. int l=1,r=0;
  49. rep(c,0,25) if(ch[0][c]) que[++r]=ch[0][c];
  50. while(l<=r) {
  51. int x=que[l++],v;
  52. rep(c,0,25) if(v=ch[x][c]) {
  53. que[++r]=v;int j=f[x];
  54. while(j&&!ch[j][c]) j=f[j];
  55. f[v]=ch[j][c];
  56. }
  57. }
  58. rep(i,1,cnt) AddEdge1(pa[i],i);
  59. dfs1(0);while(top) blo[sta[top--]]=tmp;
  60. rep(i,1,cnt) AddEdge2(f[i],i);
  61. tmp=0;dfs2(0);
  62. }
  63. int posa[maxn],tima[maxn],posb[maxn],ca,cb;
  64. int n,m,q,t[maxn],p[maxn],blt[maxn];
  65. struct Query {
  66. int b,t,x;
  67. bool operator < (const Query& ths) const {
  68. if(blo[x]!=blo[ths.x]) return blo[x]<blo[ths.x];
  69. if(blt[t]!=blt[ths.t]) return t<ths.t;
  70. return b<ths.b;
  71. }
  72. }Q[maxn];
  73. struct Fenwich {
  74. int sumv[maxn];
  75. Fenwich() {memset(sumv,0,sizeof(sumv));}
  76. void add(int x,int v) {for(;x<=cnt+1;x+=x&-x) sumv[x]+=v;}
  77. int sum(int x) {int res=0;for(;x;x-=x&-x) res+=sumv[x];return res;}
  78. }T1,T2;
  79. ll curans,ans[maxn];
  80. int lca(int u,int v) {
  81. while(u!=v) {
  82. if(dep[u]<dep[v]) swap(u,v);
  83. u=pa[u];
  84. }
  85. return v;
  86. }
  87. void Move(int u,int v) {
  88. int c=lca(u,v);
  89. while(u!=c) {
  90. curans-=T1.sum(st[u]);
  91. T2.add(st[u],-1);
  92. u=pa[u];
  93. }
  94. while(v!=c) {
  95. curans+=T1.sum(st[v]);
  96. T2.add(st[v],1);
  97. v=pa[v];
  98. }
  99. }
  100. void U(int x,int v) {
  101. if(!x) return;
  102. T1.add(st[x],v);T1.add(en[x]+1,-v);
  103. curans+=(T2.sum(en[x])-T2.sum(st[x]-1))*v;
  104. }
  105. int main() {
  106. n=read();SIZE=sqrt(n*15);
  107. rep(i,1,n) blt[i]=(i-1)/SIZE+1;
  108. rep(i,1,n) {
  109. ans[i]=-1;
  110. char cmd[20],c[2];int x;
  111. scanf("%s",cmd);
  112. if(cmd[0]=='I') {
  113. scanf("%s%d",c,&x);
  114. posa[++ca]=insert(posa[x],c[0]-'a');
  115. }
  116. if(cmd[0]=='A') {
  117. scanf("%s%d",c,&x);
  118. posb[++cb]=insert(posb[x],c[0]-'a');
  119. tima[cb]=i;
  120. }
  121. if(cmd[0]=='S') t[++q]=i,p[q]=posa[read()];
  122. if(cmd[0]=='Q') x=read(),Q[++m]=(Query){tima[x],i,posb[x]};
  123. }
  124. getfail();
  125. int cx=0,l=1,r=0;
  126. sort(Q+1,Q+m+1);
  127. rep(i,1,m) {
  128. if(!Q[i].b) {ans[Q[i].t]=0;continue;}
  129. while(t[l]<Q[i].b) U(p[l++],-1);
  130. while(l&&t[l-1]>Q[i].b) U(p[--l],1);
  131. while(r<q&&t[r+1]<Q[i].t) U(p[++r],1);
  132. while(t[r]>Q[i].t) U(p[r--],-1);
  133. Move(cx,Q[i].x);cx=Q[i].x;
  134. ans[Q[i].t]=curans;
  135. }
  136. rep(i,1,n) if(ans[i]>=0) printf("%lld\n",ans[i]);
  137. return 0;
  138. }

  

51nod算法马拉松15的更多相关文章

  1. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛

    OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...

  2. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  3. 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)

    题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...

  4. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  5. 51Nod 算法马拉松21(迎新年)

    这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...

  6. 51Nod 算法马拉松23 开黑记

    惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...

  7. 51Nod 算法马拉松22 开黑记

    这是一场惨烈的开黑大战,始于全机房开黑指望刷进rank前十拿钱的壮志,终于被各路神犇怒踩成rank20,差点200点头盾不保的落魄,想起将近一年前ad和zcg等学长挤进rank10的壮举,不由得唏嘘, ...

  8. 51nod算法马拉松 contest7

    A题 链接:http://www.51nod.com/contest/problem.html#!problemId=1417 推荐链接:http://blog.csdn.net/a837199685 ...

  9. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

随机推荐

  1. 4541: [Hnoi2016]矿区

    学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...

  2. iOS Architectures 浅谈

    iOS项目打包,或者只是在项目里面调用第三方静态库抑或是自己新建一个静态库,就要无可避免的和Architectures打交道.Architectures在Targets面板的Build Setting ...

  3. JetBrains PyCharm 2016.2.3注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  4. acm 1002 算法设计

    最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...

  5. REPL环境

    一.Node的REPL基本操作 REPL(Read-eval-print-loop):交互式解析器 在REPL环境下,可以定义和运行变量.函数.对象. REPL的常用命令: 进入node,即进入了RE ...

  6. Mac Pro 8G 安装MyEclipse提示虚拟内存为0 安装失败

    看的一个大神的博客,一句话解决了.哈哈   百度一下很多人都说开多一点程序,让程序占满内存,使其虚拟内存使用就能通过这一步骤,但这里有个更好一点的方案 通过执行: memory_pressure -l ...

  7. October 29th Week 44th Saturday 2016

    I am a slow walker, but I never walk backwards. 我走得慢,但我从不后退. I walked very slow, sometimes I even sl ...

  8. nodeJS常用的定时执行任务的插件

    later:https://github.com/bunkat/later star:1765 fork:120 node-schedule  https://github.com/node-sche ...

  9. mongodb安装、启动、远程连接

    1.现在mongodb安装包 mongodb-linux-x86_64-3.0.6.tgz 2.解压缩安装包 tar zxvf  mongodb-linux-x86_64-3.0.6.tgz /opt ...

  10. hdu 5384 Danganronpa

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 思路:没学自动机时以为是道KMP然后就tle了好几把,AC自动机模板题 #include<cs ...