Description

 Solution

T1 island

考虑把问题成两部分计算

  1. 纵坐标的距离和很好计算,在输入的同时一次计算了就完事

  2. 横坐标又分成两部分

    • 分别在\(y\)轴不同侧的矩形的距离和同样也比较好算,因为不会回头

    • 然后是在\(y\)轴同侧的矩形,我们以右侧的为例,左侧同理

      第一步,把两个点之间横坐标的移动距离分解成\(r_x+r_y-2r_k\),\(r_k\)就是最大的能“回头”的横坐标

      第二步,我们直接计算出\(r_x+r_y\)部分的和

      第三步

      减去\(r_k\)相当于在每个\(\leq r_k\)的位置减\(1\)

      相当于从右往左扫,每次加上当前扫描线右边部分的相互联通的点对数

      我们可以用并查集维护当前的联通情况

      一个联通集合在两次进行合并的中间的联通性是不变的

      也就是他在中间每个位置的点对数量是个二次函数,对它求和,利用小学奥数

      \[\sum_{i=1}^{n} i^2 =\frac{n(n+1)(2n+1)}{6}
      \]

      就可以求出一个公式啦

      每次在合并前,进行一次计算即可

      好难写啊......

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define int ll
#define reg register
const int MN=1e6+5,mod=998244353,inv2=499122177,inv6=166374059;
int n,l[MN],r[MN];
int n_l,n_r,l_r,N,Le,ans,dec;
int c1(int x){return 1ll*x*x%mod;}
int c2(int x){return 1ll*x*(x+1)%mod*(2ll*x%mod+1)%mod*inv6%mod;}
int c3(int a1,int an,int n_){return 1ll*n_*(a1+an)%mod*inv2%mod;}
int fa[MN],id[MN],Nm[MN],d[MN];
bool cmp1(int x,int y){return l[x]<l[y];}
bool cmp2(int x,int y){return r[x]<r[y];}
int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
void union_(int x,int y){fa[x]=y;d[y]+=d[x];(Nm[y]+=Nm[x])%=mod;}
void Calc(int x,int k)
{
dec=(dec+1ll*c1(Nm[x])*k%mod+1ll*c3(2,2*k,k)*d[x]%mod*Nm[x]%mod+1ll*c2(k)*c1(d[x])%mod)%mod;
(Nm[x]+=1ll*d[x]*k)%=mod;
}
void calc(int *a)
{
memset(fa,0,sizeof fa);
memset(Nm,0,sizeof Nm);
memset(d,0,sizeof d);
id[0]=a[0]=0;
reg int xx;
for(reg int i=n;~i;--i)
{
fa[id[i]]=id[i];d[id[i]]=1;
if(id[i]>1&&fa[id[i]-1]) xx=getf(id[i]-1),Calc(xx,a[xx]-a[id[i]]),union_(xx,id[i]);
if(id[i]<n&&fa[id[i]+1]) xx=getf(id[i]+1),Calc(xx,a[xx]-a[id[i]]),union_(xx,id[i]);
}
/*
if(a[i]==a[i-1]) ++d;
else
{
++d;k=a[i]-a[i-1];
dec=(dec+1ll*c1(Nm)*k%mod+1ll*c3(2,2*k,k)*d%mod*Nm%mod+1ll*c2(k)*c1(d)%mod)%mod;
Nm+=1ll*d*k%mod;
}
*/
}
signed main()
{
char sss[10];
n=read();scanf("%s",sss);
reg int i;
for(i=1;i<=n;++i)
{
l[i]=-read(),r[i]=read();
l_r=(l_r+1ll*(r[i]+1)*(r[i])%mod*inv2%mod)%mod;
n_l=(n_l+l[i])%mod;
n_r=(n_r+r[i])%mod;
ans=(ans+2ll*(l[i]+r[i])*(Le+(mod-1ll*(n-i+1)*N%mod)%mod)%mod)%mod;
N=(N+r[i]+l[i])%mod;
Le=(Le+1ll*(r[i]+l[i])*(n-i+1)%mod)%mod;
}
for(i=1;i<=n;++i) ans=(ans+(l_r*2%mod+(l[i]-1)*n_r%mod)*l[i]%mod)%mod;
for(i=1;i<=n;++i) ans=(ans+2ll*c3(1,l[i],l[i])*n_l%mod)%mod;
for(i=1;i<=n;++i) ans=(ans+2ll*c3(1,r[i],r[i])*n_r%mod)%mod;
for(i=1;i<=n;++i) id[i]=i;
std::sort(id+1,id+n+1,cmp1);
calc(l);
for(i=1;i<=n;++i) id[i]=i;
std::sort(id+1,id+n+1,cmp2);
calc(r);
dec=2ll*dec%mod;
ans=(ans+mod-dec)%mod;
printf("%lld\n",ans);
return 0;
}

T2 river

水题。

每个时间都能找到最早的转移时间,然后一定成环,把环找出来直接算就行了

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define reg register
const int MN=1e6;
int n,m,a[MN<<1],b[MN<<1];
struct Node{int val,id;}d;
bool vis[MN];
int que[MN],pos[MN],tt,len[MN];
ll ans;
int main()
{
n=read()+1;m=read();
reg int i;
for(i=0;i<m;++i) a[i]=a[i+m]=read();
b[m*2-1]=a[m*2-1];d=(Node){m*2-1+b[m*2-1],m*2-1};
for(i=m*2-2;~i;--i)
{
b[i]=min(a[i],b[d.id]+d.id-i);
if(i+b[i]<d.val) d=(Node){i+b[i],i};
}
for(i=0;!vis[i];)
{
vis[i]=true;
que[++tt]=i;
len[tt]=len[tt-1]+b[i];
pos[i]=tt;
i=(i+b[i])%m;
}
int _r=tt-pos[i]+1,pre=pos[i]-1,len_r=len[tt]-len[pos[i]-1];
if(n>=pre) ans+=len[pre],n-=pre+1;
ans+=1ll*len_r*(n/_r);n=n%_r+pre;
ans+=len[n]-len[pre];
printf("%lld\n",ans);
return 0;
}

T3 cac

建出圆方树,每次修改操作可以看成是对路径上的方点\(+val\)

如果\(lca\)是方点,则它的fa的圆点\(+val\)

否则\(lca\)的权值\(+val\)

最后的每个点答案应该是他父亲方点的值和自己的权值之和

树链剖分+树状数组

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define reg register
#define int ll
const int MN=3e5+5,mod=998244353;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();x%=mod;}
return x*f;
}
int N,M,K;
struct edge{int to,nex;}e[MN<<3],E[MN<<2];
int hr[MN],Hr[MN<<1],en,En;
bool sq[MN<<1];
inline void ins(int f,int t,int *h,edge *ed,int &end)
{
ed[++end]=(edge){t,h[f]};h[f]=end;
ed[++end]=(edge){f,h[t]};h[t]=end;
}
int ind,dfn[MN],low[MN],st[MN],Tp,num;
void tj(int x)
{
dfn[x]=low[x]=++ind;st[Tp++]=x;reg int i;
for(i=hr[x];i;i=e[i].nex)
{
if(!dfn[e[i].to])
{
tj(e[i].to);low[x]=min(low[x],low[e[i].to]);
if(low[e[i].to]==dfn[x])
for(sq[++num]=true,Hr[num]=0,ins(num,x,Hr,E,En);st[Tp]!=e[i].to;--Tp)ins(num,st[Tp-1],Hr,E,En);
}
else low[x]=min(low[x],dfn[e[i].to]);
}
}
int dind,L[MN<<1],siz[MN<<1],mx[MN<<1],top[MN<<1],fa[MN<<1],dep[MN<<1];
void dfs1(int x,int f)
{
fa[x]=f;siz[x]=1;dep[x]=dep[f]+1;
reg int i;
for(i=Hr[x];i;i=E[i].nex)if(E[i].to^f)
dfs1(E[i].to,x),siz[x]+=siz[E[i].to],siz[E[i].to]>siz[mx[x]]?mx[x]=E[i].to:0;
}
void dfs2(int x,int tp)
{
top[x]=tp;L[x]=++dind;
if(mx[x]) dfs2(mx[x],tp);reg int i;
for(i=Hr[x];i;i=E[i].nex)if((E[i].to^fa[x])&&(E[i].to^mx[x])) dfs2(E[i].to,E[i].to);
}
class _Tr
{
int T[MN<<1];
void C(int x,int y){for(;x<=6e5;x+=(x&(-x))) T[x]+=y,T[x]%=mod;}
int G(int x){int r=0;for(;x;x-=(x&(-x)))r+=T[x],r%=mod;return r;}
public:
void Md(int l,int r,int y){C(l,y);C(r+1,(mod-y)%mod);}
int Get(int x){return G(x);}
}T;
int val[MN<<1];
inline void Md(int x,int y,int ad)
{
for(;top[x]^top[y];)
{
if(dep[top[x]]>dep[top[y]])
{
T.Md(L[top[x]],L[x],ad);
x=fa[top[x]];
}
else
{
T.Md(L[top[y]],L[y],ad);
y=fa[top[y]];
}
}
if(dep[x]>dep[y]) std::swap(x,y);
T.Md(L[x],L[y],ad);
if(sq[x]&&fa[x]) val[fa[x]]+=ad,val[fa[x]]%=mod;
if(!sq[x]) val[x]+=ad;
}
int Query(int x)
{
int r=val[x];
if(fa[x]) r+=T.Get(L[fa[x]]);
r%=mod;
return r;
}
signed main()
{
num=N=read();M=read();K=read();
reg int opt,x,y,i;
for(i=1;i<=M;++i) x=read(),ins(x,read(),hr,e,en);
tj(1);dfs1(1,0);dfs2(1,1);
while(K--)
{
opt=read();x=read();
if(opt==0) y=read(),Md(x,y,read()%mod);
if(opt==1) printf("%d\n",Query(x));
}
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FCS省选模拟赛 Day7的更多相关文章

  1. FCS省选模拟赛 Day1

    Description  Solution T1 shopping 目测是插板法乱搞一下 发现题解写的是容斥dp: \[ ans = \sum_i (-1)^ig[i] \] \(g[i]\)表示的有 ...

  2. FCS省选模拟赛 Day3

    Description  Solution T1 game 咕咕咕 T2 string fail树各个节点的深度之和怎么求? 我们考虑每个前缀的深度是什么 发现这个值就相当于有多少个前缀等于它的后缀 ...

  3. FCS省选模拟赛 Day4

    传送门 Solution Code  /* 斯坦纳树:O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度 15:15~16:20 原题:bzoj_4774 */ #include ...

  4. FCS省选模拟赛 Day5

    传送门 Solution Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?( ...

  5. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  6. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  7. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  8. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  9. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

随机推荐

  1. Mycat分布式数据库架构解决方案--rule.xml详解

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文件 ...

  2. Widget Size and Position !!!!!!!!!!!!!!!!!!

    https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407 I have read many ques ...

  3. 5G能带来什么改变-从鸿蒙OS说起

    背景 从5G投票事件开始,开始关注5G.许多文章都说到5G的特点有速度快.时延低,其中,时延低是最重要的特点.然而,时延低能给社会带来什么改变呢? 2G是短信的时代,3G促成了语音视频,4G促成了短视 ...

  4. 如何导出ane所需的swc

    来源:http://blog.sina.com.cn/s/blog_6471e1bb01012ard.html 打包.ane文件的时候需要用到ActionScript的扩展库(swc文件),那么如何生 ...

  5. static关键字的作用(修饰类、方法、变量、静态块)

    1. static修饰的类只能为内部类,普通类无法用static关键字修饰.static修饰的内部类相当于一个普通的类,访问方式为(new 外部类名.内部类的方法() ).如下所示: public c ...

  6. ansible之基础篇(一)

    ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...

  7. Python itchat模块的使用,利用图灵机器人进行微信消息自动回复

    一.下载安装itchat模块 二.小实验:获取微信好友头像信息 这需要用itchat模块中的一个方法 itchat.get_friends()#获取微信所有微信好友信息 现在我们导入itchat,打印 ...

  8. 使用Cloudera Manager搭建Impala环境

    使用Cloudera Manager搭建Impala服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用CM安装Imapala 1>.进入CM的服务安装向导 2> ...

  9. css详解1

    1.css的三种引入方式: 1.1.行内引入 <div style="color:red;">魔降风云变</div> <html> <he ...

  10. Mac下iTerm2配置lrzsz功能

    Mac下iTerm2配置lrzsz功能 rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 优点就是不用再开一个sftp工具登录上去上传下载文件. 近期在mac上通 ...