题意: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. FreeCodeCamp-JS基础部分

    ---恢复内容开始--- .pop()     将数组末尾的元素移除     var removedFromMyArray=myArray.pop()     将myArray数组的最后一个元素移除并 ...

  2. 编辑器笔记——sublime text3 编译sass

    如已经安装sass 和 sass build两个插件到ST,command+b编译也没有问题,那么另外安装koala,在koala中引入你要编辑的sass,并把该sass文件设置为自动编译,那么用ST ...

  3. Guzz

    http://www.cnblogs.com/shitou/archive/2011/05/31/2064838.html

  4. 关于C#正则表达式MatchCollection类的总结,正则表达式的应用

    认识MatchCollection 类 表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合. 命名空间:  System.Text.RegularExpressions 属性:C ...

  5. C#,PHP对应加密函数

    require_once "JunDes.php"; $jDes=new JunDes(); echo $jDes->encode('98765'); //echo $jDe ...

  6. thymeleaf 内联语法

    十二. thymeleaf内联语法 内联:th:inline,值有三种:text,javascript,none 12.1 th:inline="text"文本内联 <p t ...

  7. laravel--belongsTo关联

    1.第一个是要引入的模型类 格式这样 belongsTo 第二个参数是拿自己这个模型表的 哪个字段 去匹配 要关联的qualified表里的哪个ID 默认是拿qualified_id去匹配,前面的是对 ...

  8. php计算时间差的方法

    一个简单的例子:计算借书的天数,根据每天的日期进行计算. (1) 有数据库的情况      MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可.    MYSQL那就用两个日期字 ...

  9. 使用commons-fileUpload组件上传文件

    在近期的一个项目中有用到commons-fileUpload组件进行实现文件上传的功能(由于没用到框架),在使用的过程中有遇到一些问题,经过自己的琢磨也算顺利地将其解决了,在这里做个记录. 一.com ...

  10. 购买 CDRTools 2 正式版

    联系方式: Email:396390927@qq.com QQ: 396390927    QQ群: 26326434  组件价格: ¥50元/用户,免费更新: 此物为数字商品,并经过测试完全可用,谢 ...