CF-925(已更新:D-F)
CF 925
补题ing 待更新
后面打算更新D题和power oj上一道区间合并的题(现在才知道是一道洛谷上的原题……)
D
分析
涉及到关于取模的知识,我们的答案要满足三个条件:
- ai-aj≡0(MOD y);
- ai+aj≡0(MOD x);
- 1<=i<j<=n;
1.容易想到ai%y=aj%y,2.等价于(ai%x+aj%x)%x=0。由这两个式子和第三个条件我们应该思考,如何将i,j分别移到等式两边,这样才方便我们处理。由模数的性质可知,ai%x+aj%x的结果要么为0要么为x,所以我们直观的想到:ai%x的结果要么为-aj%x要么为x-aj%x,又ai,aj,x都为正数,第一种结果意味着ai%x=aj%x=0,我们将其与第二种结果合并,ai%x=0=x-aj%x=x,等式不成立,而在右边模上x,即变为3.ai%x=(x-aj%x)%x则会使等式成立;但是,所谓等式,意味着我们要证明3式不会与第二种结果相悖。把ai%x=x-aj%x左右两边都模上x,因为ai%x%x=ai%x,x-aj%x也为小于x的数,故化为ai%x=(x-aj%x)%x,即3式能同时满足两个结果。
操作
对于每个ai,我们设aa=ai%x,bb=ai%y,因为i<j,遍历时先把答案的个数cnt加上集合{bb,(x-aa)%x}的个数,再用存下集合{bb,aa},这里我用的是map实现。
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,n,x,y;cin>>t;
while(t--){
cin>>n>>x>>y;
int a,cnt=0;
map<pair<int,int>,int>mp;
for(int i=1;i<=n;i++){
cin>>a;
int aa=a%x,bb=a%y;
cnt+=mp[{bb,(x-aa)%x}];
mp[{bb,aa}]++;
}
cout<<cnt<<endl;
}
return 0;
}
E
分析
手写的模拟过程
博弈论加贪心,实际上后手得到的答案只看其位数是否大于m,先手的倒置是把后缀0的个数从位数减去,而后手可以通过合并使后缀0不存在,所以对先手而言,只消每轮删去后缀0个数最多的,而后手同样选一个后缀0最多的跟一个没有后缀0的合并(因为先手操作过,这种数一定存在),使其没有后缀0,这样它被倒置也不会减少位数,也就是这样可以使后手得到的位数员供献最少,这也是后手的最佳方案
比如5550 20 300
先手的操作一定是300先,这样对他收益大,5550和20的只能操作一个,但对后手没有影响,因为它们后缀0个数一样。
操作
所以可以把数遍历一下,统计位数还有后缀0个数,按后缀0个数从大到小排,奇数位上的都被先手操作过,所以最后后手得到的数的位数就是初始位数-奇数位后缀0个数,再用这个跟m比较,严格大于才是后手胜,否则是先手胜。
如 1 2007 800 1580
排序后为 800 1580 2007 1 (后两个可颠倒顺序)
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
const int N=2e5+5;
int a[N],b[N];//b数组统计后缀0个数
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,n,m,x,y;cin>>t;
while(t--){
cin>>n>>m;
int cnt=0;//统计位数
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=0;
}
for(int i=1;i<=n;i++){
//注意两个while的顺序
while(a[i]%10==0){
a[i]/=10;
b[i]++;
cnt++;
}
while(a[i]){
a[i]/=10;
cnt++;
}
}
sort(b+1,b+n+1,[](int a,int b){
return a>b;
});
for(int i=1;i<=n;i+=2){
cnt-=b[i];//先手总操作奇数位
}
if(cnt>m) cout<<"Sasha";
else cout<<"Anna";
cout<<endl;
}
return 0;
}
[F](Problem - F - Codeforces)
分析
每个参与者都把自己排在最前面,因此我们找相对顺序时可以不管第一个。
1 2 3 4 2<-3<-4
2 3 1 4 3<-1<-4
3 2 1 4 2<-1<-4
4 2 3 1 2<-3<-1由此可构造拓扑序
操作
对k个顺序的第2到n个依次建边,求拓扑序是否存在,即是否满足cnt=n
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int a[N],rd[N],n,cnt;
vector<int>e[N];
bool tuopu(){
//这里可以就用普通队列
priority_queue<int,vector<int>,greater<int>>q;
cnt=0;
for(int i=1;i<=n;i++){
if(rd[i]==0) q.push(i);
}
while(!q.empty()){
int x=q.top();
q.pop();
for(auto t:e[x]){
rd[t]--;
if(rd[t]==0) q.push(t);
}
cnt++;
}
return cnt==n;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,x,k,ans=0;cin>>t;
while(t--){
cin>>n>>k;
//注意用memset初始化会t
for(int i=1;i<=n;i++){
e[i].clear();
rd[i]=0;
}
while(k--){
for(int i=1;i<=n;i++){
cin>>a[i];
if(i>=3){
e[a[i]].push_back(a[i-1]);
rd[a[i-1]]++;
}
}
}
if(tuopu()){
cout<<"YES";
}
else cout<<"NO";
cout<<endl;
}
return 0;
}
CF-925(已更新:D-F)的更多相关文章
- intellij idea 13&14 插件推荐及快速上手建议 (已更新!)
原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转 ...
- SRM12 T2夏令营(分治优化DP+主席树 (已更新NKlogN)/ 线段树优化DP)
先写出朴素的DP方程f[i][j]=f[k][j-1]+h[k+1][i] {k<i}(h表示[k+1,j]有几个不同的数) 显然时间空间复杂度都无法承受 仔细想想可以发现对于一个点 i ...
- 微信快速开发框架(九)-- V3.0发布,代码已更新至Github 新增微店功能
版本内容 1.修正了缺少对Event.View的支持 2.增加了用户UnionID 3.新增微信小店功能 4.多客服功能 5.单元测试 什么是UnionID 我们知道,每个用户针对一个微信公众账号都有 ...
- 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...
- 微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github
在V2版本发布的博文中,已经介绍了大多数Api的用法,同时也收到了很多意见,其中发布了几个修正版本,修改了几个bug,在此感谢大家的使用,有了大家的支持,相信快速开发框架会越来越好,也会越来越完善的. ...
- 目录 of 2013-2014-1(内容已更新结束)
(内容已更新结束) UML部分: ---------------1.概述2.用例图3.类图4.顺序图 MVC部分: ----------------1.概述2.路由3.控制器4.视图5.模型6.安装部 ...
- Asky极简教程:零基础1小时学编程,已更新前8节
Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...
- 【sql server】"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案
#事故现场: 1.在手动修改某表中数据是,出现如下错误提示: 已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行, ...
- 【干货】电路设计师指导手册(已更新完毕)(转载EDN)
[干货]电路设计师指导手册(已更新完毕) 第一部分:接地与布线第二部分:电源返回路径与I/O信号接地第三部分:板间互连.星形接地及屏蔽第四部分:安全地以及电线/电缆第五部分:射频电缆.双绞线与串扰
- 激活windows10(已更新工具)
激活windows10 1.用cmd命令: 自己动手,KMS激活win10 2016 长期服务版.步骤如下:命令提示符(管理员),依次输入以下3条命令 slmgr /ipk DCPHK-NFMTC-H ...
随机推荐
- DDD领域驱动设计 (C# 整理自“老张的哲学”)
大话DDD领域驱动设计 概念 Domain Driven Design 领域驱动设计 第一个D(Domain): 领域:指围绕业务为核心而划分的实体模块. 第二个D(Driven): 驱动:这里的驱动 ...
- 机器学习-决策树系列-XGBoost算法-chentianqi大神-集成学习-31
目录
- 时空图预测的方法论,以及 diffusion model 基本概念
前天和善良的同学聊天,请教了 ① 时空图预测的方法论,② diffusion model 基本概念,记录下来. ① 时空图预测的方法论: 首先,构造 0 ~ t-1 时刻的 t 个图,每个图都有 n ...
- zookeeper 节点介绍及节点常用命令总结
本文为博主原创,未经允许不得转载: 目录: 1. znode 节点特性 2. zookeeper 的四种节点类型及适用场景分析 3. zookeeper 客户端常用操作命令 4. znode 数据增删 ...
- Linux-运行级别-init
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.20)
百度网盘会员账号共享(11.20更新) 账号:zqv29268 密码:7003wayb 账号:rpz75364 密码:riyk1648 账号:0580quqn 密码:148hxhe 账号:132620 ...
- [转帖]KingbaseES wal(xlog) 日志清理故障恢复案例
https://www.cnblogs.com/kingbase/p/16266365.html 案例说明:在通过sys_archivecleanup工具手工清理wal日志时,在control文件中查 ...
- Oracle数据库权限学习--表或者是视图不存在
Oracle数据库权限学习--表或者是视图不存在 摘要 本文写于: 12.10 01:00 巴西踢的太烂了 帮同事看一下补丁执行报错的问题. 问题原因很简单. user_all_table能够后去本用 ...
- jmaps
#!/bin/bash # # jmaps - creates java /tmp/perf-PID.map symbol maps for all java processes. # # This ...
- 依据HTML标准再探Javascript事件循环及其与浏览器渲染的关系
Javascript的一些基础概念 JavaScript执行引擎在宿主环境中是单线程的,这意味着在同一时间内只能执行一个任务.在Javascript运行期间,引擎会创建和维护相应的堆(heap)和栈( ...