【CF 1191】Tokitsukaze, CSL and Stone Game//Tokitsukaze and Duel//Tokitsukaze and Strange Rectangle

很难想 but很好实现
博弈论专练
传送门
惯例这里只完成D,E,F
话不多说上代码

文章目录

  • D:Tokitsukaze, CSL and Stone Game
    • 题目大意
    • 题解
    • 代码实现
  • E:Tokitsukaze and Duel
    • 题目大意
    • 题解
    • 代码实现
  • E:Tokitsukaze and Strange Rectangle
    • 题目大意
    • 题解
    • 代码实现

D:Tokitsukaze, CSL and Stone Game

题目大意

输入n,n堆石子,接下来输入n个数表示i堆石子a[i]个
然后sjf先手,每人任选一堆石子,拿走一个,如果拿走后出现有至少两堆石子个数相同就输了
csl赢输出cslnb,否则输出sjfnb,每个人都选择最优选法,因为他们很聪明
在这里插入图片描述
n (1≤n≤10^5) a1,a2,…,an (0≤a1,a2,…,an≤10^9)

题解

每人只能取一颗,那么去到最后决胜就是n堆石子个数分别是0,1,2…n-1这样下一个人怎么选都是必输
好了这题结束,下一题 如果这么快就AC是不是太水了?那就在特判那里挖坑吧!
本仙女是被这道题的特判给弄哭了(哼唧唧╭(╯^╰)╮)

先手必输的特判:
1)如果刚开始石子就有>=2对相同的石子,那么你选了破坏了一对,另外也有一对。
2)如果有一对相同的石子,但是石子数-1也有一堆,也会输eg:5 5 4你选了5就出现了5 4 4还是有相同石子数
3)如果有一对是0,那么也是输,因为你取不了0

代码实现

#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 100005
int tot, n;
long long sum;
int a[MAXN];
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d", &a[i] );sum += a[i];}sort ( a + 1, a + n + 1 );int len = 1;if ( n == 1 && a[1] == 0 ) return ! printf ( "cslnb" );a[n + 1] = a[0] = -1;for ( int i = 2;i <= n + 1;i ++ ) {if ( a[i] == a[i - 1] ) {len ++;if ( len > 2 ) return ! printf ( "cslnb" );}else {if ( len == 2 ) tot ++;if ( tot > 1 ) return ! printf ( "cslnb" );if ( len == 2 && a[i - 1] == 0 ) return ! printf ( "cslnb" ); if ( len == 2 && a[i - 3] == a[i - 1] - 1 ) return ! printf ( "cslnb" );len = 1;}}long long tmp = n * ( n - 1 ) / 2;if ( ( sum - tmp ) % 2 ) printf ( "sjfnb" );else printf ( "cslnb" );return 0;
}

E:Tokitsukaze and Duel

题目大意

输入n,k (1≤k≤n≤10^5),表示01字符串的长度为n,先手和后手必须选择连续的长度为k的区间把这些区间里面的01全部变为0或者1,如果这个区间本身全部都是1那么也可以进行全部变1的操作,就类似于不变嘛~!
最后谁先把这个字符串全部变为0或者1就胜利
如果先手赢输出tokitsukaze,后手赢输出quailty,都不满足输出over again
同样这两个人都聪明绝顶!会选择最优方法

题解

既然他们都很聪明,那么这道题就是问先手或者后手能否一招致胜

因为如果先手不能一招制胜,机会就给了后手,所以他就会一直破坏后手的方法,
比如后手把i区间变为1,先手就可以变为0,这样就能over again,
如果机会给了后手,后手也不能一招制胜,
机会就回到了先手,似乎先手就要赢了,no~~。

你当后手的头白秃了后手发现自己赢不了那么就恶心先手,
奶妈蔡文姬毒奶一口,不让先手赢,结果还是over again
所以如果你没有思路,输出over again应该能的一大部分分,
不过老师一般都会绑点ex

那么问题就变为了先手和后手分别一招制胜的情况,都没有就是over again

先手一招制胜的情况就是:
for循环暴力找一次看有没有一个连续k区间全部变为1或者0后能获胜

后手一招制胜的情况就是不管先手怎么搞,他都能找到一个连续k区间获胜。

那么就意味着n/2<=k后手赢必须满足这个条件,
因为如果n/2>k那么先手选择1–k后手根本不可能一次就把k+1到n全部一次操作,
那么你又会说如果后面有一部分已经连续了,后手可以赢呢!
那么这个假设就被推翻了,
仙女已经讲过了先手一招杀不死,就会恶心死后手,那么他就不会选1–k区间。

而且,满足了上面的条件后,还要for循环判断,
是不是不管先手怎么改变区间,他都能一招制胜。

代码实现

真的这两个for循环,你看我的说的很轻松简单的亚子,实际上可ex了!
要判断如果变为1和如果变为0两种情况

#include <cstdio>
#include <cstring>
#define MAXN 100005
int n, k;
char s[MAXN];
int pre[MAXN];
int main() {scanf ( "%d %d", &n, &k );scanf ( "%s", s );int len = strlen ( s );for ( int i = 0;i < len;i ++ )pre[i + 1] = s[i] - '0' + pre[i];for ( int i = 1;i <= n - k;i ++ ) {int tmp = pre[n] - pre[i + k - 1];if ( i == 1 && ( tmp == 0 || tmp == n - i - k + 1 ) ) return ! printf ( "tokitsukaze" );if ( tmp == 0 && pre[i - 1] == 0 ) return ! printf ( "tokitsukaze" );if ( tmp == n - i - k + 1 && pre[i - 1] == i - 1 ) return ! printf ( "tokitsukaze" ); }if ( n / 2 > k ) return ! printf ( "once again" );for ( int i = 2;i <= n - k;i ++ ) {if ( pre[i - 1] == 0 && pre[n] - pre[i + k - 1] == n - i - k + 1 ) continue;if ( pre[i - 1] == i - 1 && pre[n] - pre[i + k - 1] == 0 ) continue;return ! printf ( "once again" );}printf ( "quailty" );return 0;
}

E:Tokitsukaze and Strange Rectangle

题目大意

n个点n (1≤n≤2×10^5),接下来n行每行表示i点的横纵坐标xi , yi (1≤xi,yi≤10^9)
在这里插入图片描述
矩阵左边界l,右边界r,最下边a,无限长,问有多少个矩阵包含点的种类不一样
即yi>a,xi>l,xi<r 严格大于!的点的种类不一样,每一个i都是不一样的种类,所以如果两个矩阵分别包含1,2和2,3是属于不同的两个矩阵

题解

首先看n的范围,xi,yi的范围,数组开不了1e9就必须要离散化,
这是一个难点,做好笔记考试要考

离散化后你想,矩阵是无限高的也就意味着如果包含了i点,
也就包含了x满足这个矩阵的y>yi的所有点,那么我们就可以dfs从上往下找

接着我们思考当操作到纵坐标y的时候,
这一条直线上有多少个x点,会对答案有多少贡献:
考虑只有1个点的时候,那么就是左边有多少空与右边有多少空的乘积,

而有多个点的时候,i点左边有多少空与i点右边有多少空的乘积,
这时会重复算i点前面点已经算过的方案,所以要减掉,
其实也就是i点与i-1点之间有多少空与i后面空的乘积,
偷偷告诉你:其实单点也满足这个规律

看完后你可能会有点懵,解释一下空指的是从上往下递归后,我们会在y上所有点的x画下来,如图!在这里插入图片描述
接下来的难点就是我怎么标记这个x竖线,在这里插入图片描述
我们可爱的树状数组和线段树这对好基友手牵着手登上了非诚勿扰,恭喜两位嘉宾牵手成功 可以实现话不多说,屁不多放,上马!

代码实现

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 200005
#define LL long long
struct node {LL tx, ty;LL x, y;
}a[MAXN];
vector < LL > G[MAXN];
LL n, cnt, result;
LL tree[MAXN << 2];
bool cmpx ( node u, node v ) {return u.tx < v.tx;
}
bool cmpy ( node u, node v ) {return u.ty < v.ty;
}
void update ( LL l, LL r, LL L, LL R, LL num ) {if ( l == r ) {tree[num] = 1;return;}LL mid = ( l + r ) >> 1;if ( L <= mid ) update ( l, mid, L, R, num << 1 );if ( mid < R ) update ( mid + 1, r, L, R, num << 1 | 1 );tree[num] = tree[num << 1] + tree[num << 1 | 1];
}
LL research ( LL l, LL r, LL L, LL R, LL num ) {if ( l == r ) return tree[num];if ( L <= l && r <= R ) return tree[num];LL mid = ( l + r ) >> 1;LL sum1 = 0, sum2 = 0;if ( L <= mid ) sum1 = research ( l, mid, L, R, num << 1 );if ( mid < R ) sum2 = research ( mid + 1, r, L, R, num << 1 | 1 );return sum1 + sum2;
}
void dfs ( LL u ) {if ( u == 0 ) return;LL last = 0;for ( LL i = 0;i < G[u].size();i ++ ) {LL v = G[u][i];update ( 1, n, v, v, 1 );}for ( LL i = 0;i < G[u].size();i ++ ) {LL v = G[u][i];LL t1 = research ( 1, n, 1, v, 1 );LL t2 = research ( 1, n, v, n, 1 );result += ( t1 - last ) * t2;last = t1;}dfs ( u - 1 );
}
int main() {scanf ( "%lld", &n );for ( LL i = 1;i <= n;i ++ )scanf ( "%lld %lld", &a[i].tx, &a[i].ty );cnt = 0;sort ( a + 1, a + n + 1, cmpx );for ( LL i = 1;i <= n;i ++ ) {if ( a[i].tx != a[i - 1].tx )++ cnt;a[i].x = cnt;}cnt = 0;sort ( a + 1, a + n + 1, cmpy );for ( LL i = 1;i <= n;i ++ ) {if ( a[i].ty != a[i - 1].ty )++ cnt;a[i].y = cnt;G[a[i].y].push_back( a[i].x );}for ( int i = 1;i <= cnt;i ++ )sort ( G[i].begin(), G[i].end() );dfs ( a[n].y );printf ( "%lld", result );return 0;
}

平A三刀,三杀,恭喜你成为全场MVP!!!
在这里插入图片描述
好了,有任何不懂的,欢迎留言,我看见了会及时给你答复在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主席树 - 可持久化线段树

模板 P3834 【模板】可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc.h> using namespace std; #define Maxn 200005 typedef long long ll; inline int rd() {int x0;char ch,t0;while(!isdigit(ch getchar())) t|ch-;while(isdigit(ch)) xx*…

【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权&#xff0c;并配合网关实现了统一的授权异常返回值和权限配置等相关功能&#xff0c;本篇将介绍密码授权模式&#xff0c;从使用场景、源码剖析到具体实现详细讲解密码授权模式的相关应用。.netcore项目实…

CF11D-A Simple Task【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF11D 题目大意 给出nnn个点mmm条边的一张简单无向图&#xff0c;求它的简单环的个数。 1≤n≤191\leq n\leq 191≤n≤19 解题思路 首先算重的问题很麻烦但也是解决这题的关键。 因为防止算重那么我们就只考虑在每个环编号…

YBTOJ:灯光控制(贪心)(公倍数)(暴力枚举)

文章目录题目描述解析代码题目描述 解析 没有想出来 首先可以确定开关要么开一次&#xff0c;要么不动&#xff0c;其他都和这俩是等价的 一开始最先想到的就是贪心的方法&#xff0c;每个开关遍历&#xff0c;如果按下会使答案变好就按下。 但是显然当前的开闭对后面是有后效…

Tree Constructer

题目&#xff1a; 题意&#xff1a; 如果点x和y有连边&#xff0c;当且仅当a[x] or a[y] 260 - 1 &#xff08;两者是充分必要&#xff09; 现在给你边的关系&#xff0c;问你每个点的值应该是多少&#xff1f;&#xff08;给出一种情况即可&#xff09; 题解&#xff1a; …

[USACO19JAN,Platinum]Train Tracking 2

虽然是简单的dp &#xff0c;but真的太难想到了&#xff0c;而且我的码力。。。 Train Tracking 2 【题目描述】 每天特快列车都会经过农场。列车有N节车厢&#xff08;1≤N≤105&#xff09;&#xff0c;每节车厢上有一个1到109之间的正整数编号&#xff1b;不同的车厢可能会…

轻重链剖分

重链剖分 P3384 【模板】轻重链剖分/树链剖分 $ / $ 模板代码&#xff1a; 注意&#xff1a; 如果有 \(0\) 号节点&#xff0c;并默认重儿子是零号节点&#xff0c;复杂度会退化为 \(O(n^2)\) 。原因&#xff1a; 代码第一次遍历默认重儿子是0&#xff0c;所以无法保证每次找到…

CF19E-Fairy【树形结构,差分】

正题 题目链接:https://www.luogu.com.cn/problem/CF19E 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;求有多少条边去掉后可以使得图变成一张二分图。 1≤n,m≤1041\leq n,m\leq 10^41≤n,m≤104 解题思路 虽然线段树分治可以暴力草过去但是考虑点智慧的做法。 众…

.netcore 堆栈调用方法小记

1|0背景上午临近午饭时&#xff0c;公司同事反馈验证码被攻击灌水。我们匆忙查询验证码明细&#xff0c;对已频繁出现的IP插入黑名单&#xff0c;但IP仍然隔断时间频繁变动&#xff0c;不得已之下只能先封禁对应公司id的验证码发送功能。年初时候&#xff0c;专门对SSO站点的发…

洛谷P2480:古代猪文(中国剩余定理)(欧拉定理)

传送门 文章目录题目描述解析总结代码题目描述 解析 简单来说&#xff0c;就是求&#xff1a; g∑C(d,n)(d是n的约数&#xff09;mod 999911659 可以先特判一下&#xff0c;999911659|g时&#xff0c;答案为0 否则&#xff0c;可以通过欧拉定理转化为&#xff1a; g∑C(d,n)(d…

Stone Game

题意&#xff1a; 有n堆石头&#xff0c;每堆石头最多只有三个石头&#xff08;最少1个&#xff09;&#xff0c;每两堆石头&#xff08;这两堆各含石头x个和y个&#xff09;合一起的费用为(x mod 3) * (y mod 3)&#xff0c;现在把所有堆合成一堆&#xff0c;问最小费用 题目…

杯子 + Kronican

杯子 Kronican 【题目描述】 重庆八中在80周年校庆的时候获捐n个杯子&#xff0c; 每个杯子有两个属性&#xff1a;一个是已装水量 ai&#xff0c;一个是可装水量 bi&#xff08;ai < bi&#xff09;。 从一个杯子向另一个杯子倒 x 单位体积的水需要花费的时间是 x 秒。 现…

【做题记录】 [HEOI2013]SAO

P4099 [HEOI2013]SAO 类型&#xff1a;树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程&#xff0c;基础转移方程推导可以参考其他巨佬的博客(题解)。 令 \(f[x][p]\) 表示在以 \(x\) 为根的子树中&#xff0c;\(x\) 在拓扑序排在第 \(p\) 个时的…

CF25E-Test【AC自动机,bfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF25E 题目大意 给出三个串&#xff0c;然后求一个最短的串包含这三个串。 1≤∣s1∣,∣s2∣,∣s3∣≤1051\leq |s_1|,|s_2|,|s_3|\leq 10^51≤∣s1​∣,∣s2​∣,∣s3​∣≤105 解题思路 把三个串状压&#xff0c;先跑出AC…

微软开源的Trill是什么?

以下是一篇15年的文章的译文&#xff1a;https://dwainegilmer.wordpress.com/2015/01/28/microsoft-trill-for-streaming-analytics-from-microsoft-research/当今许多大数据应用程序套件的重点是数据存储。它们是围绕狭窄范围的数据集设想和设计的&#xff0c;通常是为了组织…

剪纸游戏(博弈论)(SG函数)

文章目录题目描述解析题目描述 解析 本题的关键就是SG函数的定义 尝试了一些自己直观上可能对但题解没有使用的约定方法&#xff08;当然最后证明都是错的 。。。&#xff09;&#xff0c;对SG的理解更深刻了一些 SG0的含义是无法再移动换句话说也就是再移动也对败局于事无补&…

Fight against involution

题目&#xff1a; 对抗内卷&#xff08;大佬经常说别再卷了&#xff09; 有一门课程n个学生选&#xff0c;期末要写一篇论文每个同学写的字数有一个下限和一个上限&#xff0c;课程的成绩是按学生字数的排名来给分的&#xff0c;排名越高分数越高&#xff0c;每个同学都想得到…

【做题记录】 [JLOI2011]不等式组

P5482 [JLOI2011]不等式组 超烦人的细节题&#xff01;(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线)。 树状数组的下标是&#xff1a;所有可能出现的数据进行离散化之后的值。 其含义为&#xff1a;当 \(x\) 离散化后值为 \(i\) 时能满足的不等式个数为 \(…

[COCI2017-2018#5] Karte

[COCI2017-2018#5] Karte&#xff0c;简短的代码想到了就AC 这道题是SPJ放心搞 但是我的脑子里面的东西&#xff0c;不用我多说&#xff0c;你们就知道是水和面粉和成的 看招 题 【题目描述】 你有一副共有N张牌的牌&#xff0c;在第i张牌上会有一个数字ai表示在这张牌下面至…

YBTOJ:红与蓝(博弈论)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;这道题的情境对二人来说是不对称的&#xff0c;所以不太好使用SG函数来求解 但直观上也好考虑 利用树的递归性质可以求出每个节点的颜色是否确定 并确定根的颜色是否确定 如果确定是红就随便涂 确定是蓝就-1 关键在于不…