noip模拟15
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的更多相关文章
- Noip模拟15 2021.7.14
T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...
- NOIP模拟 15
因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...
- [NOIP模拟15]题解
A.建设城市(city) 这容斥题多难啊你们是怎么考场切掉的啊 首先可以想一下,如果没有k的限制,这题怎么做? 相信你们肯定能看出来是挡板法裸题:m个物品分给n个人,每个人至少一个. 就是$C_{m- ...
- [考试总结]noip模拟15
这次不咕了. 首先发现这套题目十分毒瘤, \(T1\) 就没有太大的思路. 结果最后也是暴力收场... 菜. \(T1\;60pts\) 暴力居然还是挺高的,\(T2\) 莽了一个随机化上去结果还是暴 ...
- NOIP 模拟 $15\; \rm \text{玫瑰花精}$
题解 \(by\;zj\varphi\) 一道线段树题目 这道题可以通过维护一棵线段树,线段树上的每个节点维护 \(\rm l,r,len,p\) 分别表示这段区间最左边的花精,最右边的花精,被两只花 ...
- NOIP 模拟 $15\; \text{影子}$
题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...
- NOIP 模拟 $15\; \text{夜莺与玫瑰}$
题解 一道很妙的题,让求对于一个矩阵中,两点相连成线,有多少条直线,他们的交集是有限集. 转化一下题目,发现水平和竖直的只有 \(n+m\) 条,而左斜和右斜的条数是相同的,所以我们只需求出左或右中的 ...
- HZOJ 20190818 NOIP模拟24题解
T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...
- NOIP模拟 17.8.15
NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...
随机推荐
- hugo + nginx 搭建博客记录
作为一个萌新Gopher,经常逛网站能看到那种极简的博客,引入眼帘的不是花里胡哨的图片和样式,而是黑白搭配,简简单单的文章标题,这种风格很吸引我.正好看到煎鱼佬也在用这种风格的博客,于是卸载了我的wo ...
- git常用命令自己梳理总结
一.新建代码库 # git-init - 创建一个空的 Git 存储库或重新初始化一个现有的存储库 $ git init # 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一 ...
- 《快来为你的 .NET 应用加个监控吧!》更新版本啦
目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metric ...
- robotframework - database操作(增删改查)
1.前置配置条件准备 a.mysql环境配置ok b.robot环境配置ok c.pip 安装robotframework-databaselibrary 2.mysql数据操作 -->以操作 ...
- python3执行.sql文件
这个脚本主要是遍历执行文件夹下的sql文件,但是没有辨别文件的格式,所以文件夹下只能够放.sql文件,否则会报错哈. 我的sql文件夹与执行的文件平级,所以dir_path就是sql,大家依照自己的路 ...
- 手写一个超简单的Vue
基本结构 这里我根据自己的理解模仿了Vue的单文件写法,通过给Vue.createApp传入参数再挂载元素来实现页面与数据的互动. 其中理解不免有错,希望大佬轻喷. 收集数据 这里将Vue.creat ...
- [NOIp2017]宝藏 题解
非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...
- odoo12学习之javascript
本文来源:https://www.jianshu.com/p/1a47fac01077 Odoo12 Javascript 参考指南 本文介绍了odoo javascript框架.从代码行的角度来 ...
- 手写RPC
服务端代码 package com.peiyu.rpcs.bios; import java.io.IOException; public interface IRpcServers { void s ...
- 🔥 LeetCode 热题 HOT 100(31-40)
75. 颜色分类 思路:将 2 往后放,0 往前放,剩余的1自然就放好了. 使用双指针:left.right 分别指向待插入的 0 和 2 的位置,初始 left 指向数组头,right 指向数组尾部 ...