[ODT]CF 896 C. Willem, Chtholly and Seniorious

题目描述

给出\(n\)个数,支持区间加,区间覆盖,区间第\(k\)小,区间的\(x\)次幂和.数据随机

解题思路

学ODT之前,第四个操作我是维护不来的.

第一次写ODT,ODT在数据随机有区间覆盖操作的情况下有优秀的复杂度.

关键就是用一棵平衡树维护覆盖的区间,其他就是暴力......

#include<cstdio>
#include<set>
#include<algorithm>
#define IT set<jz>::iterator
#define LL long long
using namespace std;
const int maxn=100005,tt=1e9+7;
int sd,n,m,a[maxn],vmax,top;
struct jz{
    int l,r;mutable LL v;
    jz(int l=0,int r=0,LL v=0):l(l),r(r),v(v){}
    bool operator<(const jz &b)const{return l<b.l;}
}b[maxn];
set<jz> st;
int rnd(){int num=sd;sd=((LL)sd*7+13)%tt;return num;}
IT split(int x){
    IT it=st.lower_bound(jz(x,0,0));
    if (it!=st.end()&&it->l==x) return it;it--;
    int l=it->l,r=it->r;LL v=it->v;st.erase(it);
    st.insert(jz(l,x-1,v));return st.insert(jz(x,r,v)).first;
}
void assign(int l,int r,int v){
    IT itr=split(r+1),itl=split(l);
    st.erase(itl,itr);st.insert(jz(l,r,v));
}
void add(int l,int r,int x){
    IT itr=split(r+1),itl=split(l);
    for (IT i=itl;i!=itr;i++) i->v+=x;
}
bool cmp(jz x,jz y){return x.v<y.v;}
LL kth(int l,int r,int k){
    IT itr=split(r+1),itl=split(l);top=0;
    for (IT i=itl;i!=itr;i++) b[++top]=jz(i->l,i->r,i->v);
    sort(b+1,b+1+top,cmp);
    for (int i=1;i<=top;i++) if (k<=b[i].r-b[i].l+1) return b[i].v;else k-=b[i].r-b[i].l+1;
}
int qsm(int w,int b,int tt){int num=1;while(b){if (b&1) num=(LL)num*w%tt;w=(LL)w*w%tt;b>>=1;}return num;}
int work(int l,int r,int x,int y){
    IT itr=split(r+1),itl=split(l);int num=0;
    for (IT i=itl;i!=itr;i++) num=(num+(LL)qsm(i->v%y,x,y)*(i->r-i->l+1)%y)%y;
    return num;
}
int main(){
    freopen("exam.in","r",stdin);
    freopen("exam.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&sd,&vmax);
    for (int i=1;i<=n;i++) a[i]=rnd()%vmax+1,st.insert(jz(i,i,a[i]));
    for (int i=1;i<=m;i++){
        int op=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1,x,y;
        if (l>r) swap(l,r);
        if (op==3) x=rnd()%(r-l+1)+1;else x=rnd()%vmax+1;
        if (op==4) y=rnd()%vmax+1;
        if (op==1) add(l,r,x);
        if (op==2) assign(l,r,x);
        if (op==3) printf("%lld\n",kth(l,r,x));
        if (op==4) printf("%d\n",work(l,r,x,y));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/CHNJZ/p/10421645.html

时间: 2024-11-04 00:46:11

[ODT]CF 896 C. Willem, Chtholly and Seniorious的相关文章

cf896C. Willem, Chtholly and Seniorious(ODT)

题意 题目链接 Sol ODT板子题.就是用set维护连续段的大暴力.. 然鹅我抄的板子本题RE提交AC??.. 具体来说,用50 50 658073485 946088556这个数据测试下面的代码,然后在79行停住,看一下bg和i的值会发生神奇的事情.. 问题已解决,确实是那位博主写错了, 只要把split(l)和split(r + 1)反过来就行了 #include<bits/stdc++.h> #define LL long long #define int long long #def

[Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)

无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机算法) 这里有一个大佬ACDreamer的题解 附上链接https://www.luogu.org/blog/ACdreamer/solution-cf896c 还有一个B站的讲解视频 附上链接https://www.bilibili.com/video/av21651173 我不会用珂朵莉树,但是

CF896C Willem, Chtholly and Seniorious

话说,研究珂学的最好方式是-- 其实珂朵莉树很久之前就看过UESTC的那个介绍了,但是由于太菜,听都听不懂. 现在过来学一学,才发现太暴力太优美了!我爱珂朵莉... 这道题要你弄的4个操作是区间加.区间推平.区间排序后的第\(k\)大值和区间任意幂次和. 比较有难度的就是区间任意幂次和.暴力显然行不通的啊!!! 讲道理,珂朵莉树是我看过的唯一支持维护区间任意幂次和的数据结构. 所以用珂朵莉树来搞一搞? 珂朵莉树的单个节点是这样的: struct Nodes { ll l, r; mutable

CF896C Willem, Chtholly and Seniorious 珂朵莉树

问题描述 CF896C LG-CF896C 题解 我expect就是T飞,从这里跳下去,也不碰和珂朵莉相关的任何东西. 珂朵莉树真好使. 珂朵莉树模板. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #define int long long #define IT set<node>::iterator template <typename Tp> void read(Tp &x){

Solution: 题解 CF896C Willem, Chtholly and Seniorious(线段树解珂朵莉树)

Intro: 珂朵莉树模板题 怎么所有题解都是珂朵莉树啊啊啊啊 于是本蒟蒻决定来一发中(feng)规(kuang)中(luan)矩(gao)的线段树 首先这棵线段树只维护懒标记 来一发定义 线段树节点\(u\)维护区间\([l_u,r_u]\)的内容 懒标记\(t_u\):当\(t_u\not=0\)时表示区间\([l_u,r_u]\)全是\(t_u\),\(t_u=0\)就是没有懒标记 建立线段树 在建立时顺便处理\(l_u,r_u\),只要当\(l_u=r_u\)时就打上标记 P.s \(L

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,