標籤:
題意: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次之後的值 } }
1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 import java.nio.charset.StandardCharsets; 5 6 public class Main 7 { 8 static BigInteger li=BigInteger.ZERO; 9 static Long b=9223372034707292160L; 10 static BigInteger mod=new BigInteger(b.toString()); 11 static BigInteger[] sum=new BigInteger[200005]; 12 static boolean[] num=new boolean[200005]; 13 static InputReader in = new InputReader(); 14 public static void pushup(int rt) 15 { 16 sum[rt]=(sum[rt*2].add(sum[rt*2+1])).mod(mod); 17 num[rt]=num[rt*2]&num[rt*2+1]; 18 } 19 public static void build(int l, int r, int rt) 20 { 21 if(l==r) 22 { 23 sum[rt]=in.nextBigInteger(); 24 num[rt]=false; 25 return ; 26 } 27 int m=(l+r)/2; 28 build(l, m, rt*2); 29 build(m+1, r, rt*2+1); 30 pushup(rt); 31 } 32 public static BigInteger query(int L, int R, int l, int r, int rt) 33 { 34 if(L<=l && r<=R) 35 return sum[rt]; 36 int m=(l+r)/2; 37 BigInteger ret=li; 38 if(L<=m) 39 ret=ret.add(query(L, R, l, m, rt*2)).mod(mod); 40 if(R>m) 41 ret=ret.add(query(L, R, m+1, r, rt*2+1)).mod(mod); 42 return ret.mod(mod); 43 } 44 public static void update(int p, int l, int r, int rt) 45 { 46 if(l==r) 47 { 48 BigInteger cur=(sum[rt].multiply(sum[rt])).mod(mod); 49 if(sum[rt].equals(cur)) 50 num[rt]=true; 51 sum[rt]=cur; 52 return ; 53 } 54 int m=(l+r)/2; 55 if(p<=m) 56 update(p, l, m, rt*2); 57 else 58 update(p, m+1, r, rt*2+1); 59 pushup(rt); 60 } 61 static int n; 62 public static void update(int L, int R, int l, int r, int rt) 63 { 64 if(L<=l && r<=R) 65 { 66 if(num[rt]) 67 return ; 68 if(l==r) 69 update(l, 1, n, 1); 70 else 71 { 72 int mm=(l+r)/2; 73 update(L, R, l, mm, rt<<1); 74 update(L, R, mm+1, r, rt<<1|1); 75 } 76 77 return ; 78 } 79 int m=(l+r)/2; 80 if(L<=m) 81 update(L, R, l, m, rt*2); 82 if(R>m) 83 update(L, R, m+1, r, rt*2+1); 84 pushup(rt); 85 } 86 public static void main(String[] args) 87 { 88 int t, ca=1; 89 t=in.nextInt(); 90 while((t--)!=0) 91 { 92 n=in.nextInt(); 93 int m=in.nextInt(); 94 build(1, n, 1); 95 System.out.println("Case #" + ca + ":"); 96 ca++; 97 BigInteger ans=li; 98 while((m--)!=0) 99 {100 int l, r;101 l=in.nextInt();102 r=in.nextInt();103 ans=ans.add(query(l, r, 1, n, 1)).mod(mod);104 System.out.println(ans);105 update(l, r, 1, n, 1);106 }107 }108 }109 }View Code
[java線段樹]2015上海邀請賽 D Doom