题目链接:1043 - G. Quailty and Square Counter

首先,x向x^2%2017建边,跑一跑找找规律,能发现环套树一共有14个,每个的环最大6,且在环上的点一共64个,且不在环上的点到环的常数最多5。知道这样的性质后,就简单了,区间平方直接暴力,区间赋值直接搞,暴力的话到某个区间为相同数时停止。

其实上面都不是重点,大家都会,卡常才是最重要的,我从本地43s卡到11.6s,交上去跑了7s。

my   code:my~~~code:

#include <bits/stdc++.h>
using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )
#define root 1 , 1 , n
#define ls o << 1
#define rs o << 1 | 1
#define lson ls , l , m
#define rson rs , m + 1 , r const int MAXN = 100005 ;
const int mod = 2017 ;int be[mod][2] , step[mod][10] , len[mod] , vis[mod] , S[mod] , top , cas ;
unsigned long long T[MAXN * 3] , all[15] , res ;
int same[MAXN * 3] , shift[MAXN * 3] , in[MAXN * 3] , setv[MAXN * 3] ;
bitset < 2017 > G[MAXN * 3] , ans ;
int n , m ;void preprocess () {cas = 0 ;for ( int i = 0 ; i < mod ; ++ i ) {step[i][0] = i ;for ( int j = 1 ; j < 10 ; ++ j ) {step[i][j] = step[i][j - 1] * step[i][j - 1] % mod ;}}int now = 0 ;for ( int i = 0 ; i < mod ; ++ i ) if ( !vis[i] ) {int x = i , ok = 1 ;vis[x] = -1 ;top = 0 ;S[top ++] = x ;while ( 1 ) {x = x * x % mod ;if ( !vis[x] ) {vis[x] = -1 ;S[top ++] = x ;}else if ( vis[x] == 1 ) {ok = 0 ;break ;} else {ok = 1 ;break ;}}if ( ok == 1 ) {for ( int j = 0 ; j < top ; ++ j ) {if ( S[j] == x ) {len[++ cas] = top - j ;all[cas] = 0 ;for ( int k = j ; k < top ; ++ k ) {all[cas] |= 1ULL << now ;be[S[k]][0] = cas ;be[S[k]][1] = now ++ ;}break ;}}}for ( int j = 0 ; j < top ; ++ j ) {vis[S[j]] = 1 ;}}
}void up ( int o ) {int tmp = in[o] ;T[o] = T[ls] | T[rs] ;in[o] = in[ls] & in[rs] ;//G[o] = G[ls] | G[rs] ;if ( same[ls] == same[rs] ) same[o] = same[ls] ;else same[o] = -1 ;if ( tmp && in[o] ) return ;if ( in[o] ) G[o].reset () ;else if ( in[ls] ) G[o] = G[rs] ;else if ( in[rs] ) G[o] = G[ls] ;else {G[o] = G[ls] ;if ( same[o] == -1 ) G[o] |= G[rs] ;}
}void Shift ( int o , int s ) {int &x = same[o] ;shift[o] += s ;if ( !~x ) {unsigned long long t = 0 ;for ( int i = 1 ; i <= 14 ; ++ i ) {unsigned long long tmp = all[i] & T[o] ;if ( !tmp ) continue ;int a = s % len[i] ;int b = len[i] - a ;t |= ( ( tmp << a ) | ( tmp >> b ) ) & all[i] ;}T[o] = t ;} else {//s stepif ( s <= 5 ) {if ( be[x][0] ) T[o] = 0 ;else G[o][x] = 0 ;x = step[x][s] ;if ( be[x][0] ) T[o] = 1ULL << be[x][1] , in[o] = 1 ;else G[o][x] = 1 , in[o] = 0 ;} else {if ( be[x][0] ) T[o] = 0 ;else G[o][x] = 0 ;x = step[x][6] ;s -= 6 ;s %= len[be[x][0]] ;x = step[x][s] ;if ( be[x][0] ) T[o] = 1ULL << be[x][1] , in[o] = 1 ;else G[o][x] = 1 , in[o] = 0 ;}}
}void Same ( int o , int x ) {T[o] = 0 ;shift[o] = 0 ;if ( !in[o] ) {if ( ~same[o] ) {if ( x != same[o] ) G[o][same[o]] = 0 ;} else G[o].reset () ;}setv[o] = same[o] = x ;if ( be[x][0] ) T[o] = 1ULL << be[x][1] , in[o] = 1 ;else G[o][x] = 1 , in[o] = 0 ;
}void down ( int o ) {if ( ~setv[o] ) {Same ( ls , setv[o] ) ;Same ( rs , setv[o] ) ;setv[o] = -1 ;}if ( shift[o] ) {Shift ( ls , shift[o] ) ;Shift ( rs , shift[o] ) ;shift[o] = 0 ;}
}void update ( int L , int R , int x , int o , int l , int r ) {if ( L <= l && r <= R ) {if ( ~x ) Same ( o , x ) ;else {if ( l == r ) Shift ( o , 1 ) ;else {if ( in[o] || ~same[o] ) Shift ( o , 1 ) ;else {down ( o ) ;int m = l + r >> 1 ;update ( L , R , x , lson ) ;update ( L , R , x , rson ) ;up ( o ) ;}}}return ;}down ( o ) ;int m = l + r >> 1 ;if ( L <= m ) update ( L , R , x , lson ) ;if ( m <  R ) update ( L , R , x , rson ) ;up ( o ) ;
}void query ( int L , int R , int o , int l , int r ) {if ( L <= l && r <= R ) {res |= T[o] ;if ( !in[o] ) ans |= G[o] ;return ;}down ( o ) ;int m = l + r >> 1 ;if ( L <= m ) query ( L , R , lson ) ;if ( m <  R ) query ( L , R , rson ) ;
}void build ( int o , int l , int r ) {setv[o] = -1 ;shift[o] = 0 ;if ( l == r ) {int x ;scanf ( "%d" , &x ) ;G[o].reset () ;T[o] = 0 ;if ( be[x][0] ) T[o] = 1ULL << be[x][1] , in[o] = 1 ;else G[o][x] = 1 , in[o] = 0 ;same[o] = x ;return ;}int m = l + r >> 1 ;build ( lson ) ;build ( rson ) ;up ( o ) ;
}void show ( int o , int l , int r ) {if ( l == r ) {//printf ( "%d%c" , same[o] , l == n ? '\n' : ' ' ) ;return ;}int m = l + r >> 1 ;down ( o ) ;show ( lson ) ;show ( rson ) ;
}void solve ( int T ) {scanf ( "%d%d" , &n , &m ) ;build ( root ) ;for ( int i = 0 ; i < m ; ++ i ) {int op , l , r , x ;scanf ( "%d%d%d" , &op , &l , &r ) ;if ( op == 1 ) update ( l , r , -1 , root ) ;else if ( op == 2 ) {scanf ( "%d" , &x ) ;update ( l , r , x , root ) ;} else {res = 0 ;ans.reset () ;//show ( root ) ;query ( l , r , root ) ;int num = ans.count () + __builtin_popcountll ( res ) ;printf ( "%d\n" , num ) ;}}
}int main () {preprocess () ;int T ;//freopen ( "H.in" , "r" , stdin ) ;//freopen ( "h1.txt" , "w" , stdout ) ;scanf ( "%d" , &T ) ;for ( int i = 1 ; i <= T ; ++ i ) {solve ( i ) ;}//printf ( "%.5f\n" , ( double ) clock () / CLOCKS_PER_SEC ) ;return 0 ;
}

玲珑杯#3 G 1043 - G. Quailty and Square Counter【线段树-卡常数】相关推荐

  1. C++ 笔记(01)— 环境设置(安装g++、g++ 编译 C++、 生成可执行文件流程、解释器与编译器区别)

    1. g++安装 在 Linux 或者 UNIX 系统上,可以通过下面命令来查看是否安装了 GCC . $ g++ -v 如果已经安装 GNU 编译器,则有以下输出: wohu@wohu:~/C++$ ...

  2. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  3. 报错解决:-bash: export: `g++11=g++': not a valid identifier

    晚上在设置环境变量的时候报错如下: zhang@ubuntu:~$ export g++11=g++ -bash: export: `g++11=g++': not a valid identifie ...

  4. speech codec (G.711, G.723, G.726, G.729, iLBC)

    各种各样的编解码在各种领域得到广泛的应用,下面就把各种codec的压缩率进行一下比较,不正确之处望各位同行指正. Speech codec:     现主要有的speech codec 有: G.71 ...

  5. install g++ 出现“g++ : Depends: g++-4.8 (= 4.8.2-5~) but it is not going to be installed...解决方法

    在Ubuntu上安装Qt5.2后,有时需要手动配置Qt Versions.Compilers.Debuggers等,根据路径找到对应的qmake构建.gcc编译和gdb调试工具 创建工程第一次编译时报 ...

  6. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...

    sed命令n,N,d,D,p,P,h,H,g,G,x解析 1.sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2.p打印当前模式空间所有内容,追加到 ...

  7. Problem G. Pandaria(线段树合并 + Kruskal 重构树)

    Problem G. Pandaria 给定一个有nnn条边的无向连通图,每条边有对应的边权,每个点有一个颜色, 问从一个点出发,经过不超过www的边权,所能到达的点中,颜色出现次数做多且颜色编号最小 ...

  8. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  9. P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物,每个礼物对两个人有不同的价值,开始时AAA会送BBB一个礼物. ...

  10. 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

    题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间. ...

最新文章

  1. 百度地图-省市县联动加载地图
  2. StringBuffer与StringBuilder的区别
  3. 浅谈三级分销系统开发对企业的作用
  4. GitHub 4.6 万星:Windows Terminal 预览版开放下载!
  5. 与JBoss BPM Travel Agency更新了现代BPM数据集成
  6. Remmarguts' Date(POJ2449+最短路+A*算法)
  7. 圣诞节生成头像微信小程序源码1.3.0
  8. java反射随意值_Java反射总结
  9. struts2上传文件时把文件放到服务器真实路径下的webapps\upload下
  10. 目标检测——使用loss发现噪声数据
  11. 计算机组成与设计01——计算机概要与技术
  12. java坦克大战练习。java基础项目。巩固java基础部分。
  13. python+nodejs+Vue体检信息管理系统项目源码
  14. Java语言 Timer 定时器的四种使用方式
  15. p图软件pⅰc_P图教程|教你做超火的iMessage图 所需软件:Picsart QQ_修图软件_滤镜_picsart怎么样_纯白色_相册_我超会p图der_摄影_摄影技巧_修图技巧...
  16. C++ protected 解析
  17. x60可以升级鸿蒙,vivo X60性能大提速:8GB内存秒变11GB,支持20个App秒开
  18. excel按某个字符将一个单元格拆分成多个单元格
  19. 无需PS,这些工具也能轻松更换寸照底色
  20. Git Cheat Sheet 中文版

热门文章

  1. linux 代码编辑器软件下载,Visual Studio Code下载
  2. matlab参数摄动仿真,过程控制工程及仿真 基于MATLABSimulixnk_IT教程网
  3. linux系统设置中文
  4. PS中抠图的几种方法简介
  5. Bounds(包围盒)详解-【AABB包围盒、Sphere包围球、OBB方向包围盒、FDH固定方向凸包】
  6. STM32神舟III号 驱动直流电机学习(四 )
  7. Vue的全屏组件vue-fullscreen
  8. 支持bt,种子,torrent的离线下载网页版工具!
  9. Vue项目中国际化的语言切换
  10. MDM9607编译出现ERROR: Only one copy of bitbake should be run against a build directory