[java线段树]2015上海邀请赛 D Doom
题意: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的更多相关文章
- UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures<Problem M>
M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- Java线段树
线段树不是完全二叉树,是平衡二叉树 堆也是平衡二叉树 堆满二叉树: h层,一共有2^h-1个节点(大约是2^h) 最后一层(h-1层)有2^(h-1)个节点 最后一层的节点数大致等于前面所有层节点之和 ...
- java——线段树 SegmentTree
应用: 区间染色 区间查询 线段树不是完全二叉树,线段树是平衡二叉树 使用数组来实现线段树:存储空间为4n 以下是使用数组实现的静态线段树: public class SegmentTree<E ...
- [java]2015上海邀请赛 B Base64
题意: 给n和一个字符串(可以有空格) 求字符串编码n次后的字符串 编码方式:字符串的每个字符转化成ASCII码, ASCII码转化成8位2进制, 将二进制数分割成6位为一组的(不够的补0), ...
- [POI 2001+2014acm上海邀请赛]Gold Mine/Beam Cannon 线段树+扫描线
Description Byteman, one of the most deserving employee of The Goldmine of Byteland, is about to re ...
- hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)
给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...
- ACM学习历程—HDU5475 An easy problem(线段树)(2015上海网赛08题)
Problem Description One day, a useless calculator was being built by Kuros. Let's assume that number ...
- 2015上海网络赛 HDU 5475 An easy problem 线段树
题意就不说了 思路:线段树,维护区间乘积.2操作就将要除的点更新为1. #include<iostream> #include<cstdio> #include<cstr ...
- hdu 5239 Doom(线段树)
Doom Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Sub ...
随机推荐
- OC4_实例变量的作用域
// // Dog.h // OC4_实例变量的作用域 // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 zhangxu ...
- NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与 ...
- 取消定时-CICS
CICE CA R 做定时的时候最好加上REqID
- java学习笔记_GUI(5)
demo如何为不同的button创建对应的响应函数 import javax.swing.*; import java.awt.event.*; import java.awt.*; class My ...
- DTCMS,手机网站访问跳转到DTCMS官网解决方法
mobile\js\base.js main\js\common.js 去掉location.href = 'http://m.dtcms.net'; 也可以设定手机访问跳转到指定域名
- dtcms,header显示头像和用户名,QQ互联老不通过的解决方法
http://bbs.dtsoft.net/forum.php?mod=viewthread&tid=1742&extra=page%3D1
- 【Winform】 Enum逆向解析
将字符串转换成Enum类型 Enum.Parse:将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象. 名称 说明 Parse(Type, String) 将一个或多个枚举常数 ...
- delphi中的临界区
var fLock:TRTLCriticalSection; //定义临界区域 // 初始化 InitializeCriticalSection(fLock); //进入临界区 EnterCritic ...
- 别让emacs损伤你的小母指
刚接触emacs时感觉,这东西怎么这么难用,还说是编辑器的神,我去. 写个代码跟挫游戏机手柄似的,关键是还这么难挫,平时用的最多的左ctrl键,这么难按,可怜的我的小母指(Petyr Baelish) ...
- 通过MyEclipse生成Hibernate类文件和hbm.xml文件,或者annotation文件
1. 前言 很多人都在使用myEclipse,很多公司也都使用hibernate框架,老版本的hibernate中,由于没有annotation,我们需要写两个文件来维护表与对象的关系,写一个类, ...