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 有一群好朋友,他们 ...
随机推荐
- [刘阳Java]_easyui-panel组件入门级_第3讲
EasyUI中的panel组件在前面一节中我们简单告诉了大家代码如何写.这一节我们会从panel的入门级开始讲起走,重点包括它的事件监听,属性tool介绍 1. 事件监听-通过data-options ...
- VS Code 与 ESP32 官方SDK配置
开发基于 ESP XXX 微控制器应用,最简单的环境搭建方案是像 MicroPython.CircuitPython.NanoFramework 等,下载固件,直接开刷:或者基于 Arduino 的开 ...
- 如何使用Scala的ClassTag
Scala官方文档中对于ClassTag的定义如下: ClassTag[T]保存着在运行时被JVM擦除的类型T的信息.当我们在运行时想获得被实例化的Array的类型信息的时候,这个特性会比较有用. 下 ...
- 配置软ISCSI存储
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独使用RedHat Enterprise Linux 7搭建软ISCSI的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服 ...
- Bootstrap框架--DataTables列表示例--添加判断
一.参考代码 <%@ include file="./include/header.jsp"%> <!-- jquery.dataTables.css --> ...
- dva的effect那么难用,自己造一个轮子吧
背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...
- 第二十八篇 -- 写一个简陋的WIFI服务器界面
效果图: Dlg.cpp // WIFIWMITestDlg.cpp : implementation file // #include "stdafx.h" #include & ...
- 福利!Python制作动态字符画(附源码)
字符画,一种由字母.标点.汉字或其他字符组成的图画.简单的字符画是利用字符的形状代替图画的线条来构成简单的人物.事物等形象,它一般由人工制作而成:复杂的字符画通常利用占用不同数量像素的字符代替图画上不 ...
- MySQL 到底是如何做到多版本并发的?
之前的文章简单的介绍了 MySQL 的事务隔离级别,它们分别是:读未提交.读已提交.可重复读.串行化.这篇文章我们就来探索一下 MySQL 事务隔离级别的底层原理. 本篇文章针对 InnoDB 存储引 ...
- 单片机学习(二)开发板LED灯的控制
目录 开发板上LED灯相关的电路图 点灯 LED闪烁 LED流水灯 其他效果 灯光二进制计数器 进阶版流水灯 开发板上LED灯相关的电路图 这是P2相关7个引脚的电路图,在默认情况下它是直接接着VCC ...