福建省冬令营 Day2 T2



题解:

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cstdio>
  6 #include<cmath>
  7 using namespace std;
  8 typedef long long lol;
  9 const lol mo = 1e9 + 7;
 10 const int me = 200233;
 11 struct shape
 12 {
 13     int e, o, se, so, si;
 14 };
 15 shape tr[me << 3];
 16 inline shape operator + (shape a, const shape &b)
 17 {
 18     if(a.si & 1)
 19     {
 20         a.o = a.o + b.e, a.e = a.e + b.o;
 21         a.so = a.so + b.se, a.se = a.se + b.so;
 22     }
 23     else
 24     {
 25         a.o = a.o + b.o, a.e = a.e + b.e;
 26         a.so = a.so + b.so, a.se = a.se + b.se;
 27     }
 28     a.si += b.si;
 29     if(a.o >= mo) a.o -= mo;
 30     if(a.e >= mo) a.e -= mo;
 31     if(a.so >= mo) a.so -= mo;
 32     if(a.se >= mo) a.se -= mo;
 33     if(a.si >= mo) a.si -= mo;
 34     return a;
 35 }
 36 inline lol Pow(lol x, lol y)
 37 {
 38     lol sum = 1;
 39     while(y)
 40     {
 41         if(y & 1) sum = (sum * x) % mo;
 42         x = (x * x) % mo;
 43         y >>= 1;
 44     }
 45     return sum;
 46 }
 47 void Ins(const int &k, const int &l, const int &r, const int &x, const int &y)
 48 {
 49     if(l == r && r == x)
 50     {
 51         tr[k].si = 1;
 52         tr[k].so = y;
 53         tr[k].o = y * r % mo;
 54         return;
 55     }
 56     int mi = l + r >> 1;
 57     int lc = k << 1, rc = k << 1 | 1;
 58     if(x <= mi) Ins(lc, l, mi, x, y);
 59     else Ins(rc, mi + 1, r, x, y);
 60     tr[k] = tr[lc] + tr[rc];
 61 }
 62 shape Ask(const int &k, const int &l, const int &r, const int &x, const int &y)
 63 {
 64     if(x > y) return (shape) {0, 0, 0, 0, 0};
 65     if(x <= l && r <= y) return tr[k];
 66     int mi = l + r >> 1;
 67     if(mi >= y) return Ask(k << 1, l, mi, x, y);
 68     if(mi < x) return Ask(k << 1 | 1, mi + 1, r, x, y);
 69     return Ask(k << 1, l, mi, x, y) + Ask(k << 1 | 1, mi + 1, r, x, y);
 70 }
 71 lol two;
 72 inline lol Exp(lol a, lol b)
 73 {
 74     --a, --b;
 75     return (a + b) % mo * ((b - a + 1) % mo) % mo * two % mo;
 76 }
 77 int m, n;
 78 int flag;
 79 lol x, y;
 80 lol cl, cr, nl, nr;
 81 inline void Solve(const shape &l, const shape &r, const shape &all)
 82 {
 83     int len = (cr - cl - 1) % mo;
 84     lol sum = (l.so + r.so + (lol) all.so * len % mo) % mo;
 85     lol ans = 0;
 86     ans = (ans + l.o + (cl - 1) % mo * l.so % mo * n % mo) % mo;
 87     ans = (ans + r.o + (cr - 1) % mo * r.so % mo * n % mo) % mo;
 88     ans = (ans + (lol) all.o * len % mo + all.so * Exp(cl + 1, cr - 1) % mo * n % mo ) % mo;
 89     printf("%lld\n", ((sum * (y % mo + 1) % mo - ans) % mo + mo) % mo);
 90 }
 91 char s[me];
 92 int main()
 93 {
 94     two = Pow(2, mo - 2);
 95     scanf("%d%s", &m, s);
 96     n = m << 1;
 97     for(int i = 1; i <= m; ++i) Ins(1, 1, n, i, s[i - 1] - ‘0‘);
 98     for(int i = 1; i <= m; ++i) Ins(1, 1, n, i + m, s[i - 1] - ‘0‘);
 99     int q;
100     scanf("%d", &q);
101     while(q--)
102     {
103         scanf("%d%lld%lld", &flag, &x, &y);
104         if(flag > 1)
105         {
106             cl = (x - 1) / n + 1, cr = (y - 1) / n + 1;
107             nl = (x - 1) % n + 1, nr = (y - 1) % n + 1;
108             if(cl == cr)
109             {
110                 shape c = Ask(1, 1, n, x, y);
111                 lol cc = (c.o + (cl - 1) % mo * c.so % mo * n % mo) % mo;
112                 printf("%lld\n", ((c.so * (y % mo + 1) % mo - cc) % mo + mo) % mo);
113             }
114             else
115             {
116                 shape l = Ask(1, 1, n, nl, n);
117                 shape r = Ask(1, 1, n, 1 + ((x & 1) ^ 1), nr);
118                 shape all = Ask(1, 1, n, 1 + ((x & 1) ^ 1), n);
119                 Solve(l, r, all);
120             }
121         }
122         else
123         {
124             Ins(1, 1, n, x, y);
125             Ins(1, 1, n, x + m, y);
126         }
127     }
128 }
时间: 2024-12-09 21:43:56

福建省冬令营 Day2 T2的相关文章

福建省冬令营 Day2 T1

题解: 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 inline void Scan(int &x) 9 { 10 char c; 11 while((c = getchar()) &

【BZOJ 4517】【SDOI 2016】Round1 Day2 T2 排列计数

本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看这道题,想到暴力算$组合数×错排$,我记得有一天晚上$Snayvals$问过我错排公式怎么推,但我并没有在意!!!幸亏我知道错排可以线性推出来,便开始用笔推错排公式.推了$30min$发现有计算机为什么不用!!!便打了一个表,很快就找出了规律$f[i]=(f[i-1]*f[i-2])*(i-1)$

2015 NOIP day2 t2 信息传递 tarjan

信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Description 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里 获

bzoj1854: [Scoi2010]游戏(匈牙利) / GDKOI Day2 T2(最大流)

题目大意:有n(<=1000000)个装备,每个装备有两个属性值(<=10000),每个装备只能用一次,使用某一个值,攻击boss必须先使用属性为1的,再使用属性为2的,再使用属性为3的,以此类推······问最多攻击多少次. 每个武器和他的两个属性值连边,跑匈牙利. 学会了新的技巧,可以省掉1w个memset(这题是真·1w个 2333333). 代码如下: #include<iostream> #include<cstdlib> #include<cstrin

FJ省队集训DAY2 T2

思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序,此时线段树的作用就来了,每次到一个询问的教室点,我们就在线段树里面查找之前的概率,统计贡献即可. 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #

【NOIP之旅】NOIP2014 day2 T2 寻找道路

2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点连通. 2.在满足条件1的情况下使路径最短. 注意:图G中可能存在重边和自环,题目保证终点没有出边. 请你输出符合条件的路径的长度. [输入] 输入文件名为road.in. 第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边. 接下来的m行每行2个整数x.y,之间

福建省冬令营 Day3 T1 geronimo geronimo

题解: 将轮换拆解成置换,答案即为置换大小的最小公倍数 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 inline int Get() 9 { 10 int x = 0; 11 char c =

[冬令营Day1 T2]sequence

题目描述 Description 给一个长度为N的序列以及Q的询问,每次两个参数l,r,问你序列[l,r]中的最大连续和 输入描述 Input Description 一行二个正整数N,Q. 接下来一行N个整数,描述序列A. 接下来Q行,每行两个参数L,R,描述一个询问. 输出描述 Output Description 对于每个询问,输出一行一个整数,描述答案. 样例输入 Sample Input 4 31 -2 3 21 41 22 2 样例输出 Sample Output 5 1 0 数据范

NOIP 2014 Day2 T2 寻找道路

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<queue> 5 #include<stack> 6 #include<vector> 7 #include<algorithm> 8 #include<string> 9 #include<cstring> 10 #include<iomanip>