Codeforces #187Div2
2016-06-04 12:46
295 查看
刚打完一场CF打算歇一下,然后fsf很淡然地又帮我点开了个Virtual.
然后就哭着又做了一场……
显然这场没有上一场做得好……
A:
给你n个瓶子,每个瓶子有瓶盖的品牌和这个瓶盖能开启哪种品牌。
现在问最后剩下几个瓶子开不开。
(n <= 100)
B:
给定一个序列,每次进行3种操作:
1.把ai变成v
2.所有数+x
3.询问a_i的值。
我们开个全局变量一搞就好了,复杂度O(n)
C:
题太长不想读。
D:
知道是一个很难写的模拟,不想写。
E:
开E,发现E不是很难。
给定n个元素组成的序列{a1...an},对于所有的不重复不降子序列{p1...pk},统计∑pΠki=1pi
其中p为{a1...an}的不降子序列。
设f[i]表示以i结尾的总和。
f[i]=((∑f[j])+1)⋅a[i]
然后需要减去一些不合法的东西,比如我们在更新树状数组的时候,实际上需要去掉上一个与ai相等的那个f值。
然后我们在最后询问的时候,我们只需要加上最后那个就成了。
然后就哭着又做了一场……
显然这场没有上一场做得好……
A:
给你n个瓶子,每个瓶子有瓶盖的品牌和这个瓶盖能开启哪种品牌。
现在问最后剩下几个瓶子开不开。
(n <= 100)
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Rep(i,n) for(int i = 1;i <= n;i ++) using namespace std; const int N = 1005; int u ,v ; bool vis ; int main () { int n; scanf("%d",&n); Rep(i,n) scanf("%d%d",&u[i],&v[i]); Rep(i,n) { Rep(j,n) if(i != j) { if(u[j] == v[i])vis[j] = 1; } } int cnt = 0; Rep(i,n)if(!vis[i])cnt ++; printf("%d\n",cnt); return 0; }
B:
给定一个序列,每次进行3种操作:
1.把ai变成v
2.所有数+x
3.询问a_i的值。
我们开个全局变量一搞就好了,复杂度O(n)
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Rep(i,n) for(int i = 1;i <= n;i ++) using namespace std; const int N = 100005; long long tag = 0; long long a ; int main () { int n,m; scanf("%d%d",&n,&m); Rep(i,n)scanf("%I64d",&a[i]); Rep(i,m){ int op; scanf("%d",&op); if(op == 1) { int pos; long long x; scanf("%d%lld",&pos,&x); a[pos] = x - tag; } else if(op == 2) { int opp ; scanf("%d",&opp); tag += opp; } else if(op == 3) { int pos ; scanf("%d",&pos); printf("%I64d\n",a[pos] + tag); } } return 0; }
C:
题太长不想读。
D:
知道是一个很难写的模拟,不想写。
E:
开E,发现E不是很难。
给定n个元素组成的序列{a1...an},对于所有的不重复不降子序列{p1...pk},统计∑pΠki=1pi
其中p为{a1...an}的不降子序列。
设f[i]表示以i结尾的总和。
f[i]=((∑f[j])+1)⋅a[i]
然后需要减去一些不合法的东西,比如我们在更新树状数组的时候,实际上需要去掉上一个与ai相等的那个f值。
然后我们在最后询问的时候,我们只需要加上最后那个就成了。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define Rep(i,n) for(int i = 1;i <= n;i ++) using namespace std; const int N = 1000050; const int Mod = 1e9 + 7; const int nn = 1e6; long long f ; int a , pre , cur ; long long t ; bool vis ; void Add(int i,long long val){for(int x = i;x <= nn;x += x & -x)t[x] = (t[x] + val) % Mod;} long long Qry(int x) { long long ans = 0; for(;x;x -= x & -x)ans = (ans + t[x]) % Mod; return ans % Mod; } int main () { int n; scanf("%d",&n); Rep(i,n)scanf("%d",&a[i]); Rep(i,n) { pre[i] = cur[a[i]], cur[a[i]] = i; f[i] = (Qry(a[i]) + 1ll) * a[i] % Mod; Add(a[i],(f[i] - f[pre[i]] + Mod) % Mod); } long long ans = 0; for (int i = n; i >= 1; -- i) if (!vis[a[i]]) ans = (ans + f[i]) % Mod, vis[a[i]] = true; printf("%I64d\n",ans % Mod); return 0; }
相关文章推荐
- 异或运算符的应用
- java的数据映射
- 卡尔曼(Kalman)滤波(一)--Kalman滤波的本质
- ffmpeg学习---vs2008下ffmpeg配置
- 二分查找算法
- 裁剪图片(自定义裁剪范围)
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
- BZOJ 2752 [HAOI2012]高速公路(road)【线段树
- SQL Server Management Studio (SSMS) Studio June 2016
- 英文论文润色的问题
- 浅谈html/CSS
- FastDFS文件系统安装及部署
- 通过代码入门Spring①何为IOC
- Android自定义控件之滑动开关
- java集合框架详解
- 买家具
- storage存储节点启动失败原因分析及解决办法
- hdu 3549 Flow Problem (最大流入门题)
- Codeforces AIM Tech Round (Div. 2) A. Save Luke
- 第十五周项目一 阅读下面程序,解释运行结果(2)