当前位置: 首页 > 编程日记 > 正文

AGC002[BCDEF]题解

F是计数于是就做(kan ti jie)了= =

B - Box and Ball

模拟一下 每个盒子开一个d表示有的球数 可能存在红球的打个标记 传递一下就行了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std;bool vis[mxn];
int d[mxn];int main()
{int x,y,n,m,ans=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)	d[i]++;vis[1]=1;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);d[x] --;d[y] ++;if(vis[x])	vis[y]=1;if(!d[x])	vis[x]=0;}for(int i=1;i<=n;i++)	if(vis[i])	ans++;printf("%d\n",ans);return 0;
}

C - Knot Puzzle

很明显只要有一段(或者两段)能>=l就可以 然后细节注意一下就行了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std;int a[mxn],n,l;int main()
{int pos=0;scanf("%d%d",&n,&l);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]+a[i-1]>=l) 	pos=i;}if(!pos)	printf("Impossible\n");else{printf("Possible\n");for(int i=n-1;i>=pos;i--)	printf("%d\n",i);for(int i=1;i<pos;i++)	printf("%d\n",i);}return 0;
}

D - Stamp Rally

看题以后就有思路了 大概就是从小到大加边然后看一下联通块大小是不是>=k 然而多组询问不能直接做

就需要整体二分= = 去学了一发整体二分和可持久化并查集(然后发现用不到)就写完了 还是比较舒适的

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std;struct node{int sz,fa;}t[mxn];// 记得初始化!&&按sz合并 
struct cz{int fx,x;}c[mxn];// 存x连到fx 
struct query{int x,y,sz;}q[mxn];
struct edge{int x,y;}e[mxn];
int n,m,ans[mxn],id[mxn];int find(int x)
{while(t[x].fa!=x)	x=t[x].fa;return x;
}void merge(int id,int x,int y) // merge y to x
{x = find(x); y = find(y);if(x==y)	return;if(t[x].sz < t[y].sz)	swap(x,y);c[id].fx = x; c[id].x = y;t[y].fa = x; t[x].sz += t[y].sz;
}void cancel(int id)
{int x = c[id].fx;int y = c[id].x;if(!x || !y)	return;t[x].sz -= t[y].sz; t[y].fa = y;
}int now,c1[mxn],c2[mxn];
void work(int l,int r,int L,int R)// [l,r] query [L,R] val
{//printf("%d %d %d %d\n**",l,r,L,R);//for(int i=l;i<=r;i++)	printf("%d ",id[i]);//printf("\n");if(r<l)	return;if(L==R){for(int i=l;i<=r;i++)ans[id[i]] = L;return;}int MID = L+R>>1;while(now<MID)	now++,merge(now,e[now].x,e[now].y);while(now>MID)	cancel(now),now--;int l1,l2; l1=l2=0;for(int i=l;i<=r;i++){int x=q[id[i]].x,y=q[id[i]].y,k=q[id[i]].sz,fx=find(x),fy=find(y);int ff=0;if(fx==fy&&t[fx].sz>=k)	ff=1;if(fx!=fy&&t[fx].sz+t[fy].sz>=k)	ff=1;if(ff)	c1[++l1] = id[i];else	c2[++l2] = id[i];}int mid = l+l1-1;for(int i=1;i<=l1;i++)	id[l+i-1] = c1[i];for(int i=1;i<=l2;i++)	id[mid+i] = c2[i];work(l,mid,L,MID); work(mid+1,r,MID+1,R);
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)	t[i].sz=1,t[i].fa=i;for(int i=1;i<=m;i++)scanf("%d%d",&e[i].x,&e[i].y);int Q;scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].sz);id[i] = i;}work(1,Q,1,m);for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);return 0;
}

E - Candy Piles

神仙博弈做不来= =

观察操作其实就是 从大到小选一些拿走 然后其余的是每堆拿一个 (然后我就蠢蠢的开始判定性问题了)

看一发题解还是很神仙的

就是把这些糖摆成阶梯型 然后第一个操作拿走一列 第二个操作拿走一行【似曾相识?有一道考试题也是这个哦 那个是需要dp计数】

继续转换将其变成Lattice Path

然后操作变成向右走或者向上走 然后谁到边界谁就输

然后可以观察到一个斜对角线上的胜负状态是相同的

证明是这个样子 设现在第一个操作使用了x次 第二个操作使用了y次

当(x+1,y+1)是合法操作的时候

1.(x+1,y+1)先手必败也就说明无论(x+1,y)和(x,y+1) 后手就都能把这个状态转移给先手 那么这个时候均为必败态

2.(x+1,y+1)先手必胜 也就说明(x+2,y+1)或者(x+1,y+2)中有先手必败态 然后根据1后手无论是从x到(x+1,y)或者(x,y+1)都是必败的 那么这个时候是先手必胜

所以得到这个性质了 我们的0,0出发点位于的对角线就是x=y那么找到最大的合法(x,x)

这个时候它只能往右走到头 或者往上走到头 判断一下这两个只要有一个是先手必胜(奇数步)那么一定就是先手必胜态

代码实现有点烦= = 0,1数清楚= =

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std;int n,a[mxn];
bool cmp(int x,int y)
{return x>y;
}
void work(int id)
{int i,qaq=0;for(i=id+1;a[i]==id&&i<n;i++)	qaq^=1;if((a[id]-id)%2==1||qaq)	printf("First\n");else	printf("Second\n");
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]),a[i]--;sort(a,a+n,cmp); int i;for(i=0;i<n;i++)if(a[i+1]<i+1){work(i);break;}return 0;
}

F - Leftmost Ball

神仙计数 感觉自己计数水平真的好低= =

观察性质可以得到 每一个颜色的k-1个带颜色球一定是位于其中一个0之后的 那么对于所有的0后面一定是>=k-1的多个是还要加上后面的0的个数的

然后我们发现每放一个0色球 后面可以放的颜色就多一种

然后每放一个非0球 其实可以直接算出后面把这个颜色放完的方案数

就可以列出状态f[x][y]表示放了x个0色球 放完了y种非零色球

观察到 颜色重复计算比较麻烦 于是可以把n!提出来 变成[1,n]这n个颜色顺着放就简洁很多

那么0色球的转移就是 f[x][y]+=f[x-1][y]

非0色球的转移就是 f[x][y] += f[x][y-1] * C(tot-(k-1)*(y-1)-1,k-2)

就是说把这个颜色所有的都放完了很明显是不影响状态的 直接把位置删掉就可以了

最后不要忘了n!

这个题主要的思路就是 通过提取n!来解决多颜色转移之间的互相影响 利用0色可以带来非0色的贡献 来进行转移 做题过程中注意可以通过一个条件来进行转移的可以先不直接计算贡献 保留他的状态 在合适的地方选择转移

计数好好练= =

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mdn 1000000007
using namespace std;int f[2100][2100];
int inv[2100*2100],fac[2100*2100];
int n,k;int ksm(int bs,int mi)
{int ans=1;while(mi){if(mi&1)	ans=(ll)ans*bs%mdn;bs=(ll)bs*bs%mdn; mi>>=1;}return ans;
}int C(int x,int y)
{if(x<y)	return 0;return (ll)fac[x] * inv[y] %mdn * inv[x-y] %mdn;
}int main()
{scanf("%d%d",&n,&k);if(k==1||n==1){printf("1\n");return 0;}inv[0]=fac[0]=1; int tot=n*k;for(int i=1;i<=tot;i++)	fac[i]=(ll)fac[i-1]*i%mdn;inv[tot] = ksm(fac[tot],mdn-2);for(int i=tot-1;i;i--)	inv[i]=(ll)inv[i+1]*(i+1)%mdn;f[0][0]=1;// printf("%d\n",inv[tot]);for(int i=1;i<=n;i++){for(int j=0;j<=i;j++){f[i][j] += f[i-1][j];if(j) f[i][j] += (ll)f[i][j-1] * C(tot-i-(k-1)*(j-1)-1,k-2) %mdn;f[i][j]%=mdn;//printf("%d %d %d\n",i,j,f[i][j]);}}printf("%d\n",(ll)f[n][n]*fac[n]%mdn);return 0;
}

转载于:https://www.cnblogs.com/hanyuweining/p/10321891.html

相关文章:

物联网11种通信协议

今天的网络通信技术也是日新月异&#xff0c;有众所周知的WIFI、Bluetooth、Zigbee、2G、3G、4G蜂窝网络&#xff0c;也有新兴的LiFi、AirGig、量子通信等&#xff0c;更有物联网产业爆发前夜&#xff0c;市场衍生出来的一些比较有前景的通信技术&#xff0c;如以窄带物联网NB&…

php 数组的使用

2019独角兽企业重金招聘Python工程师标准>>> 一、字符串和对象&#xff0c;数组之间的相互转换 public function index(){$product array();$product["name"] "apple";$product["price"] 6000;$products array();$products[] $pr…

【ACM】图像旋转

逆时针 //图像旋转 #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main () {int a[105][105];int m,n,i,j;while(scanf("%d%d",&n,&m)!EOF)//n行m列 {for(i0;i<n;i…

do一下来了一个redux

导语 一开看redux的时候还是比较蒙的&#xff0c;感觉比较绕&#xff0c;但是又好像是那么回事&#xff0c;接触一个新概念的时候可能都是如此&#xff0c;多去接触就熟悉了&#xff0c;今天就来分享下redux的三大核心为什么就能如此神奇的施展魔法&#xff0c;干撸完源码&…

JavaMail API 概述

JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序。 JavaMail API提供了一组抽象类定义构成一个邮件系统的对象。它是阅读&#xff0c;撰写和发送电子信息的可选包&#xff08;标准扩展&#xff09;。 JavaMail 规定&#xff0c;用于构造一个接口&am…

利用c语言结构体和union实现类似c++的public,private的实现

最近在看strongswan源代码&#xff0c;看到strongswan的代码框架很有意思&#xff0c;用C语言实现类的思想。当我们编写完一个模块&#xff0c;我们需要提供的是H的文件给其他模块使用&#xff0c;我们希望H文件中就只能包含一些公有函数&#xff0c;和一些类型的申明&#xff…

【ACM】连续出现的字符

【描述】给定一个字符串&#xff0c;在字符串中找到第一个连续出现k次的字符 【输入】第一行包含一个正整数k&#xff0c;表示至少需要连续出现的次数。1<k<1000。第二行包含需要查找的字符串。字符串的长度在1到1000之间&#xff0c;且不包含任何空白字符。 【输出】若…

Django使用数据库(Mariadb/Mysql)

Django默认使用SQLite作为数据库&#xff0c;配置文件在settings.py 让我们来看一下 """ Django settings for test1 project.Generated by django-admin startproject using Django 2.1.4.For more information on this file, see https://docs.djangoproject.…

I2C和SPI总线优缺点对比

IIC vs SPI现今&#xff0c;在低端数字通信应用领域&#xff0c;我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips&#xff08;for IIC&#xff09;和Motorola&#xff08…

查看CentOS的网络带宽出口

检查维护系统的时候&#xff0c;经常会要查看服务器的网络端口是多大的&#xff0c;所以需要用到Linux的一个命令。 如何查看CentOS的网络带宽出口多大&#xff1f;可以用下面的命令来查看。 # ethtool eth0 前面是命令&#xff0c;后面跟的是设备名&#xff0c;如果对外连接的…

【ACM】删数问题(待更)

【描述】键盘输入一个正整数N&#xff0c;去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S寻找一种方案使得剩下的数字组成的新数最小。&#xff08;N不超过240位&#xff0c;N>S&#xff09; 【输入】两行&#xff0c;第一行&#xf…

2019,商业智能的10大未来趋势

2019独角兽企业重金招聘Python工程师标准>>> 当我们深思熟虑接下来会发生什么时&#xff0c;Tableau 收集了来自内外部专家的广泛意见。内部专家们把握着行业的脉搏&#xff0c;并与世界各地成千上万的客户接洽交流&#xff1b;外部专家们则与众多数据团队并肩作战&…

c语言信号机制以及中断

用户态到内核态切换途径&#xff1a; 1&#xff1a;系统调用 2&#xff1a;中断 3&#xff1a;异常 中断类型分为如下两大类&#xff1a; 一、强迫性中断&#xff1a;正在运行的程序所不期望的&#xff0c;来自硬件故障或外部请求。 1、I/O 中断&#xff1a;来自…

【ACM】纸牌搭建

【题目】现有N张扑克牌&#xff0c;最多可以搭建几层 【题目分析】找到通项公式 f[ i ]f[ i-1 ]3*i-1。先打出表&#xff0c;再二分搜索。不断缩小范围。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using na…

DataBase 之 拉链表结构设计

一、概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的&#xff0c;顾名思义&#xff0c;所谓拉链&#xff0c;就是记录历史。记录一个事物从开始&#xff0c;一直到当前状态的所有变化的信息。 在历史表中对客户的一生的记录可能就这样几条记录&#xff0c;避免了按每…

给每个函数写一个记录日志的功能.

# 功能要求: 每一次调用函数之前, 要将函数名称, 时间节点记录到log的日志中.# 所需模块:# import time## def logger(fn):# def inner(*args, **kwargs):# # fn.__name__ # 函数名字# f open("log", mode"a", encoding"utf-8&q…

c如何正常中断一个运行的线程

最近开发一些东西&#xff0c;线程数非常之多&#xff0c;当用户输入CtrlC的情形下&#xff0c;默认的信号处理会把程序退出&#xff0c;这时有可能会有很多线程的资源没有得到很好的释放&#xff0c;造成了内存泄露等等诸如此类的问题&#xff0c;本文就是围绕着这么一个使用场…

Vertica 分区表设计(续)

在上篇Vertica 分区表设计中&#xff0c;已经提过了Vertica的分区表创建和分区删除&#xff0c;但举例上并不系统&#xff0c; 本篇文章将系统的对分区表设计及后续的删除分区进行讲解。 概述&#xff1a;Vertica分区表&#xff08;天和月&#xff09;创建以及删除分区 1.分区表…

【ACM】杭电OJ 1181

http://acm.hdu.edu.cn/showproblem.php?pid1181 DFS搜索&#xff08;递归函数&#xff09; #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std; char s[1000]; int k…

最热开源无服务器函数:五大Fission架构参考

“无服务器”现在是极具诱惑的技术趋势&#xff0c;没有什么比管理服务器更让人痛苦。亚马逊、微软和谷歌都在云中提供无服务器专有接口。相较于这些云供应商的商业化产品&#xff0c;开源无服务器架构可免于被云厂商锁定&#xff0c;但要以牺牲云便利性和易用性为代价。近一年…

高德API+Python解决租房问题

项目简介&#xff1a;编写Python脚本爬取某租房网站的房源信息&#xff0c;利用高德的 js API 在地图上标出房源地点&#xff0c;划出距离工作地点1小时内可到达的范围&#xff0c;附上公交路径规划功能查看不同路径的用时。 本教程由ekCit发布在实验楼&#xff0c;完整教程及在…

SIMD向量化运算

随着机器学习等人工智能技术的飞速发展&#xff0c;矩阵乘法的应用越来越多&#xff0c;intel芯片先后提供了不同系列的向量指令&#xff0c;包括mmx、sse、avx等&#xff0c;支持simd操作。后来为了更好地支持矩阵乘法&#xff0c;又增加了fma&#xff08;Fused Multiply-Add&…

【数据结构】二叉树及其相关操作

二叉树的定义 二叉树是一个由结点构成的有限集合&#xff0c;这个集合或者为空&#xff0c;或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成。 二叉树并非一般的树形结构的特殊形式&#xff0c;它们是两种不同的数据结构。 二叉树与一般树…

函数节流与函数防抖

什么是函数节流与函数防抖 举个栗子&#xff0c;我们知道目前的一种说法是当 1 秒内连续播放 24 张以上的图片时&#xff0c;在人眼的视觉中就会形成一个连贯的动画&#xff0c;所以在电影的播放&#xff08;以前是&#xff0c;现在不知道&#xff09;中基本是以每秒 24 张的速…

makefile 中 =, :=, ?=, +=的区别

在Makefile中我们经常看到 : ? 这几个赋值运算符&#xff0c;那么他们有什么区别呢&#xff1f;我们来做个简单的实验 新建一个Makefile&#xff0c;内容为&#xff1a; ifdef DEFINE_VRE VRE “Hello World!” else endif ifeq ($(OPT),define) VRE ? “Hello W…

ubuntu 编译源码包 dsc diff.gz orig.tar.gz

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff09; 在获取源码包之前&#xff0c;确保在软件源配置文件/etc/apt/sources.list中添加了deb-src项以tree实用程序&#xff08;以树型结构获取目录树&#xff09;为例&#xff0c;介绍Ubuntu中如何管理源码包&am…

【ACM】杭电OJ 2552

本来还查了atan 和 atan2 的用法&#xff0c;结果总是WA 看了解析之后才知道原来是要公式推导&#xff0c;最后得出所求的式子是一个等式&#xff0c;结果为1。 所以&#xff0c;以后出类似与数学公式的题&#xff0c;可能是要手算推到&#xff0c;在输出特定的结果。&#x…

蚂蚁金服天街:OceanBase 在大促 5 年来的技术演进

为了与金融从业者、科技从业者共同探讨金融 业务的深层次问题&#xff0c;蚂蚁金服联手 TGO 鲲鹏会&#xff0c;在 12 月 8 日举办了「走进蚂蚁金服&#xff1a;双十一背后的蚂蚁金服技术支持」活动。蚂蚁金服高级技术专家天街为大家分享了《蚂蚁双 11 大促 OceanBase 核心技术…

OTA升级flash分区

什么是在线OTA升级 - OTA是Over-the-Air的简写&#xff0c;空中下载技术的意思。 - OTA在线升级在日常消费电子产品中很常见&#xff0c;比如手机&#xff0c;机顶盒等&#xff0c;通过网络&#xff0c;下载升级数据包&#xff0c;更新操作系统等底层固件进行…

MD5与Base64的思考

MD5加密是对任意长的数据使用MD5哈稀算法散列为4个32位组,若格式化为ASCII字符则为16字符,若格式化16进制表示,则为32字符. (MD5的具体算法请参阅相关书籍和资料)MD5广泛用于数据校验和完整性检验.且不可逆.理论上为抗碰撞的在2004年8月17日,MD5遭遇重创,山东大学的王小云做了…