您的位置:首页 > 其它

Codeforces #187Div2

2016-06-04 12:46 295 查看
刚打完一场CF打算歇一下,然后fsf很淡然地又帮我点开了个Virtual.

然后就哭着又做了一场……

显然这场没有上一场做得好……

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: