题意:n个数 m个询问

每个询问[l, r]的和, 再把[l, r]之间所有的数变为平方(模为9223372034707292160LL)

很明显的线段树

看到这个模(LLONG_MAX为9223372036854775807) 很明显平方时会爆LL

很容易发现所有数平方模了几次之后值就不再改变了 而且这个“几次”相当小 因此直接暴力搞就好了

    public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
BigInteger a=BigInteger.valueOf(2); // 这里看的是2的平方
Long b=9223372034707292160L;
BigInteger mod=new BigInteger(b.toString());
for(int i=1;i<=40;i++)
{
a=a.multiply(a).mod(mod);
System.out.println(i + ":" + a); // 平方i次之后的值
}
}
 import java.io.*;
import java.util.*;
import java.math.*;
import java.nio.charset.StandardCharsets; public class Main
{
static BigInteger li=BigInteger.ZERO;
static Long b=9223372034707292160L;
static BigInteger mod=new BigInteger(b.toString());
static BigInteger[] sum=new BigInteger[400005];
static boolean[] num=new boolean[400005];
static InputReader in = new InputReader();
public static void pushup(int rt)
{
sum[rt]=(sum[rt*2].add(sum[rt*2+1])).mod(mod);
num[rt]=num[rt*2]&num[rt*2+1];
}
public static void build(int l, int r, int rt)
{
if(l==r)
{
sum[rt]=in.nextBigInteger();
num[rt]=false;
return ;
}
int m=(l+r)/2;
build(l, m, rt*2);
build(m+1, r, rt*2+1);
pushup(rt);
}
public static BigInteger query(int L, int R, int l, int r, int rt)
{
if(L<=l && r<=R)
return sum[rt];
int m=(l+r)/2;
BigInteger ret=li;
if(L<=m)
ret=ret.add(query(L, R, l, m, rt*2)).mod(mod);
if(R>m)
ret=ret.add(query(L, R, m+1, r, rt*2+1)).mod(mod);
return ret.mod(mod);
}
public static void update(int L, int R, int l, int r, int rt)
{
if(num[rt])
return ;
if(l==r)
{
BigInteger cur=(sum[rt].multiply(sum[rt])).mod(mod);
if(sum[rt].equals(cur))
num[rt]=true;
sum[rt]=cur;
return ;
}
int m=(l+r)/2;
if(L<=m)
update(L, R, l, m, rt*2);
if(R>m)
update(L, R, m+1, r, rt*2+1);
pushup(rt);
}
public static void main(String[] args)
{
PrintWriter out = new PrintWriter(System.out);
int t, ca=1;
t=in.nextInt();
while((t--)!=0)
{
int n=in.nextInt();
int m=in.nextInt();
build(1, n, 1);
System.out.println("Case #" + ca + ":");
ca++;
BigInteger ans=li;
while((m--)!=0)
{
int l, r;
l=in.nextInt();
r=in.nextInt();
ans=ans.add(query(l, r, 1, n, 1)).mod(mod);
System.out.println(ans);
update(l, r, 1, n, 1);
}
}
}
} class InputReader
{
BufferedReader buf;
StringTokenizer tok;
InputReader()
{
buf = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext()
{
while(tok == null || !tok.hasMoreElements())
{
try
{
tok = new StringTokenizer(buf.readLine());
}
catch(Exception e)
{
return false;
}
}
return true;
}
String next()
{
if(hasNext())
return tok.nextToken();
return null;
}
int nextInt()
{
return Integer.parseInt(next());
}
long nextLong()
{
return Long.parseLong(next());
}
double nextDouble()
{
return Double.parseDouble(next());
}
BigInteger nextBigInteger()
{
return new BigInteger(next());
}
BigDecimal nextBigDecimal()
{
return new BigDecimal(next());
}
}

Java

C++11 有个神奇的东西叫做__int128   128位的整型,这题够了~

P.s. 这题很诡异的在HDOJ  java 过不了。。。MLE

 #include <bits/stdc++.h>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1 typedef __int128 LL;
const LL mod=;
const int N=1e5+;
LL sum[N<<];
bool num[N<<];
template <class T>
bool read(T &ret){char c;int sgn;if(c=getchar(),c==EOF)return ;while(c!='-' && (c<'' || c>'')) c = getchar();sgn = (c == '-') ? - : ;ret = (c == '-') ? : (c - '');while (c = getchar(), c >= ''&&c <= '') ret = ret * + (c - '');ret *= sgn;return ;}
template <class T>
void out(T x){if(x<){putchar('-');x=-x;}if(x>)out(x/);putchar(x%+'');}
void pushup(int rt)
{
sum[rt]=(sum[rt<<]+sum[rt<<|])%mod;
num[rt]=num[rt<<]&num[rt<<|];
}
void build(int l, int r, int rt)
{
if(l==r)
{
// scanf("%I64d", &sum[rt]);
read(sum[rt]);
num[rt]=;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt);
}
LL query(int L, int R, int l, int r, int rt)
{
if(L<=l && r<=R)
return sum[rt];
int m=(l+r)>>;
LL ret=;
if(L<=m)
ret=(ret+query(L, R, lson))%mod;
if(R>m)
ret=(ret+query(L, R, rson))%mod;
return ret%mod;
}
void update(int L, int R, int l, int r, int rt)
{
if(num[rt])
return ;
if(l==r)
{
LL cur=(sum[rt]*sum[rt])%mod;
if(sum[rt]==cur)
num[rt]=;
sum[rt]=cur;
return ;
}
int m=(l+r)>>;
if(L<=m)
update(L, R, lson);
if(R>m)
update(L, R, rson);
pushup(rt);
}
int main()
{
int t, ca=;
scanf("%d", &t);
while(t--)
{
int n, m;
scanf("%d%d", &n, &m);
build(, n, );
printf("Case #%d:\n", ca++);
LL ans=;
while(m--)
{
int l, r;
scanf("%d%d", &l, &r);
ans=(ans+query(l, r, , n, ))%mod;
// printf("%I64d\n", ans);
out(ans);
puts("");
update(l, r, , n, );
}
}
return ;
}

G++

[java线段树]2015上海邀请赛 D Doom的更多相关文章

  1. UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures<Problem M>

    M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  2. Java线段树

    线段树不是完全二叉树,是平衡二叉树 堆也是平衡二叉树 堆满二叉树: h层,一共有2^h-1个节点(大约是2^h) 最后一层(h-1层)有2^(h-1)个节点 最后一层的节点数大致等于前面所有层节点之和 ...

  3. java——线段树 SegmentTree

    应用: 区间染色 区间查询 线段树不是完全二叉树,线段树是平衡二叉树 使用数组来实现线段树:存储空间为4n 以下是使用数组实现的静态线段树: public class SegmentTree<E ...

  4. [java]2015上海邀请赛 B Base64

    题意: 给n和一个字符串(可以有空格) 求字符串编码n次后的字符串 编码方式:字符串的每个字符转化成ASCII码, ASCII码转化成8位2进制,    将二进制数分割成6位为一组的(不够的补0), ...

  5. [POI 2001+2014acm上海邀请赛]Gold Mine/Beam Cannon 线段树+扫描线

    Description  Byteman, one of the most deserving employee of The Goldmine of Byteland, is about to re ...

  6. hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)

    给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...

  7. ACM学习历程—HDU5475 An easy problem(线段树)(2015上海网赛08题)

    Problem Description One day, a useless calculator was being built by Kuros. Let's assume that number ...

  8. 2015上海网络赛 HDU 5475 An easy problem 线段树

    题意就不说了 思路:线段树,维护区间乘积.2操作就将要除的点更新为1. #include<iostream> #include<cstdio> #include<cstr ...

  9. hdu 5239 Doom(线段树)

    Doom Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Sub ...

随机推荐

  1. Oracle + Entity Framework 更新没有设置主键的表

    最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...

  2. NodeJS缓存机制:畅销货,就多囤一点呗

    上一篇文章,我们已经实现了客户端向NodeJS服务器发出请求时,服务器从磁盘读取文件内容后,向客户端返回文件的数据.而对于爱莲(iLinkIT)的1对n的场景,即将文件共享出来之后,让多个用户同时下载 ...

  3. Ubuntu将软件(Sublime Text 2为例)锁定到启动器

    Ubuntu中打开某安装好的软件,然后右击启动器(Launcher)上打开的图标就可以将该软件锁定到启动器或者从启动器解锁. 然而,有许多软件下载后直接解压就能用,不需要安装,这种情况采用上述方法锁定 ...

  4. open_clientfd(char* hostname,int port)和open_listenfd(int port)

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...

  5. PHP json_encode中日语问题

    <?php header('Content-type:text/html;charset=utf-8'); $s = array('message'=>'4月以降.遺体の捜索活動が続けられ ...

  6. jquery获得option的值(示例)

    jquery获得option的值和对option的操作. jQuery获取Select元素,并选择的Text和Value: 复制代码代码如下: $("#select_id").ch ...

  7. php入门之表单创建和基本处理

    为了方便后面学习数组,这里引入了过渡章节就是表单,至于为什么,等真的学习到数组的时候你就会发现它的妙处拉. ============================================== ...

  8. 转 IHttpModule不起作用

    在 Visual Studio 中,测试 IHttpModule(httpModules) 正常,但是放到服务器上去就不起作用了,这多半得多服务器 IIS 配置入手. 一.看“应用程序池”的“托管管道 ...

  9. try、catch、finally的使用分析---与 return 相关

    看了一篇文章,讲解的是关于java中关于try.catch.finally中一些问题 下面看一个例子(例1),来讲解java里面中try.catch.finally的处理流程   1 2 3 4 5 ...

  10. 【转】perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行

    默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符. 当读取序列时,按行来读取时,就是以换行符为标准. 读取的strawberry1.gb的文件内容如下: LOCUS JX118024 4 ...