T1

恶心的数学题,还卡空间...

于是考虑数组二次调用,用完memset

记录一手二维前缀和对不同询问离线修改,最后一块回答即可

Code



#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
#define pf printf
namespace EMT{
inline int read(){
int w = 0 ; bool fg = 0 ; char ch = getchar() ;
while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch - '0' ) , ch = getchar() ;
return fg ? -w : w ;
}
const int N=10011;const int mod=1<<30;
std::bitset<4010>gc[4010];int a[4010][4010],b[4010][4010],T;struct node{int n,m,ans;}q[N];
inline void pi(int x){pf("%d",x);}inline void pn(){pf("\n");}
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline short main(){
F(i,1,4000)
F(j,1,4000)
if(gc[j][i]||gcd(i,j)==1)
gc[i][j]=1;
T=read();
F(i,1,T)q[i].n=read(),q[i].m=read();
F(i,1,4000)
F(j,1,4000){
a[i][j]=((0ll+a[i-1][j]+a[i][j-1]-a[i-1][j-1]+(gc[i][j]?i*j:0))%mod+mod)%mod;
b[i][j]=((0ll+b[i-1][j]+b[i][j-1]-b[i-1][j-1]+gc[i][j])%mod+mod)%mod;
}
F(i,1,T)
q[i].ans=((0ll+q[i].ans+a[q[i].n-1][q[i].m-1]%mod-a[q[i].n/2][q[i].m/2]*4%mod)%mod+mod)%mod;
F(i,1,T)
q[i].ans=((0ll+q[i].ans+b[q[i].n-1][q[i].m-1]*q[i].n*q[i].m%mod-b[q[i].n/2][q[i].m/2]*q[i].n*q[i].m%mod)%mod+mod)%mod;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
F(i,1,4000)
F(j,1,4000)
a[i][j]=((0ll+a[i-1][j]+a[i][j-1]-a[i-1][j-1]+(gc[i][j]?i:0))%mod+mod)%mod,
b[i][j]=((0ll+b[i-1][j]+b[i][j-1]-b[i-1][j-1]+(gc[i][j]?j:0))%mod+mod)%mod;
F(i,1,T)
q[i].ans=((0ll+q[i].ans-a[q[i].n-1][q[i].m-1]*q[i].m%mod-b[q[i].n-1][q[i].m-1]*q[i].n%mod)%mod+mod)%mod;
F(i,1,T)
q[i].ans=((0ll+q[i].ans+a[q[i].n/2][q[i].m/2]*2*q[i].m%mod+b[q[i].n/2][q[i].m/2]*2*q[i].n%mod)%mod+mod)%mod;
F(i,1,T)
pi((0ll+q[i].ans*2+q[i].n+q[i].m)%mod),pn();
return 0;
}
}
signed main(){return EMT::main();}

T2

树剖求lca,按照权值大小排序,每次合并权值大的点,6次分别判断哪个端点最优即可。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
inline void db(){pf("debug\n");}
#define int long long
typedef long long ll;//(double)clock() / (double)CLOCKS_PER_SEC;
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*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%lld ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);}//freopen("my.out","w",stdout);}
const int N=1e6+100;
int fa[N],n,co,head[N],l[N],r[N],pre[N],val[N],len[N],ans;struct node{int next,to,w;}e[N<<1];
struct pt{int id,val;}p[N];struct tree{int top,deep,son,fa,size,dfn;}t[N<<1];
inline int find(int x){return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}
inline void add(int x,int y,int z){e[++co].next=head[x],e[co].to=y,e[co].w=z;head[x]=co;}
inline void clean(){
co=0;F(i,1,n)head[i]=pre[i]=0;ans=0;
}
inline void dfs(int x,int f){
t[x].son=-1;t[x].size=1;
for(register int i=head[x],j;i;i=e[i].next){
j=e[i].to;if(j==f)continue;
t[j].deep=t[x].deep+1;t[j].fa=x;
pre[j]=pre[x]+e[i].w;
dfs(j,x);
t[x].size+=t[j].size;
if(t[x].son==-1||t[t[x].son].size<t[j].size)t[x].son=j;
}
}
inline void dfs2(int x,int tp){
t[x].top=tp;
if(t[x].son==-1)return;
dfs2(t[x].son,tp);
for(register int i=head[x];i;i=e[i].next)
if(e[i].to!=t[x].son&&e[i].to!=t[x].fa)
dfs2(e[i].to,e[i].to);
}
inline int getlca(int x,int y){
int tx=t[x].top,ty=t[y].top;
while(tx!=ty){
if(t[tx].deep>=t[ty].deep)x=t[tx].fa;
else y=t[ty].fa;
tx=t[x].top;ty=t[y].top;
}
if(t[x].deep>=t[y].deep)return y;
return x;
}
inline bool cmp(pt a,pt b){return a.val>b.val;}
inline void merge(int x,int y){
int lca,maxn=0,keyl,keyr;
if(maxn<len[x])maxn=len[x],keyl=l[x],keyr=r[x];
if(maxn<len[y])maxn=len[y],keyl=l[y],keyr=r[y];
lca=getlca(l[x],l[y]);if(maxn<pre[l[x]]+pre[l[y]]-2*pre[lca])maxn=pre[l[x]]+pre[l[y]]-2*pre[lca],keyl=l[x],keyr=l[y];
lca=getlca(l[x],r[y]);if(maxn<pre[l[x]]+pre[r[y]]-2*pre[lca])maxn=pre[l[x]]+pre[r[y]]-2*pre[lca],keyl=l[x],keyr=r[y];
lca=getlca(r[x],l[y]);if(maxn<pre[r[x]]+pre[l[y]]-2*pre[lca])maxn=pre[r[x]]+pre[l[y]]-2*pre[lca],keyl=r[x],keyr=l[y];
lca=getlca(r[x],r[y]);if(maxn<pre[r[x]]+pre[r[y]]-2*pre[lca])maxn=pre[r[x]]+pre[r[y]]-2*pre[lca],keyl=r[x],keyr=r[y];
fa[x]=y;l[y]=keyl;r[y]=keyr;len[y]=maxn;
}
inline short main(){
//file();
int T=read();
while(T--){
n=read();
F(i,1,n)fa[i]=i;
F(i,1,n)l[i]=r[i]=i,p[i].id=i,p[i].val=val[i]=read(),len[i]=0;
F(i,1,n-1){
int x=read(),y=read(),z=read();
add(x,y,z);add(y,x,z);
}dfs(1,0);dfs2(1,1);
std::sort(p+1,p+n+1,cmp);
F(i,1,n){
for(register int j=head[p[i].id];j;j=e[j].next){
if(val[e[j].to]>=val[p[i].id]){
int x=find(p[i].id),y=find(e[j].to);
if(x==y)continue;
merge(x,y);ans=max(ans,val[p[i].id]*len[y]);
}
}
}
pi(ans);pn();
clean();
}
return 0;
}
}
signed main(){return EMT::main();}

T3

神仙线段树...

用\(l,r,mid,p\)表示区间最左、最右端的花精位置、中间最长的两边距离、中间最长的两边距离的中点。

分情况讨论的up是真的妙...

Code



#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef long long ll;//(double)clock() / (double)CLOCKS_PER_SEC;
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*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
int n,m;const int N=2e5+100;
struct tree{int l,r,mid,p;}t[N<<2];
inline void up(int p){
int l=p<<1,r=p<<1|1;
if(!t[l].l)t[p]=t[r];
else if(!t[r].l)t[p]=t[l];
else{
t[p].l=t[l].l,t[p].r=t[r].r;
int len1=t[l].mid,len2=t[r].mid;
if(len1>=len2){
t[p].mid=t[l].mid;
t[p].p=t[l].p;
}else t[p].mid=t[r].mid,t[p].p=t[r].p;
int len=t[r].l-t[l].r-1;len=len/2-((len&1)?0:1)+1;
if(len>t[p].mid)t[p].p=t[l].r+len,t[p].mid=len;
else if(len==t[p].mid)t[p].p=min(t[p].p,t[l].r+len);
}
}
inline void change(int p,int l,int r,int opt,int v){
if(l==r){
if(opt)t[p].l=t[p].r=l;
else t[p].l=t[p].r=0;
t[p].mid=t[p].p=0;
return;
}
int mid=(l+r)>>1;
if(v<=mid)change(p<<1,l,mid,opt,v);
else change(p<<1|1,mid+1,r,opt,v);
up(p);
}
int co,plc[1000100];
inline short main(){
n=read(),m=read();
F(i,1,m){
int opt=read(),x=read();
if(opt==1){
if(!co){co++;plc[x]=1;pi(1);pn();change(1,1,n,1,1);continue;}
++co;
int maxn=0,p=0;
if(t[1].l-1>=n-t[1].r)maxn=t[1].l-1,p=1;
else maxn=n-t[1].r,p=n;
if(maxn<t[1].mid){
maxn=t[1].mid;
p=t[1].p;
}
else if(maxn==t[1].mid)
p=min(p,t[1].p);
plc[x]=p;pi(p);pn();
change(1,1,n,1,p);
}else change(1,1,n,0,plc[x]),--co;
}
return 0;
}
}
signed main(){return EMT::main();}

noip模拟15的更多相关文章

  1. Noip模拟15 2021.7.14

    T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...

  2. NOIP模拟 15

    因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...

  3. [NOIP模拟15]题解

    A.建设城市(city) 这容斥题多难啊你们是怎么考场切掉的啊 首先可以想一下,如果没有k的限制,这题怎么做? 相信你们肯定能看出来是挡板法裸题:m个物品分给n个人,每个人至少一个. 就是$C_{m- ...

  4. [考试总结]noip模拟15

    这次不咕了. 首先发现这套题目十分毒瘤, \(T1\) 就没有太大的思路. 结果最后也是暴力收场... 菜. \(T1\;60pts\) 暴力居然还是挺高的,\(T2\) 莽了一个随机化上去结果还是暴 ...

  5. NOIP 模拟 $15\; \rm \text{玫瑰花精}$

    题解 \(by\;zj\varphi\) 一道线段树题目 这道题可以通过维护一棵线段树,线段树上的每个节点维护 \(\rm l,r,len,p\) 分别表示这段区间最左边的花精,最右边的花精,被两只花 ...

  6. NOIP 模拟 $15\; \text{影子}$

    题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...

  7. NOIP 模拟 $15\; \text{夜莺与玫瑰}$

    题解 一道很妙的题,让求对于一个矩阵中,两点相连成线,有多少条直线,他们的交集是有限集. 转化一下题目,发现水平和竖直的只有 \(n+m\) 条,而左斜和右斜的条数是相同的,所以我们只需求出左或右中的 ...

  8. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  9. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

随机推荐

  1. 《快来为你的 .NET 应用加个监控吧!》更新版本啦

    目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metric ...

  2. 从源码角度谈谈MySQL "Too many open files"错误的根本原因

    "Too many open files"是一个比较常见的错误,不仅仅是在 MySQL 中.只要是在 Linux 中启动的进程,都有可能遇到这个错误. 究其原因,是进程打开的文件描 ...

  3. 字符串的模式匹配算法——KMP模式匹配算法

    朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...

  4. Nacos源码分析-Distro协议概览

    温馨提示: 本文内容基于个人学习Nacos 2.0.1版本代码总结而来,因个人理解差异,不保证完全正确.如有理解错误之处欢迎各位拍砖指正,相互学习:转载请注明出处. 什么是Distro协议 今天来分析 ...

  5. 常用js代码积累

    1,js判断进入可视区,参考(亲测不行):https://www.cnblogs.com/Marydon20170307/p/8830069.html 重点学习的话,可参考: js计算元素距离顶部的高 ...

  6. python -- 面向对象编程(类、对象)

    一.类 类是用来描述具有相同的属性和方法的对象的集合. 它定义了该集合中每个对象共同拥有的属性和方法. 类是一个独立的单位,它有一个类名,其内部包括成员变量和成员方法,分别用于描述对象的属性和行为. ...

  7. mysql实现主从复制、读写分离的配置方法(二)

    由于接触主从复制,读写分离的时间比较短,应用还不够熟练,目的是能通过MyCat实现基础的读写分离操作. 其核心功能是分库分表,配合数据库的主从模式还可实现读写分离. 1. 测试环境 一台win10主机 ...

  8. 使用宝塔配置laravel站点时,遇到open_basedir restriction in effect. 原因与解决方法

    今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下: Warning: require(): open_basedir restriction in effect. F ...

  9. 【NOIP2007】Hanoi双塔问题

    题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...

  10. 第3天 IDEA 2021简单设置与优化 Java运算符 包机制

    IDEA 2021简单设置与优化 将工具条显示在上方 View–>Appearance–>Toolbar 鼠标悬停显示 File–>setting–>Editor–>Ge ...