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. setBit testBit权限管理

    1.jdk7文档解释 public boolean testBit(int n) Returns true if and only if the designated bit is set. (Com ...

  2. Notes of Daily Scrum Meeting(12.16)

    最近好几门课的大作业都到了要截止的时候了,好多天队员们都抽不出来时间做软工的项目了,这样确实 和我们的计划出入很大,不过希望老师谅解,三门课程设计确实压力很大. 今天的团队任务总结如下: 团队成员 今 ...

  3. 炸弹人的Alpha版使用说明

    本游戏是一款手机游戏,学生可以在无聊时打发时间,放松心情.现在只有三关,但游戏运行还算可以. 注意事项: 目前游戏还有一些不好的地方,游戏无法暂停,如果游戏任务死亡,则无法重开. 游戏后面的关卡还需要 ...

  4. kali 安装使用 sslocal

    shadowsocks 1.安装 shadowsocks apt-get install python-pip sudo pip install shadowsocks 2.配置 shadowsock ...

  5. maybe i have no answer

    怎么说呢,我从小学开始到高中,大学.我觉得老师对大家都是一样的,虽然我因为父母的原因可能和老师接触比较多,但是学业上其实没什么帮助的. 我更希望老师能给我人生道路上的指点,虽然自己的道路确实是自己走出 ...

  6. Studying GIT

    Studying git Shopping list: GIT的功能 接触一个新的软件或者网站,最重要的就是认识它的功能:Git 是用于 Linux内核开发的版本控制工具.与常用的版本控制工具 CVS ...

  7. Visual Studio(VS)C++单元测试

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Visual Studio(VS)C++单元测试     本文地址:http://techie ...

  8. MacBook Pro 电池寿命

    MacBook Pro 电池寿命 https://www.apple.com/cn/macbook-pro/specs/ https://www.zhihu.com/question/19709979 ...

  9. 别在int与float上栽跟头

    int与float是我们每天编程都用的两种类型,但是我们真的足够了解它们吗.昨天在博客园看到一个比较老的笑话: “昨天晚上下班回家,一民警迎面巡逻而来.突然对我大喊:站住!民警:int 类型占几个字节 ...

  10. 自学Aruba1.1-WLAN一些基本常识

    点击返回:自学Aruba之路 自学Aruba1.1-WLAN一些基本常识 1. LAN.WAN.WLAN.WIFI术语 1.1 局域网(Local Area Network,LAN) 是指在某一区域内 ...