100+100+100=300。最后十分钟极限翻盘。

树链剖分

给一棵以1为根的有根树,开始只有1有标记.

每次操作可以给某个点打上标记,或者询问从某个点开始向上跳,遇到的第一个有标记的点.

对于 100% 的数据, n ≤ 106, m ≤ 5 × 106

题解

若把查询看成找树根, 发现打标记的操作相当于断边。

那么倒着做就相当于加边了。于是用并查集维护即可。

注意一些特殊情况:给1打标记,重复打标记。

天气之子

有 n 个人依次进入观影厅, 观看 Weathering with You .

观影厅只有一排座位, 第 1 个人进入时, 会选择第 1 个座位坐下.

由于观影厅空调坏掉了, 十分炎热, 之后的每个人进入时, 他会选择一个离最近的已经坐下的人尽可能远的空位.

如果有多个空位使得离最近的人同样远, 则他会从其中随机选取一个.

若有两个人选择的位置相邻, 他们就会不满意.

为了让所有人都满意, 观影厅至少需要有几个座位呢?

对于 100% 的数据, n ≤ 101000.

题解

对每个座位数能够容纳的人数进行打表可以发现,容纳人数是递增的。有个特殊的人数数列

\[A=\{2,3,5,9,17,33,\dots,2^{n-1}+1\}
\]

对于每个人数 \(a_i\),都对应了一段的座位数 \([n+n-1,n+2(n-1)]\)。这一段座位数能够容纳的人数都是 \(a_i\),并且两两间隔从 \(1\) 逐渐增大到 \(2\)。而对于非 \(a_i\) 数列中的人数,只有一个座位数的容纳人数与之相等。

于是用高精度算一下大于等于 \(n\) 的最小的 \(a_i\),然后简单计算即可。

打表程序

  1. co int N=10000+10;
  2. int v[N],le[N],ri[N];
  3. int f[N];
  4. int main(){
  5. cout<<1<<" "<<1<<endl<<2<<" "<<1<<endl;
  6. for(int n=3;n<=1000;++n){
  7. fill(v+1,v+n+1,0),v[1]=v[n]=1;
  8. int ans=2;
  9. while(1){
  10. for(int i=1;i<=n;++i) le[i]=v[i]?i:le[i-1];
  11. for(int i=n;i>=1;--i) ri[i]=v[i]?i:ri[i+1];
  12. int len=1,pos;
  13. for(int i=1;i<=n;++i)
  14. if(min(i-le[i],ri[i]-i)>len) len=min(i-le[i],ri[i]-i),pos=i;
  15. if(len==1) break;
  16. v[pos]=1,++ans;
  17. }
  18. cout<<n<<" "<<ans<<endl;
  19. }
  20. return 0;
  21. }

AC 程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<class T> T read(){
  4. T x=0,w=1;char c=getchar();
  5. for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
  6. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  7. return x*w;
  8. }
  9. template<class T> T read(T&x){
  10. return x=read<T>();
  11. }
  12. #define co const
  13. #define il inline
  14. typedef long long LL;
  15. co int N=113,mod=1000000000;
  16. co int P10[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
  17. struct node{
  18. int n,v[N];
  19. // 123456789123456789
  20. void input(){
  21. static char s[1001];
  22. scanf("%s",s);int len=strlen(s);
  23. reverse(s,s+len);
  24. n=(len-1)/9;
  25. for(int i=0;i<len;++i) v[i/9]+=P10[i%9]*(s[i]-'0');
  26. }
  27. void output(){
  28. printf("%d",v[n]);
  29. for(int i=n-1;i>=0;--i) printf("%09d",v[i]);
  30. }
  31. node operator+(int x){ // x=1
  32. node c=*this;
  33. c.v[0]+=x;
  34. return c;
  35. }
  36. node operator-(int x){ // x=1
  37. node c=*this;
  38. c.v[0]-=x;
  39. for(int i=0;i<=c.n;++i){
  40. if(c.v[i]<0) c.v[i]+=mod,--c.v[i+1];
  41. else break;
  42. }
  43. while(c.n&&!c.v[c.n]) --c.n;
  44. return c;
  45. }
  46. node operator-(co node&b){ // *this>=b
  47. node c=*this;
  48. for(int i=0;i<=c.n;++i){
  49. c.v[i]-=b.v[i];
  50. if(c.v[i]<0) c.v[i]+=mod,--c.v[i+1];
  51. }
  52. while(c.n&&!c.v[c.n]) --c.n;
  53. return c;
  54. }
  55. node&operator*=(int x){ // x=2
  56. for(int i=0;i<=n;++i) v[i]*=x;
  57. for(int i=0;i<=n;++i) v[i+1]+=v[i]/mod,v[i]%=mod;
  58. if(v[n+1]) ++n;
  59. return *this;
  60. }
  61. bool operator<(node&b){
  62. if(n!=b.n) return n<b.n;
  63. for(int i=n;i>=0;--i)
  64. if(v[i]!=b.v[i]) return v[i]<b.v[i];
  65. return 0;
  66. }
  67. }n,a;
  68. int main(){
  69. freopen("tenki.in","r",stdin),freopen("tenki.out","w",stdout);
  70. n.input();
  71. if(n.n==0&&n.v[0]==1) {puts("1");return 0;}
  72. a.v[a.n=0]=1;
  73. while(a+1<n) a*=2;
  74. a=a+1;
  75. node b=a-n;
  76. a*=2,a=a-1,a=a-b;
  77. a.output();
  78. return 0;
  79. }

层层染君色

给定一个正整数 k , 以及一棵 n 个节点的以 1 为根的有根树, 边有长度.

记 LCA(a, b) 表示 a 与 b 在树上的最近公共祖先, dist(a) 表示树根到 a 的距离.

每个节点可以是黑色或白色, 初始时每个节点的颜色为白色.

进行 m 次操作, 每次操作是以下两种形式之一:

修改操作: 给出一个修改节点 x , 将节点 x 染上黑色. 不保证 x 在染色前为白色.

询问操作: 给出一个询问节点 x , 记所有黑点形成的集合为 S , 求出下面式子的值:

y∈S F(dist(LCA(x, y)))

其中函数 F 定义为,

F(x) = ∑i=1~Xik

由于答案可能很大, 只需要输出答案对 P = 998244353 取模的结果.

对于 100% 的数据, 1 ≤ n ≤ 105, 1 ≤ k < P, 0 ≤ d ≤ 107, 且保证 ∀x ∈ [1, n], dist(x) ≤ 107

题解

那个 F 函数只能用线性筛预处理。

观察到询问操作只与自己到根这条链有关,那么树上统计树剖即可。注意为了在父亲处去掉自己的贡献,需要将权值设为 F(dist(x))-F(dist(fax))。

  1. read(K);
  2. p[1]=1,F[1]=1;
  3. for(int i=2;i<M;++i){
  4. if(!p[i]) p[++cnt]=i,F[i]=fpow(i,K);
  5. for(int j=1;j<=cnt&&i*p[j]<M;++j){
  6. p[i*p[j]]=1,F[i*p[j]]=mul(F[i],F[p[j]]);
  7. if(i%p[j]==0) break;
  8. }
  9. }
  10. for(int i=2;i<M;++i) F[i]=add(F[i-1],F[i]);

test20190904 JKlover的更多相关文章

  1. test20190903 JKlover

    100+65+100=265,T2就差了一点. 乌合之众 给出一个 n × n 的, 元素为自然数的矩阵.这个矩阵有许许多多个子矩阵, 定义它的所有子矩阵形成的集合为 S . 对于一个矩阵 k , 定 ...

  2. test20190904

  3. Codeforces1113F. Sasha and Interesting Fact from Graph Theory(组合数学 计数 广义Cayley定理)

    题目链接:传送门 思路: 计数.树的结构和边权的计数可以分开讨论. ①假设从a到b的路径上有e条边,那么路径上就有e-1个点.构造这条路径上的点有$A_{n-2}^{e-1}$种方案: ②这条路径的权 ...

  4. LG4455 【[CQOI2018]社交网络】

    分析 这题我们先转化为图论模型,发现求的其实就是有向图中以1为根的生成树数量.而关于这一问题存在O(3^n * n^2)的算法,一看数据n=250,发现不行.于是需要更高效的算法--Matrix-Tr ...

  5. POJ3764,BZOJ1954 The xor-longest Path

    题意 In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of ...

  6. LOJ10050 The XOR Largest Pair

    题意 在给定的 \(N\) 个整数 \(A_1,A_2,-,A_N\) 中选出两个进行异或运算,得到的结果最大是多少? 对于 \(100\%\) 的数据,\(1\le N\le 10^5, 0\le ...

  7. LOJ10042 收集雪花

    题意 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望有重 ...

  8. LOJ2823 「BalticOI 2014 Day 1」三个朋友

    题意 给定一个字符串 S,先将字符串 S 复制一次(变成双倍快乐),得到字符串 T,然后在 T 中插入一个字符,得到字符串 U. 给出字符串 U,重新构造出字符串 S. 所有字符串只包含大写英文字母. ...

  9. LOJ10034 图书管理

    题意 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需要支 ...

随机推荐

  1. org.apache.hadoop.conf.Configuration无法引用 解决方法

    我用的是Hadoop-common 2.6.4jar,可是明明包里面有这个类却引用不了,然后我看了下包里面是一个抽象类......................................... ...

  2. RobotFrameWork基本语法练习

    1.基本使用如下图 2.运行日志如下(可对照查看语句输出) Starting test: Test.Test Suite.test_case1 20180810 15:48:58.525 : INFO ...

  3. SQL Server中的GAM页和SGAM页

    简介 我们已经知道SQL Server IO最小的单位是页,连续的8个页是一个区.SQL Server需要一种方式来知道其所管辖的数据库中的空间使用情况,这就是GAM页和SGAM页. Global A ...

  4. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  5. [转帖]rename(Perl语言版本) 详解

    rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  6. Vivado关联Modelsim进行联合仿真

    Vivado自带仿真工具,但是有点慢,关联Modelsim联合仿真是最好的,注意Modelsim必须是10.7以上版本. 1.安装并成功破解Modelsim 10.7. 2.打开Vivado,点击 T ...

  7. 05 Cookie.Session

    Cookie:在浏览器中保存用户的信息   使用:由服务器创建,发送到浏览器保存,之后随着请求发回到服务器 1.创建cookie Cookie cookie = new Cookie("na ...

  8. bootstrap-wizard向导插件的使用

    引用文件 <link rel="stylesheet" href="bootstrap-wizard/bootstrap-wizard.css"> ...

  9. Java线程本地存储ThreadLocal

    前言 ThreadLocal 是一种 无同步 的线程安全实现 体现了 Thread-Specific Storage 模式:即使只有一个入口,内部也会为每个线程分配特有的存储空间,线程间 没有共享资源 ...

  10. -Gradle 翻译 Merge AndroidManifest 合并清单文件 MD

    目录 目录 Merge AndroidManifest 合并清单文件 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则的标记 节点标记 属性标记 Attribute markers 标记选择 ...