被虐爆了。。。

T1 整数

题目传送门

Description

有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况:

  • 给出 \(a,b\),将 \(x\) 加上 \(a\times 2^b\)

  • 给出 \(k\),询问 \(2^k\) 位置的值(二进制下第 \(k\) 位)

\(b\le 30\times n,a\le 10^9\)

Solution

做的时候特别愚蠢,写了一个 \(\Theta(30n\log n)\) 的代码交上去了。。。

实际上,我们可以直接暴力搞,我们可以每 \(64\) 位放进一个 \(\text{long long}\) 里面,然后分别维护 \(+,-\) 的信息,直接暴力加到每一位上,这样的复杂度均摊是 \(\Theta(30n)\) 的。

考虑如何计算一个位置的值,你发现只跟它及其它前面的值有关,所以只需要存一下 \(+,-\) 不一样的位置就好了。

复杂度 \(\Theta(n\log n)\) 的。

Code(嫖的wxk的,如有雷同绝非巧合)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 1000005 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int n,t1,t2,t3; #define ull unsigned long long set <int> dif;
ull val[2][MAXN]; void Addit (bool f,int whe){
int b = whe >> 6,p = whe - (b << 6);ull tmp = val[f][b];
if ((val[f][b] += 1ull << p) < tmp) Addit (f,b + 1 << 6);
if (val[0][b] == val[1][b]) dif.erase (dif.find (b));
else dif.insert (b);
} bool query (int k){
int b = k >> 6,p = k - (b << 6);
bool f = (val[0][b] >> p & 1) != (val[1][b] >> p & 1);
ull u0 = val[0][b] & (1ull << p) - 1,u1 = val[1][b] & (1ull << p) - 1;
if (u0 != u1) return f ? u0 > u1 : u0 < u1;
set <int>::iterator it = dif.lower_bound (b);
if (it == dif.begin()) return f;
else{
-- it;
return f ? val[0][*it] > val[1][*it] : val[0][*it] < val[1][*it];
}
} signed main(){
read (n,t1,t2,t3);
while (n --> 0){
int t,a,b;read (t);bool f;
if (t == 1){
read (a,b),f = (a < 0),a = a < 0 ? -a : a;
for (Int i = 0;(1 << i) <= a;++ i) if (a >> i & 1) Addit (f,b + i);
}
else{
int k;read (k);
write (query (k)),putchar ('\n');
}
}
return 0;
}

T2 蚯蚓排队

题目传送门

Description

懒得写,看题面吧。

Solution

直接链表维护,写一个 hash 表就好了,复杂度均摊 \(\Theta(nk+ck^2+\sum |s|)\)

Code

懒得放了

T3 泳池

题目传送门

Description

有一个大小为 \(n\times 1001\) 的矩阵,每个格子有 \(p\) 的概率有障碍,问以底为边的最大子矩阵大小为 \(K\) 的概率。

\(n\le 10^9,K\le 10^3\)

Solution

挺有意思的。

首先可以想到可以差分,即 \(\le K\) 的概率减去 \(\le K-1\) 的概率。分别求就好了,以下以 \(K\) 为例。

可以设 \(f_{r,c}\) 表示已经有 \(r\) 行 \(c\) 列满足最大矩阵大小 \(\le K\) 的概率,那我们就可以得到转移式:

\[f_{r,c}=p^c\times f_{r+1,c}+\sum_{i=1}^{c} p^{i-1}\times (1-p)\times f_{r+1,i-1}\times f_{r,c-i}
\]

边界就是当 \(r\times c>K\) 的时候 \(f_{r,c}=0\),当 \(c=0\) 的时候 \(f_{r,c}=1\) 。答案即是 \(f_{0,n}\) 。

很显然,就不解释了。

然后你发现 \(f_{0,x}\) 只会跟 \(f_{1,(0\to k)}\) 有关系,我们设 \(G_{i}=p^{i}\times (1-p)\times f_{1,i},F_i=f_{0,i}\),那么可以得到转移式:

\[F_n=\sum_{i=0}^{k+1} G_{i-1}\times F_{n-i}
\]

然后你发现这个式子就是一个常系数齐次线性递推板子,就可以直接暴力多项式乘法以及多项式取模做到 \(\Theta(k^2\log k)\) 了。

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define mod 998244353 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int n,K,x,y,p;
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
int qkpow (int a,int b){
int res = 1;for (;b;b >>= 1,a = mul (a,a)) if (b & 1) res = mul (res,a);
return res;
}
void Add (int &x,int y){x = add (x,y);}
void Dec (int &x,int y){x = dec (x,y);} #define MAXN 3005
int f[MAXN][MAXN],pw[MAXN]; int dfs (int r,int c,int k){
if (~f[r][c]) return f[r][c];
else if (r * c > k) return f[r][c] = 0;
else if (c == 0) return f[r][c] = 1;
else{
f[r][c] = mul (pw[c],dfs (r + 1,c,k));
for (Int i = 1;i <= c;++ i) Add (f[r][c],mul (mul (pw[i - 1],dec (1,p)),mul (dfs (r + 1,i - 1,k),dfs (r,c - i,k))));
return f[r][c];
}
} int ls,lq,lg,A[MAXN],Q[MAXN],S[MAXN],G[MAXN],F[MAXN],tmp[MAXN];
void polymul (int a[],int b[],int c[],int &n,int m){
for (Int i = 0;i <= n + m;++ i) tmp[i] = 0;
for (Int i = 0;i <= n;++ i)
for (Int j = 0;j <= m;++ j)
Add (tmp[i + j],mul (b[i],c[j]));
n += m;
for (Int i = 0;i <= n + m;++ i) a[i] = tmp[i];
} void polymod (int a[],int &n){
for (Int i = n;i >= lq;-- i){
if (!a[i]) continue;
int tmp = mod - a[i];
for (Int j = 0;j <= lq;++ j) Add (a[i - j],mul (tmp,Q[lq - j]));
}n = min (n,lq - 1);
while (n && !a[n]) -- n;
} int calc (int N,int k){
memset (Q,0,sizeof (Q)),memset (S,0,sizeof (S)),memset (G,0,sizeof (G));
Q[lq = k] = 1;for (Int i = 0;i < k;++ i) Q[k - i - 1] = mod - A[i];
S[0] = 1,G[1] = 1,ls = 0,lg = 1;
while (N){
if (N & 1) polymul (S,S,G,ls,lg),polymod (S,ls);
polymul (G,G,G,lg,lg),polymod (G,lg);
N >>= 1;
}
int res = 0;
for (Int i = 0;i < k;++ i) Add (res,mul (F[i],S[i]));
return res;
} int Solve (int k){
memset (f,-1,sizeof (f)),dfs (0,k,k),memset (F,0,sizeof (F)),memset (A,0,sizeof (A));
for (Int i = 0;i <= k;++ i) F[i] = f[0][i],A[i] = mul (f[1][i],mul (pw[i],dec (1,p)));
return calc (n,k + 1);
} signed main(){
read (n,K,x,y),p = mul (x,qkpow (y,mod - 2));
pw[0] = 1;for (Int i = 1;i <= K;++ i) pw[i] = mul (pw[i - 1],p);
if (n == 1) return write (mul (pw[K],dec (1,p))),putchar ('\n') & 0;
int v1 = Solve (K),v2 = Solve (K - 1);
write (dec (v1,v2)),putchar ('\n');
return 0;
}
/*
f_{r,c}=p^c*f_{r+1,c}+\sum_{i=1}^{c} p^(i-1)*(1-p)*f_{r+1,i-1}*f_{r,c-i}
*/

NOI 2017 Day1 题解的更多相关文章

  1. NOI 2016 Day1 题解

    今天写了NOI2016Day1的题,来写一发题解. T2 网格 题目传送门 Description \(T\) 次询问,每次给出一个 \(n\times m\) 的传送门,上面有 \(c\) 个位置是 ...

  2. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  3. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  4. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  5. JOISC 2017 Day1 T3 烟花棒

    JOISC 2017 Day1 T3 烟花棒 题意: ​ 数轴上有\(N\)人在放烟花,一开始只有第\(K\)个人的烟花是点燃的,烟花燃烧的时间为\(T\)秒,求让所有人的烟花都可以点燃的速度的最小值 ...

  6. NOI 2017滚粗退役记

    NOI 2017 游记 又到了OIer退役了的季节 Day -1 今天是报到日. 中午11点多的动车.动车上和dick32165401和runzhe2000谈笑风生.顺便用dick32165401的流 ...

  7. THUSC2017 Day1题解

    THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...

  8. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  9. SDOI 2017 Day1

    日期:2017-04-10 题解: 第一题: 题目大意:求fi(gcd(i,j))的乘积  i,j属于[1,1e6],数据组数1000组. 类别:套路题. 第二题:BZOJ原题. 题解:LCT套线段树 ...

随机推荐

  1. cmd关闭端口占用

    netstat -nao |findStr "8080" taskkill /pid 15406  /f

  2. vscode 1.32.x按下鼠标左键无法拖曳选择,而旧一点的版本1.30.2可以

    最近升级vscode后,无法通过鼠标左键选择文本,恢复到旧版本1.30.2就可以了. 另外:1.32.x和1.31.1都不正常 进一步测试发现:在中文输入法下(无论中英输入模式),都有问题:切换到纯英 ...

  3. vue 嵌入倒计时组件( 亲测可用 )

    由于花费了我不少时间才找到的组件,所以记录一下,后面方便自己好找一些,也算是分享出来给各位前端一起用. npm 下载npm install vue2-flip-countdown --save tem ...

  4. vue 引用省市区三级联动(element-ui Cascader)

    npm 下载 npm install element-china-area-data -S main.js import {provinceAndCityData,regionData,provinc ...

  5. 【CSS】模仿迅雷主页的按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. GoLang设计模式3 - 抽象工厂模式

    之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...

  7. uniapp 获取用户手机号

    参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...

  8. vuex前端工程化之动态导入文件--require.context( )

    随着项目的复杂,文件结构越来越多,Store中modules中的文件也越来越多,如果一个一个加载是不是很麻烦呢? 先看一个项目中store项目结构: 过去都是通过import分别引入文件: 1 imp ...

  9. UVA 506 System Dependencies(模拟 烂题)

    https://vjudge.net/problem/UVA-506 题目是给出了五种指令,DEPEND.INSTALL.REMOVE.LIST.END,操作的格式及功能如下: DEPEND item ...

  10. java设计模式,工厂,代理模式等

    javaEE设计模式: 工厂模式:主要分为三种模式: 定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行. 为什么要使用工厂模式: (1) 解耦 : ...