传送链接~

ARC102

前言

实在是太菜了。。。。写完第一题就弃疗。。感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分!

正文

A

  • 题意 给你两个数字\(n,k(1 \leq n,k \leq 2e5)\) 求出有序对\((a,b,c)\) 的数量 使得满足\((a,b,c \leq n)\) 且 \(a+b , a+c , b+c\) 都是\(k\)的倍数

  • 题解 可以很快地发现 \(a mod k == b mod k == c mod k\) 且 \((a+b) mod k == 0\) 那么\(a,b,c\) 模 \(k\) 之后的情况只剩下了两种
    • 都等于0
    • 都等于 \(\frac{k}{2}\)
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=1e5+10;
int yz[N];

int main(){
    int n,k;scanf("%d%d",&n,&k);
    LL ans=0;
    LL gg=n/k;
    ans=gg*gg*gg;
    if(k%2==0){
        LL pos=n/k;
        if(pos*k+(k/2)<=n) pos++;
        ans+=pos*pos*pos;
    }
    printf("%lld\n",ans);
    return 0;
}

B

  • 题意 给你一个数\(L(2 \leq L \leq 1e6)\) 让你构造出一张有向图 最多20个点 60条边 (顶点按照1,2,...标号 且满足拓扑序为 1,2,3....

  • 题解 看到最多20个点很明显可以想到二进制拆分嘛!!
    首先我们可以构造出这么一张图 ::

    然后我们拆分一下\(L\) 我们对于剩下的 可以钦定高位 让低位从\(0000..\)一直取到\(1111...\)

#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=30;
struct data{
    int nt,to,w;
}a[N*N];
int b[N],head[N];
int n,m,cnt=0;

void add(int x,int y,int w){
    a[++cnt].to=y,a[cnt].w=w,a[cnt].nt=head[x],head[x]=cnt;
}

int main(){
    int L;scanf("%d",&L);
    int n=0,tmp=L;
    for(;L;L>>=1) n++;
    L=tmp;
    fr(i,1,n-1) add(i,i+1,1<<(i-1)),add(i,i+1,0);
    int gg=1<<(n-1);
    rf(i,n-1,1) if((L>>(i-1))&1) add(i,n,gg),gg+=(1<<(i-1));
    printf("%d %d\n",n,cnt);
    fr(u,1,n) for(int i=head[u];i;i=a[i].nt){
        printf("%d %d %d\n",u,a[i].to,a[i].w);
    }
    return 0;
}

C

  • 题意 给你\(n\)个骰子 每个骰子有\(k\)个面 代表的数字分别为\(1...k\) 骰子相同 对于每一个\(2 \leq i \leq 2*k\) 问有多少钟方案使得任意两个骰子相加和不为\(i\)
    \(n,k \leq 2000\)

  • 题解 组合数学 容斥
    我们考虑对于一个\(i\) 有多少对是不合法的 设为\(t\)
    那么我们可以进行容斥操作。。 枚举\(j\)对不合法的
    那么对于剩下的\(n-2*j\)个骰子 随意投 又骰子是相同的 等价于一个放球问题 \(n-2*j\)个相同的球放入\(k\)个盒子里 可以为空
    \(C_{n-2*j+k-1}^{k-1}\)

#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=4010,mod=998244353;
LL jc[N]={1},ny[N];

void Mul(LL &x,LL y){
    x=(x*y)%mod;
}

void Add(LL &x,LL y){
    x=(x+y+mod)%mod;
}

LL mul(LL x,LL y){
    return x*y%mod;
}

LL q_pow(LL x,int y=mod-2){
    LL ans=1;
    for(;y;y>>=1){
        if(y&1) Mul(ans,x);
        Mul(x,x);
    }
    return ans;
}

LL C(int x,int y){
    if(x==y||!y) return 1;
    LL pos=mul(jc[x],mul(ny[y],ny[x-y]));
    //printf("%d %d %lld\n",x,y,pos);
    return pos;
}

int main(){
    int n,k;scanf("%d%d",&k,&n);
    fr(i,1,n+k) jc[i]=jc[i-1]*1LL*i%mod,ny[i]=q_pow(jc[i]);
    fr(i,2,2*k){
        int gg=i/2;
        if(i-i/2>k) gg=0;
        else if(i>k+1) gg-=(i-k-1);
        LL ans=0;
        //printf("zz%d %d\n",i,gg);
        fr(j,0,gg) {
            if(j*2>n) break;
            //printf("j=%d gg=%d n-2*j+k-1=%d k-1=%d\n",j,gg,n-2*j+k-1,k-1);
            LL pos=mul(C(gg,j),C(n-2*j+k-1,k-1));
            if(j&1) Add(ans,-pos);
            else Add(ans,pos);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

D

  • 题意 给出一个\(n\)的排列 每次可以交换这个三个数\(a_{i-1},a{i},a_{i+1}\) 满足\(a_{i-1} > a_i > a_{i+1}\) 则交换\(a_{i-1}\)和\(a_{i+1}\) 问最后能否将原序列变成\(1,2,3,4...n\)

  • 题解 首先搞出\(b[]\) \(b[i]=(a[i]==i)\)
    - 如果有连续三个\(b\)是0的话显然是不可行的
    - 将\(b\)数组划分成一段一段
    对于\([l,r]\)这一段 \(a[l]至a[r]\) 的值域也必须是\([l,r]\)
    考虑\(a[i]>i\) 就看离\(a[i]\)最近的\(a[j]>i\) 之中的\(a[j]\)是否大于\(a[i]\)
    \(a[i]<i\) 同理

#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=3e5+10;
int a[N],b[N];

void fail(){
    printf("No\n");
    exit(0);
}

bool check(int l,int r){
    int L=0,R=0;
    fr(i,l,r){
        if(b[i]<l||b[i]>r) return false;
        if(b[i]<i)
            if(L>b[i]) return false;
             else L=b[i];
        else if(b[i]>i)
            if(R>b[i]) return false;
             else R=b[i];
    }
    return true;
}

int main(){
    int n;scanf("%d",&n);
    fr(i,1,n) scanf("%d",&b[i]),a[i]=(b[i]==i);
    fr(i,2,n-1) if(!a[i-1]&&!a[i]&&!a[i+1]) fail();
    fr(i,1,n){
        if(!a[i]){
            int l=i,r=i,nw=0;
            while((a[r+1]^nw)&&r+1<=n) r++,nw^=1;
            //printf("%d %d\n",l,r);
            if(!check(l,r)) fail();
            i=r;
        }
    }
    printf("Yes\n");
    return 0;
}

AtCoder | ARC102 | 瞎讲报告的更多相关文章

  1. AtCoder | ARC103 | 瞎讲报告

    目录 ARC 103 A.//// B.Robot Arms C.Tr/ee D.Distance Sums ARC 103 窝是传送门QwQ A.//// 题意 : 给你\(n\)(\(n\)为偶数 ...

  2. Codeforces1101 | EducationalRound58 | 瞎讲报告

    目录 Educational Codeforces Round 58 (Rated for Div. 2) A. Minimum Integer B. Accordion C. Division an ...

  3. Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告

    目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...

  4. Codeforces1151E,F | 553Div2 | 瞎讲报告

    传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...

  5. Codeforces1084 | Round526Div2 | 瞎讲报告

    目录 A. The Fair Nut and Elevator B.Kvass and the Fair Nut C.The Fair Nut and String D.The Fair Nut an ...

  6. 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)

    [背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...

  7. [NOIP2018模拟赛10.25]瞎搞报告

    闲扯 最近有点颓,都修到好晚,早上起来和吔shi一样难受 忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛 T1发现似乎可以DP,顺手码了个 T2像个最小瓶颈路板子,但是只做过N^2算法的.. ...

  8. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  9. SQL Server数据库定时自动备份

    SQL Server 数据库定时自动备份[转]   在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求 ...

随机推荐

  1. 解决osx下 ssh: connect to host localhost port 22: Connection refused

    解决办法: 终端下执行:sudo  systmesetup -setremotelogin on

  2. VC++中出现stack overflow错误时修改VC++的默认堆栈大小

    VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错 ...

  3. Linux系统管理命令

    Linux系统管理命令 命令 说明 stat 显示指定文件的相关信息,比ls命令显示内容更多 who 显示在线登录用户 hostname 显示主机名称 uname 显示系统信息 top 显示当前系统中 ...

  4. Oracle(一)执行计划

    目录 一.什么是执行计划 二.如何查看执行计划 三.如何读懂执行计划 1. 执行顺序的原则 2. 执行计划中字段解释 3. 谓词说明 4. JOIN方式 4.1 HASH JOIN(散列连接) 4.2 ...

  5. 支持xhr浏览器:超时设定、加载事件、进度事件

    各个浏览器虽然都支持xhr,但还是有些差异. 1.超时设定 IE8为xhr对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止.再给timeout这只一个数值后,如果在规定的时间内浏览 ...

  6. 学习笔记·堆优化$\mathscr{dijkstra}$

    嘤嘤嘤今天被迫学了这个算法--其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\) 由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \ap ...

  7. Jmeter之八大可执行元件及执行顺序

    初步接触Jmeter,对比LoadRunner进行熟悉,╮(╯▽╰)╭.毕竟我对LoadRunner还是比Jmeter熟悉. 1.配置元件 用来提供对静态数据配置的支持.例CSV Data Set c ...

  8. C. String Transformation

    http://codeforces.com/problemset/problem/946/C You are given a string s consisting of |s| small engl ...

  9. ASP.NET Core多语言 (转载)

    ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化.ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现 ...

  10. MySql优化分析

    原理 MYSQL逻辑分层 :连接层 服务层 引擎层 存储层 InnoDB(默认) :事务优先 (适合高并发操作:行锁) MyISAM :性能优先 (表锁) SQL优化 编写过程: sql select ...