A

判断下5个名字出现了几次.pre数据巨弱,就这么一水题在std测刷掉了非常多的人..

/** @Date    : 2017-10-24 16:04:41
* @FileName: A.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; string a;
map<string, int>q;
string t[5] = { "Danil", "Olya", "Slava", "Ann" , "Nikita"};
int main()
{
q["Danil"] = 1;
q["Olya"] = 1;
q["Slava"] = 1;
q["Ann"] = 1;
q["Nikita"] = 1;
cin >> a;
int cnt = 0;
for(int i = 0; i < a.length(); i++)
{
for(int j = 0; j < 5; j++)
{
string tmp;
for(int k = 0; k < t[j].length(); k++)
tmp+=a[i + k];
//cout << tmp << endl;
if(tmp == t[j])
{
i += t[j].length() - 1, cnt++;
break;
}
}
}
printf("%s\n", cnt==1?"YES":"NO");
return 0;
}

B

DP思维,记忆化搜索,前后缀什么的都可以.dp[i]['a'/'b']代表到第i个字符时,此时以a结尾和以b结尾的最大长度,也就是a~a和a~b两种串的长度,这样从后往前再扫一遍,合并统计一下取最大值.所以当前为a则必须从a串转移,为b则从a串和ab串中大的转移就好了.这思路还是队友提供的orz 还有种巨短代码的思路其实也比较接近,维护a ab aba的数量不断取大值.

/** @Date    : 2017-10-24 10:43:38
* @FileName: B.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; char a[5050];
int pre[5050][2];
int suf[5050][2];
int main()
{
scanf("%s", a + 1);
int n = strlen(a + 1);
MMF(pre);
MMF(suf);
for(int i = 1; i <= n; i++)
{
if(a[i] == 'a')
{
pre[i][0] = pre[i - 1][0] + 1;
pre[i][1] = pre[i - 1][1];
}
else if(a[i] == 'b')
{
pre[i][1] = max(pre[i - 1][0], pre[i - 1][1]) + 1;
pre[i][0] = pre[i - 1][0];
}
}
for(int i = n; i >= 1; i--)
{
if(a[i] == 'a')
{
suf[i][0] = suf[i + 1][0] + 1;
suf[i][1] = suf[i + 1][1];
}
else
{
suf[i][1] = max(suf[i + 1][0], suf[i + 1][1]) + 1;
suf[i][0] = suf[i + 1][0];
}
}
int ma = 0;
for(int i = 0; i <= n; i++)
{
int x = max(pre[i][0] + suf[i][1], pre[i][1] + suf[i][0]);
int y = max(pre[i][0] + suf[i + 1][0], pre[i][1] + suf[i + 1][1]);
ma = max(ma, max(x, y));
}
cout << ma << endl;
return 0;
}

C

贪心构造,画一下就知道,炸一个格子会把剩余1次的分到两边去,然后每隔一个格子炸一次,那么就尽可能的把剩余1次的分到了没炸的地方上,同理再进行这样2遍,就能保证炸完所有坦克了,然后注意长度为奇数时,第一遍必定要先炸偶数格,因为这样保证了炸了2遍的格子数比炸一遍的格子数要少1.

/** @Date    : 2017-10-24 10:38:35
* @FileName: C 构造.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; int ans[5*N];
int main()
{
int n;
cin >> n;
int cnt = 0;
for(int i = 2; i <= n; i+=2)
ans[cnt++] = i;
for(int i = 1; i <= n; i+=2)
ans[cnt++] = i;
for(int i = 2; i <= n; i+=2)
ans[cnt++] = i;
printf("%d\n", cnt);
for(int i = 0; i < cnt; i++)
printf("%d%s", ans[i], i==cnt-1?"\n":" ");
return 0;
}

D

BFS,4方向一次可走k步询问终点最小消费次数.注意题目说每次只能一个方向最多走k步...那么简单了,但是要注意有个小细节留在了std测,一个格子的一个方向各可以被走一次...不要直接把格子全部标记了..

/** @Date    : 2017-10-24 14:12:19
* @FileName: D bfs.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; int n, m, k;
int sx, sy, tx, ty;
char mp[1010][1010];
int vis[1010][1010][4];
int dir[4][2]={1,0,-1,0,0,1,0,-1}; int bfs()
{
queue<pair<pair<int,int> ,int> >q;
q.push({{sx, sy}, 0});
MMI(vis[sx][sy]);
while(!q.empty())
{
pair<pair<int,int>, int> nw = q.front();
q.pop();
//cout << nw.fi.fi << " " << nw.fi.se << endl;
if(nw.fi.fi == tx && nw.fi.se == ty)
return nw.se;
for(int i = 0; i < 4; i++)
{
for(int j = 1; j <= k; j++)
{
int x = nw.fi.fi + dir[i][0]*j;
int y = nw.fi.se + dir[i][1]*j;
if(x < 1 || x > n || y < 1 || y > m || vis[x][y][i] || mp[x][y] == '#')
break;
vis[x][y][i] = 1;
q.push({{x, y}, nw.se + 1}); } }
}
return -1;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
scanf("%s", mp[i] + 1);
scanf("%d%d%d%d", &sx, &sy, &tx, &ty);
int ans = bfs();
printf("%d\n", ans);
return 0;
}

E

DFS序 线段树,对子树询问1的数量,对子树把1变0,0变1.DFS得到序,用线段树维护和就好了..

/** @Date    : 2017-10-24 11:19:57
* @FileName: E DFS序 线段树.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 2e5+20;
const double eps = 1e-8; int pos[N];
int r[N];
int cnt = 0; struct sion{
int nxt, to;
}eg[N * 2];
int head[N * 2];
int tot; int init()
{
MMF(pos);
MMF(pos);
MMF(r);
MMG(head);
tot = cnt = 0;
} void add(int x, int y)
{
eg[tot].to = y;
eg[tot].nxt = head[x];
head[x] = tot++;
} struct yuu
{
int l, r;
int add, sum;
}tt[N << 2]; inline void pushup(int rt)
{
tt[rt].sum = (tt[rt << 1].sum + tt[rt << 1 | 1].sum);
} void pushdown(int rt)
{
if(tt[rt].add != 0)
{
tt[rt << 1].add ^= tt[rt].add;
tt[rt << 1 | 1].add ^= tt[rt].add;
tt[rt << 1].sum = tt[rt << 1].r - tt[rt << 1].l + 1 - tt[rt << 1].sum;
tt[rt << 1 | 1].sum = tt[rt << 1 | 1].r - tt[rt << 1 | 1].l + 1 - tt[rt << 1 | 1].sum; tt[rt].add ^= 1;
}
} void build(int l, int r, int rt)
{
tt[rt].l = l;
tt[rt].r = r;
tt[rt].add = tt[rt].sum = 0;
if(l == r)
return ;
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
} void update(int l, int r, int rt)
{
if(l <= tt[rt].l && r >= tt[rt].r)
{
tt[rt].add ^= 1;
tt[rt].sum = tt[rt].r - tt[rt].l + 1 - tt[rt].sum;
return ;
}
pushdown(rt);
int mid = (tt[rt].l + tt[rt].r) >> 1;
if(l <= mid)
update(l, r, rt << 1);
if(r > mid)
update(l, r, rt << 1 | 1);
pushup(rt);
} int query(int l, int r, int rt)
{
if(l <= tt[rt].l && r >= tt[rt].r)
return tt[rt].sum;
pushdown(rt);
int ans = 0;
int mid = (tt[rt].l + tt[rt].r) >> 1;
if(l <= mid)
ans += query(l, r, rt << 1);
if(r > mid)
ans += query(l, r, rt << 1 | 1);
return ans;
} int dfs(int x, int pre)
{
pos[x] = ++cnt;
for(int i = head[x]; ~i; i = eg[i].nxt)
{
if(eg[i].to == pre)
continue;
dfs(eg[i].to, x);
}
r[x] = cnt;
} int main()
{
int n;
cin >> n;
init();
for(int i = 2; i <= n; i++)
{
int y;
scanf("%d", &y);
add(i, y);
add(y, i);
}
build(1, n, 1);
dfs(1, -1);
for(int i = 1; i <= n; i++)
{
int v;
scanf("%d", &v);
//cout << "~" << v<<endl;
if(v) update(pos[i], pos[i], 1);
}
int q;
cin >> q;
char bf[4];
while(q--)
{
int x;
scanf("%s%d", bf, &x);
if(bf[0] == 'p')
update(pos[x], r[x], 1);
else printf("%d\n", query(pos[x], r[x], 1));
}
return 0;
}

F

莫队,离散化,询问区间内的a,b两种书数量之差为k的子区间数量,看到note里的说明和这题意就让人感觉是莫队了,可以先维护下差值的前缀和,然后map存每个前缀和的-k +0 +k这三种值,然后暴力分块转移,但是这里有个问题,普通的1e18数组hash不了,直接用map每次取数暴力转移时logn的复杂度又会超时,而注意到其数目只有1e5*3,那么可以离散化掉3e5个这些数,然后二分预处理出这三种类型的前缀和出现的第一个位置,那么在分块转移的时候,将数量统计在cnt里,利用这个下标进行差分就可以了...

/** @Date    : 2017-10-24 18:07:23
* @FileName: F.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; int n, q;
int f[N];
int blc[N];
LL k;
LL sum[N];
LL cnt[N * 3];
vector<LL>t;
LL p[N][3];
LL res[N]; struct yuu
{
LL id, l, r;
bool operator <(const yuu &b) const
{
if(blc[l] != blc[b.l])
return l < b.l;
return r < b.r;
}
};
yuu b[N]; int main()
{
scanf("%lld%lld", &n, &k);
int sqr = sqrt(1.0 * n);
for(int i = 1; i <= n; i++)
scanf("%d", f + i), blc[i] = i / sqr;
for(int i = 1; i <= n; i++)
{
LL x;
scanf("%lld", &x);
x *= (f[i]==1?1LL:-1LL);
sum[i] = sum[i - 1] + x;
t.PB(sum[i] - k);
t.PB(sum[i]);
t.PB(sum[i] + k);
}
//别忘了0的差值
t.PB(-k);//
t.PB(0);//
t.PB(k);//
//
sort(t.begin(), t.end());
for(int i = 0; i <= n; i++)
{
p[i][0] = lower_bound(t.begin(), t.end(), sum[i] - k) - t.begin();
p[i][1] = lower_bound(t.begin(), t.end(), sum[i]) - t.begin();
p[i][2] = lower_bound(t.begin(), t.end(), sum[i] + k) - t.begin();
}
/*for(int j = 0; j <= n; j++)
printf("%2d ", sum[j]);
cout <<endl;
for(int i = 0; i < 3; i++, cout<<endl)
for(int j = 0; j <= n; j++)
printf("%2d ", p[j][i]);*/
scanf("%d", &q);
for(int i = 1; i <= q; i++)
{
scanf("%lld%lld", &b[i].l, &b[i].r);
b[i].id = i;
}
sort(b + 1, b + q + 1);
LL L = 1, R = 0;
LL ans = 0;
cnt[p[0][1]] = 1;
for(int i = 1; i <= q; i++)
{
while(L > b[i].l)//
--L, ans += cnt[p[L - 1][2]], ++cnt[p[L - 1][1]];
while(L < b[i].l)
--cnt[p[L - 1][1]], ans -= cnt[p[L - 1][2]], ++L;
while(R > b[i].r)
--cnt[p[R][1]], ans -= cnt[p[R][0]], --R;
while(R < b[i].r)
++R, ans += cnt[p[R][0]], ++cnt[p[R][1]];
res[b[i].id] = ans;
}
for(int i = 1; i <= q; i++)
printf("%lld\n", res[i]);
return 0;
}

CF #442 div2的更多相关文章

  1. cf 442 div2 F. Ann and Books(莫队算法)

    cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...

  2. cf 442 D. Olya and Energy Drinks

    cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...

  3. Codeforces #442 Div2 F

    #442 Div2 F 题意 给出一些包含两种类型(a, b)问题的问题册,每本问题册有一些题目,每次查询某一区间,问有多少子区间中 a 问题的数量等于 b 问题的数量加 \(k\) . 分析 令包含 ...

  4. Codeforces #442 Div2 E

    #442 Div2 E 题意 给你一棵树,每个结点有开关(0表示关闭,1表示开启),两种操作: 反转一棵子树所有开关 询问一棵子树有多少开关是开着的 分析 先 DFS 把树上的结点映射到区间上,然后就 ...

  5. CF#603 Div2

    差不多半年没打cf,还是一样的菜:不过也没什么,当时是激情,现在已是兴趣了,开心就好. A Sweet Problem 思维,公式推一下过了 B PIN Codes 队友字符串取余过了,结果今天早上一 ...

  6. CF R631 div2 1330 E Drazil Likes Heap

    LINK:Drazil Likes Heap 那天打CF的时候 开场A读不懂题 B码了30min才过(当时我怀疑B我写的过于繁琐了. C比B简单多了 随便yy了一个构造发现是对的.D也超级简单 dp了 ...

  7. CF#581 (div2)题解

    CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include< ...

  8. [CF#286 Div2 D]Mr. Kitayuta's Technology(结论题)

    题目:http://codeforces.com/contest/505/problem/D 题目大意:就是给你一个n个点的图,然后你要在图中加入尽量少的有向边,满足所有要求(x,y),即从x可以走到 ...

  9. CF 197 DIV2 Xenia and Bit Operations 线段树

    线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...

随机推荐

  1. Jq_javascript跨域问题

    为什么浏览器不能跨域   现在很多人特别是前端开发人员,在ajax请求,XMLHttpRequest的过程中会碰到一个问题,那就是跨域请求: 当我们javaScript脚本试图跨域访问时,浏览器会告诉 ...

  2. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  3. springboot 前后端分离开发 从零到整(一、环境的搭建)

    第一次写文章,有什么错误地方请大家指正,也请大家见谅. 这次为大家分享我做毕业设计的一个过程,之前没有接触过springboot,一直做的都是Javaweb和前端,做了几个前后端分离的项目.现在听说s ...

  4. [算法总结] 6 道题搞定 BAT 面试——堆栈和队列

    本文首发于我的个人博客:尾尾部落 0. 基础概念 栈:后进先出(LIFO) 队列:先进先出(FIFO) 1. 栈的 java 实现 import java.util.Arrays; public cl ...

  5. PHP学习 安装环境和语法学习

    要回归技术了,昨天下午专门去深圳大学城图书馆借书,甚是漂亮 禁不住搞了几张照片 在图书馆里面的书真多,图书馆环境真好,清华大学 北京大学研究生院的学生们有福了,最后一句深圳政府真尼玛有钱,下图是图书馆 ...

  6. maven util 类 添加 service

    直接关键代码: public class DictionaryUtil { // 以下的处理,是为了在工具类中自动注入service // 前提是在applicationContext.xml中,将该 ...

  7. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  8. 实训一(cocos2d-x相关)

    实训内容简介: 大四开始前系里安排的的集中实践环节,根据要求,开发app应用软件. 目标app:Stick_mxj 目的:继续对cocos2d-x的学习,完成实践环节,解决现在对引擎不是很清楚的一些问 ...

  9. Where To Buy -- proposed by Renqian Luo

    Need 周末在公司加班,公司食堂不开饭,就会想到点外卖.手机里好多外卖APP,同样的店家在不同平台的优惠活动可能不一样,A这边满20减10,B那边满20只减5,但是那边好像有优惠券可以用唉,等等,C ...

  10. Drools解决积分问题

    http://blog.csdn.net/quzishen/article/details/6163012 http://www.cnblogs.com/ityouknow/p/7297524.htm ...