【SinGuLaRiTy-1032】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.

                            

游戏 (game)

题目描述

A和B在玩游戏。桌子上有n个格子,其中一些格子放有棋子‘x’,空格子用‘o’表示。A和B轮流进行以下操作中的任何一种。
1>当某一个棋子右边有空格时,将该棋子向右移动一位。
ooxoo -> oooxo
2>当某一个棋子右边恰好是连续的两个棋子时,将该棋子直接跳过连续的两个棋子。
ooxxxoo -> oooxxxo
当棋子到达终点(最右端的格子)时,棋子将消失。当某一方不能移动时,这方输。A先走。请问A是否必胜?

输入

多组测试数据。
对于每一组测试数据:
第一行输入一个整数n,表示格子数量。
第二行输入长度为n的‘x’‘o’串。

输出

对于每一组测试数据,输出一行“YES”或者“NO”。

样例数据

样例输入 样例输出

4
ooxo
4
xxxo
5
oxxxo

YES
NO
NO

<数据范围>

对于30%的数据,n<=20。
对于100%的数据,n<=10^6 ,测试数据组数 T<=5。

解析

这道题其实考点是博弈论(还不了解博弈论?阅读一下这些论文吧。[点击下载]) ,不过由于策略比较简单,可以通过找规律来得到答案。

考虑所有棋子到终点的距离和sum,观察无论哪一种操作都恰好改变了sum的奇偶性。若sum为奇数,则A必胜;否则A必败。

时间复杂度:O(n)。

Code

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; #define N 1000005
#define ll long long char S[N];
int t,n;
ll k; int main()
{
while(scanf("%d",&n)==)
{
scanf("%s",S+);
k=;
for(int i=;i<=n;i++)
if(S[i]=='x')
k+=n-i;
if(k&)
printf("YES\n");
else
printf("NO\n");
}
return ;
}

轰炸 (bomb)

题目描述

A国和B国开战。B国国王痴迷于树,所以B国的城市道路是一棵树的形状。A国情报局通过B国地下组织获取了该消息……给力的地下党还窃取了B国每一个城市的火药储备量m[i],即轰炸城市i可以同时炸掉距离城市i在m[i]之内的其他城市。
由于A国国力有限,A国情报局局长想知道至少需要炸几次才能把B国所有城市都炸掉……

输入

第一行输入一个整数n,表示B国的城市数量。
第二行输入n个整数,第i个整数m[i]表示城市i的火药储备量。
接下来的n-1行,每一行输入两个整数u、v,表示一条连接城市u、v长度为1的城市道路。

输出

输出一行一个整数,即最少轰炸次数。

样例数据

样例输入 样例输出

5
1 1 1 1 1
1 2
2 3
3 4
4 5

 2

<数据范围>

对于10%的数据,n<=10 。
对于30%的数据,n<=1000 。
对于100%的数据,n<=10^5 , m[i]<=100 。

解析

一看这道题,就感觉有点像战略游戏这道题,于是就想到了用树形DP。

好吧,这就是一道典型的树形DP。

令f[u][i]表示以u为根的子树被完全破坏,同时还能向上延伸i的最小值。

令g[u][i]表示以u为根的子树未被完全破坏,还应向下延伸i的最小值。

转移方程式:

1.不轰炸u节点

2.轰炸u节点

很显然直接这样做是会TLE的。

令minf[u][i]表示,同理ming[u][i]表示

再用s1[u][i]表示

s2[u][i]表示

那么上述转移方程式可以写成:

这样时间复杂度为O(100n)。

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath> #define MAXN 100010 using namespace std; char word; void Read(int &t)
{
t=;
do word=getchar();while(word<''||word>'');
do{t=t*+word-'';word=getchar();}while(word>=''&&word<='');
} struct node
{
int v;
node *next;
}edge[MAXN*],*adj[MAXN],*tmp=edge; int n, mx, m[MAXN];
int f[MAXN][],minf[MAXN][],g[MAXN][],ming[MAXN][],s1[MAXN][],s2[MAXN][]; inline void add(int u,int v)
{
tmp->v=v;
tmp->next=adj[u];
adj[u]=tmp;
++tmp;
tmp->v=u;
tmp->next=adj[v];
adj[v]=tmp;
++tmp;
} void dp(int u,int fa)
{
int v,i;
for(node *p=adj[u];p;p=p->next)
if((v=p->v)!=fa)
{
dp(v,u);
s1[u][]+=minf[v][],s2[u][]+=minf[v][];
for(i=;i<=mx;++i)
s1[u][i]+=min(minf[v][i+],ming[v][i-]),s2[u][i]+=min(ming[v][i-],minf[v][i]);
}
for(i=mx+;i>=;--i)
f[u][i]=g[u][i]=minf[u][i]=ming[u][i]=n;
g[u][]=s2[u][];
for(node *p=adj[u];p;p=p->next)
if((v=p->v)!=fa)
{
f[u][]=min(f[u][],f[v][]+s1[u][]-minf[v][]);
for(i=;i<=mx;++i)
{
f[u][i]=min(f[u][i],f[v][i+]+s1[u][i]-min(minf[v][i+],ming[v][i-]));
g[u][i]=min(g[u][i],g[v][i-]+s2[u][i]-min(ming[v][i-],minf[v][i]));
}
}
f[u][m[u]]=min(f[u][m[u]],s1[u][m[u]]+);
minf[u][]=f[u][],ming[u][]=g[u][];
for(i=;i<=mx+;++i)
minf[u][i]=min(f[u][i],minf[u][i-]),ming[u][i]=min(g[u][i],ming[u][i-]);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
Read(m[i]),mx=max(mx,m[i]);
for(int i=,u,v;i<n;++i)
Read(u),Read(v),add(u,v);
dp(,);
printf("%d",minf[][mx]);
return ;
}

统计 (count)

题目描述

定义一个整数集合S,S中的元素满足在十进制表示下只有5和7,例如5、7、57、75。
对于一个有n个元素的数列{a}进行以下两种操作:
操作一:add l r v,表示对于数列中加上v。
操作二:query l r,表示询问数列中有多少个 i∈[l,r]满足 ai∈S。

输入

第一行输入两个整数n、m,分别表示数列长度和操作次数。
第二行输入n个整数,表示这个数列。
接下来的m行,每一行输入一个操作,操作格式如上。

输出

对于每一个询问操作输出一行一个整数。

样例数据

样例输入 样例输出

10 5
1 5 7 2 5 75 8 7 9 57
query 2 7
add 1 5 2
query 1 5
add 3 8 -1
query 1 10

4
2
3

<数据范围>

对于100%的数据,n,m<=10^5,ai在任何时刻都满足ai∈[1,10000]。

解析

令K表示在10000以内S集合的元素个数,K=30。

把序列划分成长度为B的若干块。对于一个块,用cnt[i]表示i在块中的个数,同时维护一个加法标记。

接下来考虑如何处理这两种操作:

Add l r:对于块外的元素,暴力修改,时间复杂度O(B)。对于连续的块,修改标记即可,时间复杂度O(n/B)。

Query l r v:对于块外的元素,标记下传暴力查询,时间复杂度O(B)。对于连续的块,假设已经打上了Δx的标记,就对于每一个L∈S,统计块中有多少个L-Δx,时间复杂度O(n*K/B)。

总时间复杂度:O(m*(B+n*K/B))。由耐克函数的相关性质可得,当时B=sqrt(n*K/B),时间复杂度最小。

Code

#include<iostream>
#include<cstdio>
#include<cmath> #define MAXN 100005 using namespace std; char word,s[];
bool ff; void Read(int &t)
{
t=,ff=;
do{word=getchar();if(word=='-')ff=;}while(word<''||word>'');
do{t=t*+word-'';word=getchar();}while(word>=''&&word<='');
if(ff)t=-t;
} int n,m,cnt,num[MAXN],pos[MAXN],pos2[MAXN];
const int a[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
bool F[]; struct block
{
int num[], len, flag;
int cnt[];
inline void add(int a)
{
++cnt[a];
num[++len]=a;
}
inline void putdown()
{
if(flag)
{
for(int i=;i<=len;++i)
{
--cnt[num[i]];
num[i]+=flag;
++cnt[num[i]];
}
flag=;
}
}
inline void modify(int l,int r,int v)
{
if(l==&&r==len)
{
flag+=v;
return;
}
putdown();
for(int i=l;i<=r;++i)
{
--cnt[num[i]];
num[i]+=v;
++cnt[num[i]];
}
}
inline int query()
{
int ans=;
for(int i=;i<=;++i)
if(a[i]-flag<=&&a[i]-flag>=)
ans+=cnt[a[i]-flag];
return ans;
}
inline int query(int l,int r)
{
if(l==&&r==len)
return query();
putdown();
int ans=;
for(int i=l;i<=r;++i)
if(F[num[i]])
++ans;
return ans;
}
}b[]; inline void build()
{
int l=(int)sqrt(n*+0.5);
cnt=;
for(int i=;i<=n;++i)
{
if(b[cnt].len==l)
++cnt;
b[cnt].add(num[i]);
pos[i]=cnt, pos2[i]=b[cnt].len;
}
} inline void add(int l,int r,int v)
{
int L=pos[l], R=pos[r];
if(L==R)
{
b[L].modify(pos2[l],pos2[r],v);
return;
}
for(int i=L+;i<R;++i)
b[i].flag+=v;
b[L].modify(pos2[l],b[L].len,v);
b[R].modify(,pos2[r],v);
} inline int query(int l,int r)
{
int L=pos[l],R=pos[r];
if(L==R)
return b[L].query(pos2[l],pos2[r]);
int ans=b[L].query(pos2[l],b[L].len)+b[R].query(,pos2[r]);
for(int i=L+;i<R;++i)
ans+=b[i].query();
return ans;
} int main()
{
for(int i=;i<=;++i)
F[a[i]]=;
Read(n),Read(m);
for(int i=;i<=n;++i)
Read(num[i]);
build();
int l,r,v;
while(m--)
{
scanf("%s",s);
Read(l),Read(r);
if(s[]=='a')
{
Read(v);
add(l,r,v);
}
else
printf("%d\n",query(l,r));
}
return ;
}

Time: 2017-07-27

[SinGuLaRiTy] NOIP模拟赛(TSY)-Day 1的更多相关文章

  1. [SinGuLaRiTy] NOIP模拟赛(TSY)-Day 2

    [SinGuLaRiTy-2033] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.                              ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. 聊聊基于Lucene的搜索引擎核心技术实践

    最近公司用到了ES搜索引擎,由于ES是基于Lucene的企业搜索引擎,无意间在“聊聊架构”微信公众号里发现了这篇文章,分享给大家. 请点击链接:聊聊基于Lucene的搜索引擎核心技术实践

  2. POJ3321(dfs序列+树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25711   Accepted: 7624 Descr ...

  3. (转)更改Web.config中对上传文件大小限制

    .net上传超过200K的图片的时候,会跳转到404,但是url没有错误,真J8的坑啊. 本文转载自:http://www.cnblogs.com/zwffff/archive/2009/04/29/ ...

  4. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  5. 并发编程之五--ThreadLocal

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  6. Java-API:java.util.Date

    ylbtech-Java-API:java.util.Date Module java.base Package java.util Class Date java.lang.Object java. ...

  7. rails 自定义校验及validates_each多校验

    一.自定义校验 使用 validate 方法传入一个同名方法的 Symbol 即可. validate :my_validation private def my_validation if name ...

  8. Apache Geronimo Remote Code Execute Vulnerability

    简介: Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念. 这些技术和理念大多源自独立的项目,配置和部署模型也各不相同. Geron ...

  9. C#引用类库时出现黄色三角加感叹号的处理

    C#引用类库时出现黄色三角加感叹号的处理方法 一个C#项目 在引用中有个引用项上有个黄色三角加感叹号 导致报错 类库的目标框架不一致,修改成一样就可以了. 选中类库右击属性:“目标框架”,修改成与引用 ...

  10. 如何实现1080P延迟低于500ms的实时超清直播传输技术<转>

    转载地址:http://www.yunweipai.com/archives/9037.html 最近由于公司业务关系,需要一个在公网上能实时互动超清视频的架构和技术方案.众所周知,视频直播用 CDN ...