传送门

\(A\)

咕咕

int main(){
cin>>a>>b;
if(b<0)puts(((b-a+1)&1)?"Negative":"Positive");
else if(a>0)puts("Positive");
else puts("Zero");
return 0;
}

\(B\)

模拟一下就行了

const int N=1e5+5;
int sz[N],ok[N],n,m,res;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
fp(i,1,n)sz[i]=1;ok[1]=1;
for(R int x,y,i=1;i<=m;++i){
scanf("%d%d",&x,&y);
ok[y]|=ok[x],++sz[y],--sz[x];
if(!sz[x])ok[x]=0;
}
fp(i,1,n)res+=ok[i];
printf("%d\n",res);
return 0;
}

\(C\)

考虑反过来,每一次连接两段绳子,且连接之后长度要大于等于\(L\),那么第一次合并最长的两端,剩下的用这一段绳子去合并其他的就好了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[N],n,L;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&L);
fp(i,1,n)scanf("%d",&a[i]);
R int pos=0;
fp(i,1,n-1)if(a[i]+a[i+1]>=L){pos=i;break;}
if(!pos)return puts("Impossible"),0;
puts("Possible");
fp(i,1,pos-1)printf("%d\n",i);
fd(i,n-1,pos+1)printf("%d\n",i);
printf("%d\n",pos);
return 0;
}

\(D\)

以边的序号为边权建出\(kruskal\)重构树,然后二分最大的序号,判断是否合法就行了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=5e5+5;
struct eg{int v,nx;}e[N];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int fa[N][25],sz[N],dep[N],ga[N],val[N],Log[N];
int n,m,q,nd,l,r,mid,ans;
inline int find(R int x){return ga[x]==x?x:ga[x]=find(ga[x]);}
void dfs(int u){
sz[u]=(u<=n);
for(R int i=1;dep[u]>>i;++i)fa[u][i]=fa[fa[u][i-1]][i-1];
go(u)fa[v][0]=u,dep[v]=dep[u]+1,dfs(v),sz[u]+=sz[v];
}
inline int jump(R int u){
fd(i,Log[dep[u]],0)if(fa[u][i]&&val[fa[u][i]]<=mid)u=fa[u][i];
return u;
}
bool ck(R int u,R int v,R int p){
u=jump(u),v=jump(v);
return (u==v?sz[u]:sz[u]+sz[v])>=p;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);nd=n;
fp(i,1,n)ga[i]=i;
for(R int i=1,u,v,x,y;i<=m;++i){
scanf("%d%d",&u,&v);
u=find(u),v=find(v);
if(u!=v)++nd,ga[u]=ga[v]=ga[nd]=nd,add(nd,u),add(nd,v),val[nd]=i;
}
Log[0]=-1;fp(i,2,nd)Log[i]=Log[i>>1]+1;
dfs(nd);
scanf("%d",&q);
for(R int u,v,p;q;--q){
scanf("%d%d%d",&u,&v,&p);
l=1,r=m,ans=m;
while(l<=r){
mid=(l+r)>>1;
ck(u,v,p)?(ans=mid,r=mid-1):l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}

\(E\)

如果我们把所有的\(a_i\)降序排序,那么我们可以画出一个网格图,其中第\(i\)列有\(a_i\)个格子,初始在\(1,1\),第一个操作对应往右走,第二个操作对应往下走,那么走出边界的输

打表发现\((x,y)\)的答案和\((x+1,y+1)\)的答案相同,那么我们可以暴力找出最大的\((x,x)\),然后计算这个格子的答案就行了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
int a[N],n,m,las,pos,t;
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d",&a[i]);
sort(a+1,a+1+n),reverse(a+1,a+1+n);
fp(i,1,n)if(a[i]>=i)pos=i;else break;
a[n+1]=0,t=1;fp(i,pos+1,n)if(a[i]==pos)t^=1;else break;
puts(!(((a[pos]-pos+1)&1)&t)?"First":"Second");
return 0;
}

\(F\)

对于每种颜色,我们把它变成一个无色的球和\(k-1\)个有颜色的球,那么发现,我们需要满足位置关系的只有这些无色的球和每个颜色第一次出现的位置(记为特殊位置),并且满足每一个前缀中无色球的个数都大于等于特殊位置的个数

那么我们倒着放球,设\(f_{i,j}\)表示放了后\(i\)个位置,且这\(i\)个位置中有\(j\)个特殊位置的方案数,那么后面放的总球数就是\(i+j\times (k-1)\),转移的时候用组合数乘一下就可以了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=5005,M=5e6+5;
int f[N][N],fac[M],ifac[M],n,k;
inline int C(R int n,R int m){return m>n?0:1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;}
inline void init(R int n=5e6){
fac[0]=ifac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i);
ifac[n]=ksm(fac[n],P-2);fd(i,n-1,1)ifac[i]=mul(ifac[i+1],i+1);
}
int main(){
scanf("%d%d",&n,&k),--k;
if(!k)return puts("1"),0;
init();
f[0][0]=1;
fp(i,0,(n<<1)-1)fp(j,0,min(i,n))if(f[i][j]){
if(j+1<=n)upd(f[i+1][j+1],mul(n-j,mul(f[i][j],C(i+j*(k-1)+k-1,k-1))));
if((i+1-j)<=j)upd(f[i+1][j],f[i][j]);
}
printf("%d\n",f[n<<1][n]);
return 0;
}

AtCoder Grand Contest 002题解的更多相关文章

  1. AtCoder Grand Contest 002

    AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...

  2. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  3. AtCoder Grand Contest 017 题解

    A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...

  4. Atcoder Grand Contest 054 题解

    那天晚上由于毕业晚会与同学吃饭喝酒没打 AGC,第二天稍微补了下题,目前补到了 E,显然 AGC 的 F 对于我来说都是不可做题就没补了(bushi A 简单题,不难发现如果我们通过三次及以上的操作将 ...

  5. AtCoder Grand Contest 030题解

    第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...

  6. AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...

  7. AtCoder Grand Contest 031题解

    题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...

  8. [Atcoder Grand Contest 002] Tutorial

    Link: AGC002 传送门 A: …… #include <bits/stdc++.h> using namespace std; int a,b; int main() { sca ...

  9. AtCoder Grand Contest 039 题解

    传送门 \(A\) 首先只有一串的情况下,遇到相同的肯定是改后面那一个最优,然后两串的话可能要分奇偶讨论一下 //quming #include<bits/stdc++.h> #defin ...

随机推荐

  1. stm32f103的HSI设置

    HSI基本知识 HSI是8MRC震荡电路,精度1%. PLL的设置必须在其被激活前完成,输出必须被设置温48M或者72M LSE:通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭. ...

  2. git合并原则

    目前实验结果为: 假设有master和branch1,用master合并branch1时(在master分支中执行git merge branch1): 1.在同一个地方,master做了修改,bra ...

  3. java EE学习之数据库操作

    jdbc开发流程 注册驱动 建立连接(Connection) 创建运行SQL的语句(Statement) 运行语句 处理运行结果(ResultSet) 释放资源 注冊驱动有三种方式: Class.fo ...

  4. 怎样判断当前浏览器是PC浏览器还是手机浏览器

    可以通过检测navigator.userAgent字段中是否有"mobi"字段来检测是PC浏览器还是手机浏览器: /mobi/i.test(window.navigator.use ...

  5. List、dictionary、hashtable、ArrayList集合

    集合的引用命名空间在 system.Collections下 1.为什么引入集合 因为数组长度是固定的,为了建立一个动态的"数组",所以引入了集合. 2.为什么引入ArrayLis ...

  6. Asp.Net进阶/管家模式+发布订阅模式:练习

    现在需要实现一个需求:我需要在一个窗体中发送一个信息,其余几个窗体都能同时接收到发送的消息. 1.界面:一个管家窗体,1个主窗体,2个订阅者窗体.其中管家窗体为启动窗体. 2.订阅:2个订阅窗体订阅主 ...

  7. 二、openfeign生成并调用客户端动态代理对象

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...

  8. arm9交叉编译工具链

    Arm-linux-gcc: gcc和arm-linux-gcc的头文件并不一样. Eg. Arm-linux-ld:链接器,-T参数是使用链接器脚本. Eg. Arm-linux-readelf:读 ...

  9. java引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  10. Mysql 中的SSL 连接

    Mysql 中的SSL 连接 以下来自网络参考和自己测试整理,没有查找相关资料.若有错误之处,欢迎指正. 当前的Mysql 客户端版本基本都不太能支持 caching_sha2_password 认证 ...