【2019.9.3】Za

上午:考试

下午:

扫描线学习宣布死亡QAQ 下次再说.......

暂存代码
yyb的#include

include

include

include

include

include

include

include

include

include

using namespace std;

define ll long long

define RG register

define MAX 100005

define lson (now<<1)

define rson (now<<1|1)

struct Node{double x1,x2,y,w;}p[MAX];
bool operator<(Node a,Node b){return a.y double S[MAX];
int top;
int n,tot;
struct SegmentTreeNode
{
double ss;
int ly;
}t[MAX<<3];
void pushup(int now,int l,int r)
{
if(t[now].ly)t[now].ss=S[r+1]-S[l];
else if(l==r)t[now].ss=0;
else t[now].ss=t[lson].ss+t[rson].ss;
}
void Modify(int now,int l,int r,int L,int R,int w)
{
if(L<=l&&r<=R)
{
t[now].ly+=w;
pushup(now,l,r);
return;
}
int mid=(l+r)>>1;
if(L<=mid)Modify(lson,l,mid,L,R,w);
if(R>mid)Modify(rson,mid+1,r,L,R,w);
pushup(now,l,r);
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&n);
tot=top=0;
double x1,x2,y1,y2;
for(int i=1;i<=n;++i)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
p[++tot]=(Node){x1,x2,y1,1};
p[++tot]=(Node){x1,x2,y2,-1};
S[++top]=x1,S[++top]=x2;
}
sort(&S[1],&S[top+1]);
sort(&p[1],&p[tot+1]);
top=unique(&S[1],&S[top+1])-S-1;
ll ans=0;
for(int i=1;i {
int l=lower_bound(&S[1],&S[top+1],p[i].x1)-S;
int r=lower_bound(&S[1],&S[top+1],p[i].x2)-S-1;
if(l<=r)Modify(1,1,top,l,r,p[i].w);
if(i!=tot)ans+=(ll)(p[i+1].y-p[i].y)*t[1].ss;
}
printf("%lld",ans);
return 0;
}

将y坐标离散化 第i段为区间\([raw(i),raw(i+1)]\) \(c[i]\)记录扫描线上第i段被覆盖的次数

unique返回去重后的尾迭代器,是去重之后末尾元素的下一个位置

珂朵莉树(ODT)

使一整段区间内的东西变得一样,数据随机。

定义节点

表示区间\([l,r]\)全是数v

struct node{
    int l,r,;
    mutable ll v;
    node{int L,int R=-1,ll V=0}:l(L),r(R),v(V){}
    bool operator<(const node&X)const{return l
#define iter set::iterator
iter split(int pos){
    iter it=s.lower_bound(node(pos));
    
}

\(QAQ\)我又写炸了一个新知识的!!! 今天不宜学习新东西啊啊啊啊啊啊啊啊啊啊啊啊

蜜汁CE
#include
    
     
using namespace std;
#define ll long long
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
#define Abs(x) ((x)<0?-(x):(x))
#define ls (o<<1)
#define rs (o<<1|1)
const int N=1e5+5,M=100+5,inf=0x3f3f3f3f;
int n,m;
ll seed,mx,a[N];
struct node{
    int l,r;
    mutable ll k;
    node(int L,int R=-1,ll K=0):l(L),r(R),k(K){}
    bool operator<(const node&X)const{return l
     
      ::iterator
set
      
       s;
iter split(int pos){
    iter it=s.lower_bound(node(pos));
    if(it!=s.end()&&it->l==pos) return it;
    --it;
    int l=it->l,r=it->r;ll k=it->k;
    s.erase(it),s.insert(node(l,pos-1,k));
    return s.insert(node(pos,r,k)).first;
}
void assign_val(int l,int r,ll k){
    iter itl=split(l),itr=split(r+1);
    s.erase(itl,itr),s.insert(node(l,r,k));
}
void add(int l,int r,ll k){
    iter itl=split(l),itr=split(r+1);
    for(;itl!=itr;++itl) itl->k+=k;
}
typedef pair
       
        pii;
ll ranks(int l,int r,int k){
    vector
        
         v; iter itl=split(l),itr=split(r+1); for(;itl!=itr;++itl) v.push_back(make_pair(itl->k,itl->r-itl->l+1)); sort(v.begin(),v.end()); for(vector
         
          ::iterator it=v.begin();it!=v.end();++it){ k-=it->second; if(k<=0) return it->first; } } ll qpow(ll a,ll b,ll P){ ll res=1;a%=P; while(b){ if(b&1) res=(res*a)%P; a=(a*a)%P,b>>=1; } return res; } ll sum(int l,int r,int x,int P){ iter itl=split(l),itr=split(r+1); ll res=0; for(;itl!=itr;++itl) res=(res+(ll)(itl->r-itl->l+1)*qpow(itl->k,(ll)x,(ll)P))%P; return res; } ll rd(){ ll ret = seed; seed=(seed*7+13)%((int)1e9+7); return ret; } int main(){ freopen("in.txt","r",stdin); scanf("%d%d%lld%lld",&n,&m,&seed,&mx); for(int i=1;i<=n;++i) a[i]=(rd()%mx)+1,s.insert(node(i,i,a[i])); s.insert(node(n+1,n+1,0)); for(int i=1,opt,l,r,x,y;i<=m;++i){ opt=(rd()%4)+1,l=(rd()%n)+1,r=(rd()%n)+1; if(l>r) swap(l,r) ; if(opt==3) x=(rd()%(r-l+1))+1; else x=(rd()%mx)+1; if(opt==4) y=(rd()%mx)+1; if(opt==1) add(l,r,x); else if(opt==2) assign_val(l,r,x); else if(opt==3) printf("%lld\n",ranks(l,r,x)); else printf("%lld\n",sum(l,r,x,y)); } return 0; }
         
        
       
      
     
    

临时开一个数组 利用new关键字来实现

临时申明一个大小为size的数组Type *name=new Type[size]

使用完动态数组后将其销毁 delete [] name

==只是这些都是指针来实现 看着有点淡淡的忧伤

链表 - 插入

首先将节点p的nxt指向插入之后的下一个节点 然后再将前一个节点的nxt指向p

p->nxt=q->nxt;      q->nxt=p;

链表 - 删除

直接将要删除的前一个节点的nxt指向待删节点的nxt即可p->nxt=p->nxt->nxt

双向链表

不仅记录当前元素的下一个元素nxt 还有当前元素的上一个元素prev

结构体:
struct list{
    type date;
    list * prev,* nxt;
}
插入
p->nxt=q->nxt,p->prev=q;
q->nxt->prev=p,q->nxt=p;
删除:
p->nxt=p->nxt->nxt,p->nxt->prev=p;

时间复杂度==咕咕咕咕见笔记本吧

你可能感兴趣的:(【2019.9.3】Za)